AWS S3 SDK-将版本控制的对象复制到同一存储桶中

时间:2019-04-19 18:08:55

标签: node.js amazon-web-services amazon-s3

在AWS提到的this方法之后,我试图创建一个API,该API允许我使用Lambda函数回滚到以前的版本,并将该Lambda函数连接到API网关。我将需要由版本ID指定的对象来覆盖同一存储桶中的现有对象。

const copyObjectAsync = params => s3.copyObject(params).promise();
const copyObjectParams = obj => ({
  Bucket: s3bucket,
  CopySource: `/${s3bucket}/${obj.objectkey}?versionId=${
    obj.versionId
  }`,
  Key: obj.objectkey,
  Tagging: `commit=${obj.commit}`,
});

const revert = async req => {
  const result = await Promise.all(
    req.payload.map(obj => {
      const params = copyObjectParams(obj);
      return copyObjectAsync(params);
    })
  );

  return result;
};

但是,我没有任何运气。我收到以下响应:

{
    "message": "Access Denied",
    "code": "AccessDenied",
    "region": null,
    "time": "2019-04-19T17:59:59.971Z",
    "statusCode": 403,
    "retryable": false,
    "retryDelay": 80.54565963302768
}

如果我改为使用特定版本的get对象并将该对象存储在内存中,然后将其传递到putObject中,则它将正常工作。

以下是我的政策设置方式:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:GetObjectVersion",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectTagging",
                "s3:PutObjectVersionTagging"
            ],
            "Resource": "*"
        }
    ]
}

1 个答案:

答案 0 :(得分:2)

您似乎缺少s3:PutObjectAcl,因为默认情况下将其设置为私有。

https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html状态

  

复制对象时,可以保留大多数元数据(默认)或指定新的元数据。但是,ACL不会保留,并且会向发出请求的用户设置为私有。