NodeJS AWS Lambda 函数报错:无法找到模块 'aws-sdk'。

24
我正在尝试在我的 Lambda 函数中通过 aws-sdk 访问 S3
import S3 from 'aws-sdk/clients/s3';

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

我也成功使用了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"
    ]
}

根据文档aws-sdk始终可用于运行时环境。
有人知道我做错了什么吗?
非常感谢。

根据你的代码调用的是旧版 listObjects 方法而不是 listObjectsV2,并且使用了 .promise() 特性,你似乎在尝试使用 JavaScript SDK v2。因此需要使用以下代码:const AWS = require('aws-sdk'); const s3 = new AWS.S3(); - jarmod
或者使用文档在此处记录的SDK v3(https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/index.html)。 - jarmod
5个回答

31
如果您的lambda运行时是nodejs18.x,我的理解是SDK v2不包含在运行时中。
因此,最好的解决方案是切换到v3 SDK https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/ 或者,作为短期解决方法,如果您使用webpack并且通常不包含aws-sdk,请使用以下内容进行打包:
externals: {
    'aws-sdk': 'aws-sdk'
},

如果只是简单打包的话,可以在webpack.config.js中不包含外部文件,这样就能进行打包,但会增大Lambda函数的大小,所以并不理想。

或者短期内使用nodejs16.x或更低版本。


3
使用Node.js 16.x修复了我的问题,但我不知道为什么。显然,在Node.js 18.x之前,相同的代码是可以工作的。现在的Node.js 18.x运行时是否移除了SDK v2呢? - undefined
1
使用nodejs16.x修复了我的问题。但是我不知道为什么。显然,相同的代码在nodejs18.x之前可以工作。难道运行时nodejs18.x移除了SDK v2吗? - FerntreeGuy
关于Node 16与Node 18及其支持的AWS SDK版本的变更,这是一个链接到AWS博客的文章:https://aws.amazon.com/blogs/compute/node-js-18-x-runtime-now-available-in-aws-lambda/ - Jake Waggoner
关于Node 16与Node 18及其支持的AWS SDK版本的变更,这是AWS博客的链接:https://aws.amazon.com/blogs/compute/node-js-18-x-runtime-now-available-in-aws-lambda/ - undefined

8

更新的链接

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

@aws-sdk/client-s3

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


1
提交的链接已经失效。 - Steffi Keran Rani J
2
@SteffiKeranRaniJ,我更新了链接。希望这有所帮助。 - daydreamer

2
我解决这个问题的方法是将我的运行时设置从Node.js 18降级到Node.js 16.x或更低版本。之后,测试成功通过了。

Node.js 18有许多安全增强功能,降级应该是最后的选择。 - Wayne Workman

1
我也遇到了这个问题。 在创建Lambda时,我选择了Node.js v18。 它给了我同样的错误。但是将包更改为"@aws-sdk/*"的新版本解决了这个问题。

2
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到更多关于如何撰写好的回答的信息。 - undefined

1
对于那些使用esbuild的无服务器框架的人来说,该插件通过default排除了'aws-sdk'。在我的情况下,我没有降级到v16,而是保留了v18,并在我的serverless.yml中放置了一个空数组。
custom:
  esbuild:
    exclude: []

谢谢!我错过了esbuild默认排除aws-sdk的设置。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接