我最近更改了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')对我有用。
我也遇到了这个问题。结果你需要确保你的 zip 文件设置正确,使用“nodejs”作为文件夹名称。如果您仅使用 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');
Run Code Online (Sandbox Code Playgroud)
另请注意,“基本设置”下的 lambda 角色应具有 lambda 权限。例如,如果您的角色附加了 AWSLambdaFullAccess 策略,或者具有正确 lambda 权限(如“lambda:*”)的其他策略,那么就可以了。
您可以正确创建图层及其版本,也可以毫无问题地检索有关它们的信息。
即使在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函数将具有获取图层版本的权限,并且应该能够从图层访问库。
希望这可以帮助您解决问题。随时询问您是否需要任何澄清。
| 归档时间: |
|
| 查看次数: |
1202 次 |
| 最近记录: |