AWS S3 SDK - копировать версионный объект в одну корзину - PullRequest
2 голосов
/ 19 апреля 2019

Следуя этому методу, упомянутому AWS, я пытаюсь создать API, который позволил бы мне откатиться к предыдущим версиям с помощью функции Lambda, которая будет подключена к API Gateway. Мне понадобится объект, указанный в идентификаторе версии, чтобы перезаписать существующий объект в том же сегменте.

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 Ответ

2 голосов
/ 24 апреля 2019

Похоже, что вам может не хватать s3:PutObjectAcl, так как по умолчанию он имеет значение private.

https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html состояния

При копировании объекта,Вы можете сохранить большинство метаданных (по умолчанию) или указать новые метаданные.Тем не менее ACL не сохраняется и устанавливается как частное для пользователя, выполняющего запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...