【问题标题】:Does AWS Lambda support aws-sdk v3 or not?AWS Lambda 是否支持 aws-sdk v3?
【发布时间】:2021-05-13 17:36:12
【问题描述】:

我基于 cdk 研讨会here 建立了一个小型 lambda 函数。我正在 typescript 中编写 lambda 函数,通过管道进行部署,该管道创建包含 lambda 函数的云形成堆栈。

我正在尝试在 lambda 中使用 sdk v3,as demoed here。但后来我看到有冲突的文档here

这些错误是因为我尝试使用 V3 而我不应该使用,还是出于其他原因?处理程序设置正确,函数运行但失败并出现错误:

{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module '@aws-sdk/client-sns'\nRequire stack:\n- /var/task/ReceiveMessageLoraThing.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
    "stack": [
        "Runtime.ImportModuleError: Error: Cannot find module '@aws-sdk/client-sns'",
        "Require stack:",
        "- /var/task/ReceiveMessageLoraThing.js",
        "- /var/runtime/UserFunction.js",
        "- /var/runtime/index.js",
        "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
        "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
        "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
        "    at Module._compile (internal/modules/cjs/loader.js:999:30)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)",
        "    at Module.load (internal/modules/cjs/loader.js:863:32)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:708:14)",
        "    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)",
        "    at internal/main/run_main_module.js:17:47"
    ]
}

文件部署为 js,并设置了正确的处理程序。如果我注释掉 require 语句,它工作正常:

// works
"use strict";
//const sns = require("@aws-sdk/client-sns");
exports.handler = async (event) => {
    console.log("hello");
    return true;
}

// doesn't work
"use strict";
const sns = require("@aws-sdk/client-sns");
exports.handler = async (event) => {
    console.log("hello");
    return true;
}

没有使用这个研讨会的代码生成的 node_modules 或层,但在我去那里之前,我想知道我是否真的可以在 lambda 上使用 V3。

【问题讨论】:

  • FWIW,您可以通过 docker run --rm -it --entrypoint /bin/bash amazon/aws-lambda-nodejs[:version] 检查 AWS Lambda 运行时中的内容。 Node 14 版本中可用的预装包位于/var/runtime/node_modules,其中仅包含aws-sdk
  • 还有包 npm 依赖于 /var/lang/lib/node_modules/npm/node_modules,但你不能从你的处理程序中按名称要求它们,依赖它们可能是个坏主意

标签: aws-lambda aws-sdk-js


【解决方案1】:

是的,您可以像使用任何其他 JS 库一样使用 AWS SDK v3。

Lambda 的 Node 环境附带安装的 AWS SDK v2(上一个),您可以在此处看到:https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html

所以要使用 v3,您应该将它与您的应用程序捆绑在一起,就像与任何其他依赖项一样,并部署捆绑包 (https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html)。

实际上,即使 SDK v2 在 Lambda 环境中可用,最好还是自行将其与您的应用程序捆绑并进行部署。这样,您将始终使用您指定的版本,而不是 Lambda 上可以随时更新的版本。即使他们没有进行任何不兼容的更改,新的 SDK 版本(未经您的特定应用程序测试)也总是可能存在一些会破坏您的 Lambda 的错误(非常不可能,但有可能)。

【讨论】:

  • 这会使我的项目变得更复杂一些,但是很好的建议,谢谢。关于在同一个项目中构建多个单独的 lambda 函数有什么建议吗?我必须为每个复制/安装 node_modules 吗? (我是用CDK来部署的)
  • 我没有使用 CDK(仅 Serverless 框架),所以我不知道这究竟是如何工作的,但我看不出有理由增加 node_modules。应该可以在单个项目中创建多个功能。
  • 虽然您可以在 lambda 中使用 v3,但您必须自己包含它,我认为它还没有为 lambda 使用做好准备。我一直在尝试下载一个 S3 对象,但收效甚微。我可以让它在 NodeJS 中工作,但当我将它部署到 lambda 时就不行了。
  • @JHH 同意,因为他们想使用 sdk v3,他们将以一种或另一种方式包含它们。我建议他们在一个隔离的层中将它们提供给他们的 lambda,而不是与其他模块部门捆绑在一起。在单独的层中,它们可以与其他 lambda 共享,并且当提供开箱即用的 v3 时,OP 可以删除该层或继续自己维护特定的 v3 版本。
  • 他们是否有任何理由不将 aws-sdk v3 作为 acpkage 包含在与 v2 相同的方式中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2020-03-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
相关资源
最近更新 更多