Загрузка на s3 через PHP не удалась, доступ запрещен

Я чувствую себя немного глупо, спрашивая об этом, но нужно ли что-то особенное, чтобы загрузить что-то через текущий PHP SDK на S3? Я могу загрузить через cli с теми же учетными данными, но когда я пытаюсь использовать SDK, это не удается.

Вот код:

<?php
require "awssdk_v3/aws-autoloader.php";

use Aws\S3\S3Client;

function s3_upload($file, $name) {
    $s3 = S3Client::factory(
        array(
            'key' => getenv('AWS_ACCESS_KEY_ID'),
            'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
            'version' => "2006-03-01",
            'region' => getenv('AWS_REGION')
        )
    );
    $result = $s3->putObject(
        array(
            'Bucket' => getenv('AWS_BUCKET'),
            'Key' => $name,
            'SourceFile' => $file,
            'ContentType' => mime_content_type($file),
            'ACL' => 'public-read'
        )
    );
    return true;
}

Я называю это так

s3_upload($_FILES['avatarfile']['tmp_name'], "avatar_2.jpg");

У пользователя, которого я использую, есть эта политика:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1480066717000",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Sid": "Stmt1480066765000",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket"
            ]
        }
    ]
}

Как уже упоминалось, я смог загрузить файл из CLI, используя учетные данные этого пользователя. Регион — Франкфурт, поэтому я указал eu-central-1, верно?

Ошибка, которую я получаю, начинается так:

Fatal error: Uncaught exception 'Aws\S3\Exception\S3Exception' with message 'Error executing "PutObject" on "https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg"; AWS HTTP error: Client error: `PUT https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg` resulted in a `403 Forbidden` response

person iGEL    schedule 08.10.2017    source источник
comment
Вы уверены, что используете одни и те же учетные данные и загружаете в одно и то же место?   -  person tadman    schedule 09.10.2017
comment
Как вы устанавливаете переменные KEY env? Пытаюсь переключиться на профиль вместо env vars.   -  person strongjz    schedule 09.10.2017
comment
Я var_dumpобработал оба массива, переданные S3Client::factory и $s3->putObject, и они выглядят так, как должны. Я также только что извлек учетные данные с помощью getCredentials от клиента, и он вернул правильные значения. Так что это не может быть причиной. Спасибо, в любом случае!   -  person iGEL    schedule 09.10.2017


Ответы (3)


Я обнаружил проблему благодаря этому ответу. Я пытаюсь установить ACL 'public-read', но не предоставил себе s3:PutObjectAcl, только s3:PutObject. Изменение любого из них устраняет проблему.

В любом случае спасибо за помощь.

person iGEL    schedule 09.10.2017

В разделе «Политика IAM» добавьте S3:PutObjectAcl в разрешение, если вы установили S3:PutObject для действия.

person Dawn Menor    schedule 21.03.2018

Я столкнулся с тем же сообщением об ошибке, и оказалось, что мои корзины S3 были созданы не в том регионе.

person DOOManiac    schedule 31.05.2019