升级Node.js 12.x至18.x后,Lambda函数无法加载AWS SDK
解决方案:Node.js 18.x Lambda无法找到aws-sdk模块
问题原因
Node.js 12.x及更早的Lambda运行时内置了AWS SDK v2,但Node.js 18.x及以上版本的运行时移除了内置的AWS SDK v2,转而内置了AWS SDK v3。你的代码依然尝试引入v2,所以会出现Cannot find module 'aws-sdk'的错误。
可选解决方案
方案1:迁移到AWS SDK v3(推荐)
AWS SDK v3采用模块化设计,体积更小、性能更优,也是官方推荐的新版本。以S3操作为例,修改代码如下:
// 导入对应服务的客户端和命令 const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3"); // 初始化客户端(可指定区域,若不指定则使用Lambda的默认区域) const s3Client = new S3Client({ region: "us-east-1" }); // 示例:执行GetObject操作 const getS3Object = async () => { try { const command = new GetObjectCommand({ Bucket: "your-bucket-name", Key: "your-object-key" }); const response = await s3Client.send(command); // 处理响应数据 console.log("Object retrieved:", response); } catch (err) { console.error("Error retrieving object:", err); } }; exports.handler = async (event) => { await getS3Object(); return { statusCode: 200, body: "Success" }; };
- 不同AWS服务对应不同的包,比如EC2对应
@aws-sdk/client-ec2,DynamoDB对应@aws-sdk/client-dynamodb,按需导入即可。 - 部署时需将这些依赖打包进部署包(执行
npm install @aws-sdk/client-s3后,将代码和node_modules一起压缩上传)。
方案2:手动打包AWS SDK v2到部署包
如果不想修改现有代码,可将AWS SDK v2作为依赖打包进Lambda部署包:
- 在本地项目目录执行:
npm install aws-sdk --save - 将你的代码文件(如
index.js)和node_modules目录一起压缩成ZIP文件(确保文件在ZIP根目录,而非嵌套文件夹)。 - 在Lambda控制台上传这个ZIP包作为函数代码。
方案3:使用Lambda层提供AWS SDK v2
通过Lambda层复用AWS SDK v2,避免每个函数都打包依赖:
- 创建一个本地目录
nodejs,进入该目录执行:npm install aws-sdk --save - 将
nodejs目录压缩成ZIP文件(ZIP的根目录是nodejs,内部包含node_modules)。 - 在Lambda控制台创建新层,上传该ZIP包,运行时选择
Node.js 18.x。 - 进入你的Lambda函数配置页面,将该层附加到函数上。
内容的提问来源于stack exchange,提问作者PHPisMyFavLol
相关产品推荐
相关产品推荐

