在AWS Lambda NodeJS中创建和访问公共代码

3

我应该用什么目录结构来进行以下操作:

  1. 将作为层打包的NodeJS代码?
  2. 使用共同代码的NodeJS应用程序? 我希望使用SAM或cloudFormation模板构建层, 并使用另一个模板构建使用它的Lambda。我希望多个Lambda使用该层,因此需要单独打包。

我还不清楚应该使用哪种确切的目录结构来存放共同代码。另外,如果我的共同代码反过来又依赖于其package.json文件中的内容,我该如何构建目录结构呢?例如:我想构建通用代码以从AWS参数存储中读取数据。然后我将需要在我的通用代码的package.json中依赖于aws-param-store,即:

 "dependencies": {
    "aws-param-store": "^3.0.0",

假设我的通用代码驻留在名为 my-common-code 的某个包中。
一旦我正确构建和部署层之后,我知道可以在我的 SAM 模板中引用 ARN 名称(这是正确的做法)来为 Lambda 进行设置。那么,在调用 Lambda 中,如何引用通用代码呢? 1. 目录结构是怎样的? 2. 为了使调用的 Lambda 引用 my-common-code 的名称和版本,需要将什么内容放入 package.json 文件中?我认为可能是这样的:
 "dependencies": {
    "my-common-code": "^1.0.0",

我希望在我的Lambda中能够做到这一点:

let commonModule = require('my-common-code');
commonModule.doSomething();

我尝试了各种不同的结构和配置,但是出现了错误,要么是无法找到我的通用代码(my-common-code),要么是它依赖的某些内容无法找到,例如aws-param-store。

1个回答

2
创建您的层,首先需要将常用代码放入具有以下文件夹结构的zip文件中:
nodejs/node_modules/my-common-code/my-common-code.js
参考:在层中包含库依赖项 即,如果您打开zip文件,您将看到类似于这样的内容:
my-common-code.zip
└ nodejs
  └ node_modules
    └ my-common-code
      └ package.json
      └ my-common-code.js
      └ more-common-code.js
      └ ...

最初的回答:

要使用CloudFormation从该zip文件创建一个层,您需要将其存储在某个S3存储桶中。

CloudFormation模板的相关部分可能看起来像这样:

 "Resources": {
    "MyCommonCode": {
        "Type": "AWS::Lambda::LayerVersion",
        "Properties": {
            "CompatibleRuntimes": [
                "nodejs8.10"
            ],
            "Content": {
                "S3Bucket": "my-common-code-bucket",
                "S3Key": "my-common-code.zip"
            },
            "Description": "My common code",
        }
    }
}

这是从这个例子进行修改得到的。
使用该层的lambda的CloudFormation可能如下所示:
"MyFunction": {
    "Type": "AWS::Lambda::Function",
    "Properties": {
        "Handler": "index.handler",
        "Layers":
            - "arn:aws:lambda:us-east-2:012345678901:layer:MyCommonCode"
        "Role": "arn:aws:iam::012345678901:role/LambdaRole",
        "Code": {
            "S3Bucket": "my-lambda-functions",
            "S3Key": "myLambda.zip"
        },
        "Runtime": "nodejs8.10"
    }
}

在所有这些之后,你的代码:

最初的回答:

let commonModule = require('my-common-code');
commonModule.doSomething();

should work


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接