【问题标题】:AWS s3 upload from lambda not working and no error从 lambda 上传的 AWS s3 不起作用且没有错误
【发布时间】:2022-03-20 03:55:30
【问题描述】:

我正在尝试使用 nodejs 将简单的文件从 lambda 上传到 s3。 lambda 执行工作正常,没有任何错误,但没有发生 s3 上传。由于没有错误,我无法调试该问题。下面是我正在尝试的 sn-p。

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.Credentials().accessKeyId 看起来像访问密钥。这将验证您的角色是否已分配,并且 SDK 正在查找凭据。

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


【解决方案1】:

回答一个旧帖子,但也许它可以帮助某人。我在论坛上寻找解决方案,最终在 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 本身。但是,这样做,您将无法控制解析和拒绝回调中发生的事情。 IE。我放在其中的 console.log 没有将日志与处理程序中的其他日志一起写入 lambda 的控制台,这些日志在回调之外(在上传之前)被调用。

【讨论】:

  • 哇,花了一段时间寻找这个答案!您可以只使用await s3.upload(params).promise() 而不是使用.then().catch() 来保持清洁。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    由于某种原因,基于回调的调用在这种情况下不起作用。 但是,对我来说,以下方法效果很好:

    await s3.putObject(params).promise();
    

    【讨论】:

      【解决方案4】:

      删除async如果使用,例如:

      正确:

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

      错误:

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

      【讨论】:

      • 这是完全错误的! async 不是问题。问题是async 使用不当。
      • 有人标记了这个答案,前提是它不是一个答案,或者它的质量非常低 - 大概是因为他们认为它不正确。在这种情况下,这两个标志都不合适 - 不正确的答案应该被否决和/或评论,而不是被标记。 From Review.
      猜你喜欢
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2018-07-12
      相关资源
      最近更新 更多