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

时间:2018-12-19 00:12:16

标签: aws-lambda

我最近更改了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内容。

欢迎您提出任何其他检查建议!

3 个答案:

答案 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。这是我采取的步骤:

  • 创建一个“ 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');

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