我最近更改了lambda函数,以使用新的aws Lambda Layer功能来共享所有的node_modules文件夹。我创建的zip具有以下结构:
nodejs/node_modules/<libraries, like 'async' and others..>
nodejs/package.json
我还将lambda函数链接到该层,并且该函数成功(在CLI和Web控制台中均已检查),请参见下面的输出。 但无论如何,lambda函数始终会在需要时失败:
in lambda: require('async')
output: "errorMessage":"Cannot find module 'async'"
更新功能调用的输出:
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"
}
注释: 1.我的图层在版本4中。 2.我将层设置为所有三个node.js环境以提供支持。 3.我检查了zip,它具有预期的所有node_modules内容。
欢迎您提出任何其他检查建议!
答案 0 :(得分:6)
我也一直陷在这个问题中,无法解决问题,因为我已经应用了所有提到的东西,例如权限和节点zip,但是在使用了一段时间后并没有成功 const lodash = require('/ opt / nodejs / node_modules / lodash') 这个对我有用。
答案 1 :(得分:1)
您可以正确创建图层及其版本,还可以毫无问题地检索有关图层的信息。
即使在Lambda函数无法使用图层中的库之后,Lambda函数似乎也无法访问图层,因为它没有权限。
您可以通过检查与Lambda关联的角色是否附加了任何允许lambda:GetLayerVersion
权限的策略来确认这一点。
如果不是,则需要使用以下JSON和一些有意义的名称来创建新策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:GetLayerVersion",
"Resource": "*"
}
]
}
现在,您需要将此策略附加到与Lambda函数关联的角色arn:aws:iam::MY_ID:role/service-role/MY_ROLE
。
以上两项操作均可在AWS控制台中执行。
完成此操作后,Lambda函数将有权获取图层版本,并且应该能够从图层访问库。
我希望这可以帮助您解决问题。随时询问您是否需要任何澄清。
答案 2 :(得分:1)
我也有这个问题。事实证明,您需要确保使用“ nodejs”作为文件夹名称正确设置了zip文件。如果仅使用package.json创建一个名为“ nodejs”的文件夹,运行npm install,然后将其压缩,则可以正常使用“ require”。
就我而言,我正在使用NPM软件包axios,aws-sdk和http。这是我采取的步骤:
zip nodejs.zip nodejs/ -r
现在我可以正常使用我的require语句了。
const axios = require('axios')
const AWS = require('aws-sdk');
const http = require('http');
还要注意,您的lambda角色在“基本设置”下应具有lambda权限。例如,如果您的角色附加了AWSLambdaFullAccess策略,或者具有正确的lambda权限的另一个策略(例如“ lambda:*”),那么您就可以了。