node_modules中的aws lambda层共享库功能不可用

ces*_*hon 7 aws-lambda

我最近更改了lambda函数,以使用新的aws Lambda Layer功能来共享所有的node_modules文件夹。我使用以下结构创建了zip文件:

nodejs/node_modules/<libraries, like 'async' and others..>
nodejs/package.json
Run Code Online (Sandbox Code Playgroud)

我也将lambda函数链接到该层,并且成功了(在CLI和Web控制台中都进行了检查),请参见下面的输出。

in lambda: require('async')

output: "errorMessage":"Cannot find module 'async'"
Run Code Online (Sandbox Code Playgroud)

update-function调用的输出:

aws lambda update-function-configuration --function-name MY_LAMBDA --layers arn:aws:lambda:us-west-2:MY_ID:layer:MY_LAYER:4
{
"Layers": [
{
"CodeSize": 21482560,
"Arn": "arn:aws:lambda:us-west-2:MY_ID:layer:MY_LAYER:4"
}
],
"FunctionName": "MY_LAMBDA",
"LastModified": "2018-12-18T23:44:34.062+0000",
"RevisionId": "f55a6ab7-7b0b-494a-840c-87fb8371a117",
"MemorySize": 128,
"Version": "$LATEST",
"Role": "arn:aws:iam::MY_ID:role/service-role/MY_ROLE",
"Timeout": 30,
"Runtime": "nodejs4.3",
"TracingConfig": {
"Mode": "PassThrough"
},
"CodeSha256": "hajYdqb+...=",
"Description": "",
"VpcConfig": { ... lot of stuff here .. },
"CodeSize": 429123,
"FunctionArn": "arn:aws:lambda:MY_ZONE:MY_ID:function:MY_LAMBDA",
"Handler": "MY_HANDLER"
}
Run Code Online (Sandbox Code Playgroud)

注意:1.我的图层在版本4中。2.我将该图层设置为所有三个node.js环境的支持。3.我检查了zip,它具有预期的所有node_modules内容。

任何关于其他检查内容的建议都欢迎!

小智 6

我也一直陷在这个问题中,无法解决问题,因为我已经应用了所有提及的内容,例如权限和节点zip,但是使用const lodash = require('/ opt / nodejs / node_modules / lodash')对我有用。


Mat*_*ttC 6

我也遇到了这个问题。结果你需要确保你的 zip 文件设置正确,使用“nodejs”作为文件夹名称。如果您仅使用 package.json 创建一个名为“nodejs”的文件夹,运行 npm install,然后将其压缩,那么您可以正常使用“require”。

就我而言,我使用 NPM 包 axios、aws-sdk 和 http。这是我采取的步骤:

  • 创建一个“nodejs”目录
  • 将 package.json 文件复制到其中
  • 在nodejs目录中运行npm install
  • 从上一层开始,压缩目录。在 Mac 上:zip nodejs.zip nodejs/ -r
  • 在 AWS 中创建一个层,导入 zip,并为该层提供 Node.js 运行时
  • 将图层添加到您的 lambda

现在我可以正常使用我的 require 语句了。

const axios = require('axios')
const AWS = require('aws-sdk');
const http = require('http');
Run Code Online (Sandbox Code Playgroud)

另请注意,“基本设置”下的 lambda 角色应具有 lambda 权限。例如,如果您的角色附加了 AWSLambdaFullAccess 策略,或者具有正确 lambda 权限(如“lambda:*”)的其他策略,那么就可以了。


Che*_*iya 5

您可以正确创建图层及其版本,也可以毫无问题地检索有关它们的信息。

即使在Lambda函数无法使用图层中的库之后,Lambda函数看起来也无法访问图层,因为它没有权限。

您可以通过检查与Lambda关联的角色是否附加了任何允许lambda:GetLayerVersion权限的策略来确认这一点。

如果不是,则需要使用以下JSON和一些有意义的名称来创建新策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:GetLayerVersion",
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在,您需要将此策略附加到arn:aws:iam::MY_ID:role/service-role/MY_ROLE与Lambda函数关联的角色上。

可以从AWS控制台执行上述两项操作。

完成此操作后,Lambda函数将具有获取图层版本的权限,并且应该能够从图层访问库。

希望这可以帮助您解决问题。随时询问您是否需要任何澄清。