s3.putObject(params).promise() 没有上传文件,但是成功执行了then()回调

s3.putObject(params).promise() does not upload file, but successfully executes then() callback

我尝试了很长时间将文件放入 S3 存储桶,之后我必须更新我的模型。

我有以下代码(请注意,我也尝试过注释行。它既不带注释也不能不带注释。)

观察到的问题: 第一个 .then() 块 (successCallBack()) 中的所有内容都已成功执行,但我没有看到 s3.putObject().

的结果

有问题的存储桶是 public,没有访问限制。它曾经与 sls 离线选项一起使用,然后由于它在 AWS 中不起作用,我不得不进行大量更改并设法使 successCallback() 工作,从而使数据库成功运行。但是,文件上传还是不行。

一些问题:

在解决这个问题时,我正在思考/搜索的真正问题是,

更新:

var myJSON = {}
const createBook = async (event) => {

    let bucketPath = "https://com.xxxx.yyyy.aa-bb-zzzzzz-1.amazonaws.com"
    let fileKey = //file key
    let path = bucketPath + "/" + fileKey;

    myJSON = {
      //JSON from headers
    }

    var s3 = new AWS.S3();
    let buffer = Buffer.from(event.body, 'utf8');

    var params = {Bucket: 'com.xxxx.yyyy', Key: fileKey, Body: buffer, ContentEncoding: 'utf8'};

    let putObjPromise = s3.putObject(params).promise();

    putObjPromise
    .then(successCallBack())
    .then(c => {
      console.log('File upload Success!');
      return {
        statusCode: 200,
        headers: { 'Content-Type': 'text/plain' },
        body: "Success!!!"
      }
    })
    .catch(err => {   
        let str = "File upload /  Creation error:" + err;
        console.log(str);
        return {
          statusCode: err.statusCode || 500,
          headers: { 'Content-Type': 'text/plain' },
          body: str
        }
    });
}

const successCallBack = async () => {
  console.log("Inside success callback - " + JSON.stringify(myJSON))  ;
  const { myModel } = await connectToDatabase()
  console.log("After connectToDatabase")
  const book = await myModel.create(myJSON)

  console.log(msg);
}

终于,我成功了。我的代码已经在 sls 离线设置中运行。

AWS 端点有何不同?

我在控制台上观察到的事实是我的 lambda 在 VPC 下 设置为 运行。

当我选择No VPC时,它起作用了。我不知道这是否是最佳做法。 VPC 下的函数 运行ning 一定有一些安全优势。

我遇到了这个巨大的 explanation about VPC 但我找不到任何与 S3 相关的东西。

问题中发布的代码目前 运行 在 AWS 端点上没问题。

如果 lambda 在 VPC 中 运行 那么您将需要一个 VPC 端点来访问 vpc 外部的服务。 S3 将在 VPC 之外。如果安全是一个问题,那么创建 VPC 端点可能会以更好的方式解决该问题。此外,如果安全是一个问题,那么或许可以向 lambda 使用的角色添加一个策略(或使用默认的 AmazonS3FullAccess 策略),那么 S3 存储桶就不需要 public。