Lambda无法上传文件到S3:本地测试正常,云端无报错也无文件生成
问题根因
你遇到的本地运行正常、Lambda上传无效果的核心是异步任务等待机制的差异:
- 你将Lambda Handler声明为
async类型,但调用s3.upload(params).promise()时没有添加await关键字,S3上传的异步操作还没执行完成,函数就已经运行到return context.logStreamName直接返回 - 同时你设置了
context.callbackWaitsForEmptyEventLoop = false,Lambda不会等待事件循环中的剩余任务执行完成,会直接冻结进程,因此S3上传的then/catch回调都没有机会执行,自然没有对应日志、也不会生成S3文件 - 本地测试时Node.js进程不会在主逻辑跑完后立即终止,未等待的异步任务可以正常执行完成,所以本地可以上传成功
修复方案
建议直接在async Handler中用await等待所有异步操作完成,不要混用async和callback逻辑,修复后的代码如下:
var fs = require('fs'); var AWS = require('aws-sdk'); exports.handler = async (event, context) => { try { // 注意:Lambda运行时建议给执行角色绑定S3权限,不要硬编码密钥,避免安全风险 AWS.config.update({ accessKeyId: accessKeyId, secretAccessKey: secretAccessKey }); var s3 = new AWS.S3(); var path = 'myfile.txt'; // 确认部署包中包含myfile.txt,且路径正确 var file_buffer = fs.readFileSync(path); console.log(file_buffer); var params = { Bucket: 'bucket-dev', Key: '2222.txt', Body: file_buffer }; console.log("1111"); // 新增await等待S3上传完成 const uploadRes = await s3.upload(params).promise(); console.log("Successfully uploaded to", uploadRes.Location); console.log("2222"); return "All Good"; } catch (err) { console.error(err, err.stack); throw err; } }
额外检查项
如果修改后仍有问题,请逐一排查:
- 确认Lambda的执行角色已配置目标Bucket的
s3:PutObject权限 - 如果Lambda部署在VPC内,需要配置S3网关端点或公网NAT,保证可以访问S3服务
- 确认打包上传到Lambda的部署包中包含
myfile.txt,路径和代码中声明的一致
内容的提问来源于stack exchange,提问作者Tính Ngô Quang
相关产品推荐
相关产品推荐

