如何使用 Node.js 中的层在 AWS SAM 模板中的 lambdas 中使用共享代码?

Bra*_*don 4 node.js aws-lambda aws-serverless

我们有一个非常简单的用例——我们想与我们所有的 lambda 共享代码,我们不想使用 webpack。

我们不能将相对路径放在package.jsonlambda 文件夹中的文件中,因为当您执行sam build两次时,它会删除共享代码,我不知道为什么。

回答要求:

  • 能够在本地调试
  • 能够对业务逻辑运行单元测试(无需在 AWS 沙箱中运行)
  • 能够运行测试 sam local start-api
  • 能够通过以下方式调试容器中的代码 sam local invoke
  • sam build 作品
  • sam deploy 作品
  • 在云中的 AWS Lambda 中运行

Bra*_*don 10

TL; 博士

  • 将您的共享代码放在一个层中
  • 在 lambda 层中引用共享代码时,在 require() 时使用三元运算符。检查仅在 AWS 环境中运行时设置的环境变量。在这种情况下,我们在 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');
Run Code Online (Sandbox Code Playgroud)
  • 除非在 lambda 文件夹代码中,否则您不需要像这样使用三元运算符

这是一个我们认为我们会发布的工作示例,以便其他人比我们更轻松。我们认为 AWS 应该让这件事变得更容易。

https://github.com/blmille1/aws-sam-layers-template.git


陷阱

此解决方案避免了以下问题。我之所以提到它,是因为它看起来是一个直接的解决方案,我花了很多时间才最终放弃它。

在 lambda 函数的 package.json 中添加文件夹引用非常诱人。

//...
"dependencies": {
    "common":"file:../../layers/layer1/nodejs/common"
},
//...
Run Code Online (Sandbox Code Playgroud)

如果你这样做,它将首先起作用sam build。但是,第二次运行时sam build,您的共享代码文件夹和所有子目录都将被删除。这是因为当 sam 构建时,它会创建一个 .aws-sam 文件夹。如果该文件夹存在,它会执行 npm 清理,我认为这就是删除共享代码的原因。

  • 如果这个答案在答案本身中解释了解决方案,并根据需要提供相关引用和代码示例,并链接到 git 模板,那么它会更有用。这可以帮助人们找到答案,判断 git 存储库是否有他们需要的内容,并在存储库被删除或链接停止工作时让答案继续有用:) (2认同)
  • 感谢您更新!看起来很棒 :) (2认同)