aws-lambda - AWS Lambda 是否支持 aws-sdk v3?
问题描述
我在这里的 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.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。
解决方案
是的,您可以像使用任何其他 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 的错误(非常不可能,但有可能)。
推荐阅读
- angular - 重置 Observable.timer()
- php - PHP ODBC I/O 包默认不是线程安全的
- button - 如何在 NSIS 的浏览按钮上放置位图图像?
- ms-access - 基于另一个值的 MS Access 更新记录
- bash - 合并公共列上的两个文件并使用 awk 打印所有列
- dart - 在 Flutter 中使用 Google Play 游戏服务?
- javascript - 比较 2 个对象数组中的值并创建新数组 js
- python - 如何构建“sphinx”文档 git repo 以将其他 repos 记录为子模块?
- python - Python绘制两个不同长度的列表
- ios - 通过 HTTP/2 下载时 iOS 中的 SETTINGS_MAX_CONCURRENT_STREAMS