错误:在 NodeJS AWS Lambda 函数中找不到模块“aws-sdk”

day*_*mer 29 amazon-s3 amazon-web-services node.js aws-lambda aws-cdk

我正在尝试S3通过aws-sdk我的 lambda 函数进行访问。

import S3 from 'aws-sdk/clients/s3';

const s3 = new S3();
const { Contents: results } = await s3.listObjects({ Bucket: process.env.DOCUMENTS_BUCKET_NAME! }).promise()
Run Code Online (Sandbox Code Playgroud)

我也使用命令成功部署了它cdk deploy。但是当我测试时,我收到以下错误

2022-11-23T15:53:40.891Z    undefined   ERROR   Uncaught Exception  
{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module 'aws-sdk'\nRequire stack:\n- /var/task/index.js\n- /var/runtime/index.mjs",
    "stack": [
        "Runtime.ImportModuleError: Error: Cannot find module 'aws-sdk'",
        "Require stack:",
        "- /var/task/index.js",
        "- /var/runtime/index.mjs",
        "    at _loadUserApp (file:///var/runtime/index.mjs:1000:17)",
        "    at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1035:21)",
        "    at async start (file:///var/runtime/index.mjs:1200:23)",
        "    at async file:///var/runtime/index.mjs:1206:1"
    ]
}
Run Code Online (Sandbox Code Playgroud)

根据文档aws-sdk在运行时始终可用。

有谁知道我做错了什么?

非常感谢

Lei*_*son 35

如果您的 lambda 运行时是 nodejs18.x,我的理解是 SDK v2 不包含在运行时中。

因此,最好的解决方案是切换到 v3 SDK https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/

或者,如果您使用 webpack 并且通常排除使用以下内容捆绑 aws-sdk,则作为短期解决方法:

externals: {
    'aws-sdk': 'aws-sdk'
},
Run Code Online (Sandbox Code Playgroud)

然后只需将外部内容从 webpack.config.js 中删除,它就会被捆绑,但当然会让你的 lambda 变得更大,所以不理想

或者短期使用nodejs16.x以下版本

  • 使用nodejs16.x解决我的问题。但我不知道为什么。显然,相同的代码之前在nodejs18.x上也有效。运行时nodejs18.x现在删除SDK v2吗? (3认同)

day*_*mer 8

更新的链接

谢谢@jarmod,我需要以下依赖项

@aws-sdk/client-s3
Run Code Online (Sandbox Code Playgroud)

我的修复提交可以在这里找到

  • @SteffiKeranRaniJ,我更新了链接。希望有帮助 (2认同)