Разрешение Amazon S3 copyObject - программирование
Подтвердить что ты не робот

Разрешение Amazon S3 copyObject

У меня есть все разрешения.

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

Я использую aws-sdk-php-2 для размещения и копирования объектов в ведро.

http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html

Положительный код работает отлично

                $client->putObject(array(
                'Bucket'     => 'kiosk',
                'Key'        => 'test/orders/test.csv',
                'SourceFile' => $sourcePath,
            ));

После проверки, если объект создан на S3 через https://console.aws.amazon.com/s3, я выполняю следующий скрипт.

        $result = $client->copyObject(array(
        'Bucket' => 'kiosk',
        'CopySource' => 'test/orders/test.csv',
        'Key' => 'test/test.csv',
    ));

И я получаю фатальную ошибку:

Fatal error: Uncaught Aws\S3\Exception\S3Exception: AWS Error Code: AllAccessDisabled, Status Code: 403, AWS Request ID: XXX, AWS Error Type: client, AWS Error Message: All access to this object has been disabled, User-Agent: aws-sdk-php2/2.2.1 Guzzle/3.3.1 curl/7.19.7 PHP/5.4.13 thrown in phar:///usr/share/pear/AWSSDKforPHP/aws.phar/src/Aws/Common/Exception/NamespaceExceptionFactory.php on line 89

После загрузки файла вручную console.aws.amazon.com/s3 Я вижу другую ошибку при попытке копирования:

Fatal error: Uncaught Aws\S3\Exception\AccessDeniedException: AWS Error Code: AccessDenied, Status Code: 403, AWS Request ID: XXX, AWS Error Type: client, AWS Error Message: Access Denied, User-Agent: aws-sdk-php2/2.2.1 Guzzle/3.3.1 curl/7.19.7 PHP/5.4.13 thrown in phar:///usr/share/pear/AWSSDKforPHP/aws.phar/src/Aws/Common/Exception/NamespaceExceptionFactory.php on line 89

Я также пытаюсь установить права доступа к файлам и папкам через console.aws.amazon.com/s3: Грантополучатель: все, открывать/загружать и просматривать разрешения и редактировать разрешения

Но все та же ошибка.

4b9b3361

Ответ 1

Я знаю, что это старый вопрос, но недавно я столкнулся с той же проблемой, когда работал над устаревшим проектом.

$this->client->copyObject([
    'Bucket'        => $this->bucket,
    'CopySource'    => $file,
    'Key'           => str_replace($source, $destination, $file),
]);

Все остальные мои вызовы S3 сработали, за исключением copyObject продолжал copyObject ошибку ACCESS DENIED. После некоторых раскопок я наконец понял, почему.

AWS v2 SDK CopySource Documentation

Я передавал только ключ и делал предположение, что передаваемая корзина - это то, что будет использовать и источник, и пункт назначения. Оказывается, это неверное предположение. Источник должен иметь префикс имени контейнера.

Вот мое решение:

$this->client->copyObject([
    'Bucket'        => $this->bucket,
    // Added the bucket name to the copy source
    'CopySource'    => $this->bucket.'/'.$file,
    'Key'           => str_replace($source, $destination, $file),
]);

Он говорит "Доступ запрещен", потому что он думает, что первая часть вашего ключа/папки на самом деле является именем корзины, которой либо не существует, либо у вас действительно нет доступа к ней.

Надеюсь, что это поможет нескольким людям!

Ответ 2

Узнал, в чем проблема. будучи новичком AWS, я немного боролся здесь, пока не понял, что каждая политика для пользователей, которых вы устанавливаете, должна четко разрешать службу, которую вы используете.

В этом случае я не разрешил пользователю разрешаться на S3.

Перейдите к IAM, затем перейдите к пользователям и нажмите на конкретного пользователя, у которого есть учетные данные, которые вы используете. Оттуда перейдите на вкладку "Разрешения", затем нажмите "Прикрепить политику пользователя" и найдите политику S3 в шаблоне выбора политики. Это должно решить вашу проблему.

Надеюсь, что это поможет!

Ответ 3

Популярный ответ был на месте, но все еще имел проблемы. Пришлось включить опцию ACL.

$this->client->copyObject([
  'Bucket'        => $this->bucket,
  // Added the bucket name to the copy source
  'CopySource'    => $this->bucket.'/'.$file,
  'Key'           => str_replace($source, $destination, $file),
  'ACL'           => 'public-read'
]);

ACL может принимать одно из следующих значений: "ACL" => "private | public-read | public-read-write | authenticated-read | aws-exec-read | bucket-owner-read | bucket-owner-full-control",