【问题标题】:How do I use shared code in lambdas in an AWS SAM template using layers in Node.js?如何使用 Node.js 中的层在 AWS SAM 模板中使用 lambda 中的共享代码?
【发布时间】:2020-06-19 16:25:44
【问题描述】:

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

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

回答要求:

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

【问题讨论】:

    标签: node.js aws-lambda aws-serverless


    【解决方案1】:

    TL;DR

    • 将您的共享代码放在一个层中
    • 在 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');
    
    • 除非在 lambda 文件夹代码中,否则您不需要像那样使用三元运算符

    这是一个我们认为应该发布的工作示例,以便其他人比我们更轻松地使用它。 我们认为 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 清理,我认为这就是导致删除共享代码的原因。

    【讨论】:

    • 如果它解释了解决方案,并在答案本身中包含相关的引号和代码示例,以及链接到 git 模板,则该答案将更加有用。这可以帮助人们找到答案,判断 git repo 是否有他们需要的东西,如果 repo 被删除或链接停止工作,让答案继续有用:)
    • @MyStackRunnethOver 谢谢你的建议。如果您认为我还有什么需要补充的,请告诉我。
    • 感谢更新!看起来不错:)
    • @Brandon 感谢您的回答。我现在可以为我的 lambda 运行测试。但是,使用 sam local invoke 调试容器中的代码仍然没有使用相对路径找到我的层。如果我在本地手动设置 AWS 的 env,它仅在我构建函数后才有效(在更改代码中的任何内容后我必须重复执行此操作)。当我不每次都构建更改时,/opt 路径或相对路径不起作用。你能帮帮我吗?谢谢
    • @SwopnilDangol 我还没有找到适合开发的环境,因为正如您所说,您必须为每次调用做很多工作。恐怕我无法为您提供“这就是您如何拥有出色的开发体验”的内容。你查看链接了吗?我在那里给出了一些提示,但这仍然不是一个很棒的开发体验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多