amazon-web-services - 从 lambda 上传的 AWS s3 不起作用且没有错误
问题描述
我正在尝试使用 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
});
我提供了对 lambda 角色的 S3 访问权限。当我尝试从 CLI 执行相同的操作时,上传工作正常。
解决方案
回答一个旧帖子,但也许它可以帮助某人。我在论坛上寻找解决方案,最终在 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 本身。但是,这样做,您将无法控制解析和拒绝回调中发生的事情。即我放在其中的console.log 没有将日志与处理程序中的其他日志一起写入lambda 的控制台,这些日志在回调之外(在上传之前)被调用。
推荐阅读
- nestjs - NestJS + 类验证器,为什么错误数组是空的?
- postgresql - 从postgresql 10中的日期列生成的列
- docker - 尝试下载图像时,Kitematic 卡在连接到 Docker 集线器
- java - Android图像意图不显示图像
- c# - MemoryStream 可以减少它的容量吗?
- python - 为什么分别使用requests和aiohttp会得到不同的结果?
- ios - CocoaPods 停止安装 Firebase/Analytics 并出现错误
- r - 按条件合并两个 CSV
- bash - 从带有搜索字符串的日志文件中获取最近 5 分钟的日志
- ios - 如何在不出错的情况下创建惰性属性?