You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:54:03