从Lambda上的AWS s3上传不起作用并且没有错误

时间:2018-10-03 07:25:38

标签: amazon-web-services amazon-s3 aws-lambda

我正在尝试使用nodejs将一个简单的文件从lambda上传到s3。 lambda执行正常,没有任何错误,但是s3上传没有发生。由于没有错误,因此我无法调试该问题。下面是我正在尝试的代码段。

var s3 = new AWS.S3();

var params = {
Bucket : "testbucketuploads",
Key : "test.txt",
Body : "Hello!"
}

s3.putObject(params, function(err, data) {
          if (err) console.log(err, err.stack); // an error occurred
          else     console.log(data);           // successful response
});

我已为S3提供了访问lambda角色的权限。当我尝试从CLI执行相同操作时,上传工作正常。

3 个答案:

答案 0 :(得分:2)

回答旧帖子,但也许可以帮助某人。我在论坛上寻找解决方案,最终在aws-sdk的文档中找到了它。好吧,几个小时的尝试与失败可以为您节省几分钟的阅读文档或自述文件的时间。无论如何。首先,我使用s3.upload而不是s3.putObject。此后,该函数是异步的,并且如果lambda函数终止于上传之前,则不会有任何结果或任何日志。我想出的最漂亮的解决方案是:

const fs = require('fs');
const s3 = new AWS.S3()
const file = fs.readFileSync(someFilePath)
const bucket = "..."
const s3key = "..."
const uploadParams = {
    Bucket: bucket,
    Key: s3key,
    Body: file
};
//executes the upload and waits for it to finish
await s3.upload(uploadParams).promise().then(function(data) {
    console.log(`File uploaded successfully. ${data.Location}`);
}, function (err) {
    console.error("Upload failed", err);
})
//code continues synchronously here
...
return whatEver;

或者,如果您有并且想要拥有一个异步处理程序,则可以返回Promise本身。但是,这样做将几乎无法控制resolve和reject回调内部发生的情况。即我放在其中的console.log并未将日志与处理程序中的其他日志(在上载之前)在回调之外称为其他日志一起写入到lambda的控制台中。

答案 1 :(得分:1)

AWS documentation指示您需要在Body参数中发送二进制字符串。请查看此博客文章How to convert a binary string into a readable string and vice versa with Javascript和此SO thread,以获取有关如何为S3准备数据的示例。

答案 2 :(得分:-1)

删除async(如果使用),例如:

正确:

exports.handler = (event) => {
    enter code here
}

错误:

exports.handler = async (event) => {
    enter code here
}