如何在使用 Node.js 中的层的 AWS SAM 模板中使用 lambda 中的共享代码?
How do I use shared code in lambdas in an AWS SAM template using layers in Node.js?
我们有一个非常简单的用例——我们想与我们所有的 lambda 共享代码,我们不想使用 webpack。
我们无法将相对路径放入 lambda 文件夹中的 package.json
文件中,因为当您执行两次 sam build
时,它会 删除 共享代码我不知道为什么。
回答要求:
- 能够在本地调试
- 能够 运行 对业务逻辑进行单元测试(不必 运行 在 AWS 沙箱中)
- 能够在
sam local start-api
中进行 运行 测试
- 能够通过
sam local invoke
调试容器中的代码
sam build
有效
sam deploy
有效
- 在云中的 AWS Lambda 中运行
TL;DR
- 将您的共享代码放在一个层中
- 在 lambda 层引用共享代码时,在 require() 时使用三元运算符。检查仅在 AWS 环境中 运行ning 时设置的环境变量。在这种情况下,我们在 SAM 模板中添加了一个简短的 AWS 变量,但是您可以找到 AWS 自动定义的环境变量,但它们不会那么短。这使您能够在 AWS 堆栈之外进行本地调试,从而允许测试业务逻辑的非常快速的单元测试。
let math = require(process.env.AWS ? '/opt/nodejs/common' : '../../layers/layer1/nodejs/common');
let tuc = require(process.env.AWS ? 'temp-units-conv' : '../../layers/layer1/nodejs/node_modules/temp-units-conv');
- 除非在 lambda 文件夹代码中,否则您不需要像那样使用三元运算符
这是一个我们认为我们会 post 的工作示例,这样其他人会比我们更容易地使用它。
我们认为 AWS 应该使这更容易。
https://github.com/blmille1/aws-sam-layers-template.git
陷阱
此解决方案避免了以下问题。我提到它是因为它看起来像是一个直接的解决方案,我花了很多时间才最终放弃它。
在 lambda 函数的 package.json 中添加文件夹引用非常诱人。
//...
"dependencies": {
"common":"file:../../layers/layer1/nodejs/common"
},
//...
如果你这样做,它将在第一个 sam build
中起作用。但是,您第二次 运行 sam build
,您的共享代码文件夹和所有子目录将被 DELETED。这是因为当 sam 构建时,它会创建一个 .aws-sam 文件夹。如果该文件夹存在,它会执行 npm 清理,我认为这就是导致删除共享代码的原因。
我们有一个非常简单的用例——我们想与我们所有的 lambda 共享代码,我们不想使用 webpack。
我们无法将相对路径放入 lambda 文件夹中的 package.json
文件中,因为当您执行两次 sam build
时,它会 删除 共享代码我不知道为什么。
回答要求:
- 能够在本地调试
- 能够 运行 对业务逻辑进行单元测试(不必 运行 在 AWS 沙箱中)
- 能够在
sam local start-api
中进行 运行 测试
- 能够通过
sam local invoke
调试容器中的代码
sam build
有效sam deploy
有效- 在云中的 AWS Lambda 中运行
TL;DR
- 将您的共享代码放在一个层中
- 在 lambda 层引用共享代码时,在 require() 时使用三元运算符。检查仅在 AWS 环境中 运行ning 时设置的环境变量。在这种情况下,我们在 SAM 模板中添加了一个简短的 AWS 变量,但是您可以找到 AWS 自动定义的环境变量,但它们不会那么短。这使您能够在 AWS 堆栈之外进行本地调试,从而允许测试业务逻辑的非常快速的单元测试。
let math = require(process.env.AWS ? '/opt/nodejs/common' : '../../layers/layer1/nodejs/common');
let tuc = require(process.env.AWS ? 'temp-units-conv' : '../../layers/layer1/nodejs/node_modules/temp-units-conv');
- 除非在 lambda 文件夹代码中,否则您不需要像那样使用三元运算符
这是一个我们认为我们会 post 的工作示例,这样其他人会比我们更容易地使用它。 我们认为 AWS 应该使这更容易。
https://github.com/blmille1/aws-sam-layers-template.git
陷阱
此解决方案避免了以下问题。我提到它是因为它看起来像是一个直接的解决方案,我花了很多时间才最终放弃它。
在 lambda 函数的 package.json 中添加文件夹引用非常诱人。
//...
"dependencies": {
"common":"file:../../layers/layer1/nodejs/common"
},
//...
如果你这样做,它将在第一个 sam build
中起作用。但是,您第二次 运行 sam build
,您的共享代码文件夹和所有子目录将被 DELETED。这是因为当 sam 构建时,它会创建一个 .aws-sam 文件夹。如果该文件夹存在,它会执行 npm 清理,我认为这就是导致删除共享代码的原因。