Загрузка файла AWS PHP SDK в S3 приводит к запутанным ошибкам

Итак, я попробовал несколько способов загрузить файл в свою учетную запись S3. Наконец обнаружил, что куда-то попал и БУМ - запутанная документация и странные сообщения об ошибках, которые, кажется, противоречат сами себе.

Хорошо, для начала я не использую композитор или что-то в этом роде, я делаю это по старинке:

require '/path/to/aws-autoload.php';

Теперь это загружается правильно, и я урезал автозагрузку, чтобы использовать только классы Common и S3 - не нужно все!

Затем я загружаю клиент S3 и учетные данные:

use Aws\S3\S3Client;
use Aws\Common\Credentials\Credentials;

Теперь код, чтобы начать волшебство:

$file = '/path/to/' . $filename;
$credentials = new Credentials('KEY', 'SECRET KEY');
$s3 = S3Client::factory(array('credentials' => $credentials));

try{
$s3->putObject(array(
    'Bucket' => 'sub.domain.com.s3.amazonaws.com',
    'Body'   => fopen($file, 'r'),
    'ACL'    => 'public-read',
));
} catch (S3Exception $e) {
     $result = array(
         'ok' => false,
         'descr' => 'There was an error uploading the file to S3 : ' . $filename
     );
}

Проблема, с которой я столкнулся, связана с самим «Ведром».

Когда я форматирую Bucket как sub.domain.com, я получаю следующее сообщение от AWS API:

Сообщение об ошибке AWS: адрес корзины, к которой вы пытаетесь получить доступ, должен быть указан с использованием указанной конечной точки. Пожалуйста, отправляйте все будущие запросы на эту конечную точку: «sub.domain.com.s3.amazonaws.com».

Теперь, когда я изменяю «Корзину», чтобы она соответствовала приведенному выше: sub.domain.com.s3.amazonaws.com

Я получаю следующее сообщение об ошибке:

Сообщение об ошибке AWS: указанный сегмент не существует

Я делаю что-то неправильно? Чего-то не хватает? К сожалению, документация AWS не совсем актуальна. В данный момент API, кажется, противоречит сам себе. Я знаю, что все ключи правильные, и все разрешения правильные. Он перешел с 301 - перенаправление на 404 - не найдено по собственному совету.

Любая помощь/совет будет принята с благодарностью. Мне кажется, что я немного хожу по кругу!


person JustSteveKing    schedule 07.10.2014    source источник
comment
Разве не используется только часть sub.domain в качестве примера? Я думаю, вы должны изменить это значение на то, что вы назвали своим ведром в первую очередь.   -  person Cyclonecode    schedule 07.10.2014
comment
Я уже сделал это, я установил sub.domain при публикации здесь, чтобы сделать это более общим и не выдавать сайт, на котором я работаю. Также для KEY и SECRET KEY установлены правильные значения.   -  person JustSteveKing    schedule 07.10.2014
comment
Вы пытались получить доступ к своему сегменту с помощью path-style URL, например http://s3.amazonaws.com/<bucket>?   -  person Cyclonecode    schedule 07.10.2014
comment
Да, тот же результат: <Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message><Bucket>sub.domain.com</Bucket><Endpoint>sub.domain.com.s3.amazonaws.com</Endpoint></Error>   -  person JustSteveKing    schedule 07.10.2014
comment
Если я перейду на sub.domain.com.s3.amazonaws.com, я получу общедоступный список содержимого этого сегмента. Однако SDK все еще поднимает шум.   -  person JustSteveKing    schedule 07.10.2014
comment
Вы проверили, чтобы не использовать недопустимый регион в своем URL, bucket.us-west-2.s3.amazoneaws.com более bucket.us-east-1.s3.amazoneaws.com   -  person Cyclonecode    schedule 07.10.2014
comment
Попробуйте использовать клиент php s3, чтобы проверить, действительно ли имя вашего ведра для ведра S3, isValidBucketName($bucketName);, я думаю, что проблема может быть в формате имени ведра.   -  person Cyclonecode    schedule 07.10.2014
comment
Убедитесь, что имя корзины допустимо docs.aws.amazon.com/AmazonS3. /latest/dev/BucketRestrictions.html в качестве корзины Amazon S3, совместимой с DNS.   -  person Cyclonecode    schedule 07.10.2014
comment
Если я использую регион в своем URL-адресе, я получаю эту ошибку: Указанное ведро не существует так же, как я получаю в SDK для имени ведра, не зависящего от региона.   -  person JustSteveKing    schedule 07.10.2014


Ответы (1)


Вот некоторые вещи, которые нужно перепроверить.

  1. Если сегмент был создан в определенном регионе (например, us-west-2), создайте экземпляр S3Client с этим регионом [..., 'region' => 'us-west-2', ...].
  2. Параметр 'Bucket' должен быть установлен точно так же, как называется ваша корзина (например, если ваша корзина называется «sub.domain.com», тогда параметру 'Bucket' должно быть присвоено значение 'sub.domain.com'). Не включайте регион или «s3.amazonaws.com» в параметр 'Bucket' (т. е. ведро != конечная точка). SDK автоматически определяет конечную точку (на основе региона клиента и предоставленного имени корзины) и при необходимости корректирует URL-адрес для стиля пути.
  3. Для операции PutObject требуется параметр 'Key', которого нет в приведенном выше примере кода.
person Jeremy Lindblom    schedule 07.10.2014