AWS Lambda 是否支持 aws-sdk v3?

thi*_*ber 22 aws-lambda aws-sdk-js

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

我正在尝试在 lambda 中使用 sdk v3,如此处演示的那样但后来我在这里看到了相互矛盾的文档。

这些错误是因为我尝试使用 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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

该文件被部署为 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Rad*_*ski 29

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

Lambda 的节点环境附带安装的 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 )。

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

编辑 (2022-11-22): Node.js 18 Lambda 运行时包括 SDK v3,但不包括 v2 ( https://aws.amazon.com/blogs/compute/node-js-18-x-runtime-now-在-aws-lambda/ 中可用)。

  • 他们没有像 v2 那样将 aws-sdk v3 作为 acpkage 包含进来有什么原因吗? (3认同)
  • 始终通过层或其他方式部署特定开发工具包版本的缺点是,您将失去 AWS Lambda 服务自动更新开发工具包依赖项的好处。这是一个潜在的免费安全优势,需要根据 SDK 发生重大变化的风险来权衡其价值。 (3认同)
  • @zrkl,AWS 似乎在 v3 中费了很大的劲来分离出所有的包。他们总是建议人们捆绑特定的 SDK 版本,而不是依赖 lambda 运行时版本。我想他们可能故意不公开 v3,以便人们遵循这个建议;毕竟,我确信对于他们来说,将 v3 烘焙到 lambda 运行时(例如使用 Docker 构建)是相当简单的。至于 v2,他们可能必须将其保留在那里以实现向后兼容性。我可能是错的,也许 v3 将来会成为运行时的一部分,但我并没有屏住呼吸。 (2认同)