AWS: не удается загрузить файл в private S3 через SDK

#amazon-web-services #amazon-s3

#amazon-web-services #amazon-s3

Вопрос:

Итак, у меня есть частная корзина s3, и я хочу иметь возможность загружать в нее файл. У моего пользователя есть AmazonS3FullAccess , и оказывается, что этого недостаточно.

Ошибка

 Error executing "PutObject" on "https://my-existing-bucket-name.s3.amazonaws.com/5037f466f9018271b16b1e77d3d7f386.pdf"; AWS HTTP error: Client error: `PUT https://my-existing-bucket-name.s3.amazonaws.com/5037f466f9018271b16b1e77d3d7f386.pdf` resulted in a `403 Forbidden`
  

Я также попытался добавить пользовательскую политику

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::my-existing-bucket-name/*"
        }
    ]
}
  

но все равно это не работает, хотя можно удалить или получить файл, используя те же учетные данные.

Вот как я загружаю файлы в AWS (он отлично работает, если переключить доступ к корзине с частного на общедоступный)

     $this->s3Client->putObject([
        'Bucket' => $this->bucket,
        'Key' => $keyName,
        'ContentType' => $contentType,
        'CacheControl' => 'max-age=86400',
        'Body' => fopen($file, 'rb'),
        'ACL' => 'authenticated-read',
    ]);
  

Комментарии:

1. $this->s3Client->putObject Выполняется ли под вашим пользователем IAM или какой-либо ролью IAM?

2. @Marcin есть специальный пользователь IAM с указанными политиками, я добавил его ключ доступа к моему SDK

3. Существуют ли какие-либо политики корзины?

4. Нет, я только что переключился Block all public access , и все флажки ниже включены

Ответ №1:

Оказывается, проблема заключалась в следующем варианте

 'ACL' => 'authenticated-read'
  

в описании к аутентифицированному чтению говорится Owner gets FULL_CONTROL. The AuthenticatedUsers group gets READ access.

По-видимому, он конфликтует с настройками private bucket и именно поэтому выдает ошибку. Но код ошибки 403 сбивает с толку, я думаю, что код ответа 409 имеет здесь гораздо больше смысла. В любом случае, это сработало, когда я переключился на private, который является ACL по умолчанию.