我在这里基于cdk研讨会上的一个小lambda函数。我正在用typescript编写lambda函数,通过一个管道部署,该管道创建了一个包含lambda函数的云形成堆栈。
我尝试在lambda中使用sdk v3,如下所示。但是我在这里看到了相互矛盾的文档。
这些错误是因为我试图使用V3而我不应该,还是因为其他原因?处理程序设置正确后,函数运行,但失败并报错:
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module '@aws-sdk/client-sns'nRequire stack:n- /var/task/ReceiveMessageLoraThing.jsn- /var/runtime/UserFunction.jsn- /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。
是的,你可以使用AWS SDK v3,就像任何其他JS库一样。
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(非常不可能,但可能)。
Edit (2022-11-22):Node.js 18 Lambda运行时包含SDK v3,不包含v2 (https://aws.amazon.com/blogs/compute/node-js-18-x-runtime-now-available-in-aws-lambda/)。