#php #amazon-web-services #amazon-s3 #php-7.1
#php #amazon-веб-сервисы #amazon-s3 #php-7.1
Вопрос:
Мне было поручено выяснить, как работает AWS PHP sdk, чтобы мы могли использовать его для размещения данных изображений клиентов на нашем веб-сервере. Мне удалось успешно протестировать большую часть функциональности создания, управления и загрузки данных в корзину, но когда я пытаюсь просмотреть содержимое, я получаю сообщение «доступ запрещен».
Зайдя в консоль управления, я выяснил, как установить разрешения, чтобы я мог просматривать файл, либо с помощью определенного правила хоста, либо установив как корзину, так и объект доступными для чтения во всем мире.
Однако, как бы я ни пытался следовать примерам в документации PHP sdk [limited], я, похоже, не могу установить значения ACL, используя php-код, предоставленный Amazon.
Их примеры просто перечислены вместо различных значений, и я попытался заполнить в них соответствующие данные для моей корзины, объекта и учетной записи, и это не сработало. Я пытался выполнить getObjectAcl
и отправить обратно что-то похожее на то, что было получено, и это не сработало. Я пытался просмотреть примеры онлайн, и то немногое, что я нашел, не работает.
Вот пример последнего, который я пробовал:
$params = [
'ACL' => 'public-read',
'AccessControlPolicy' => [
'Grants' => [
[
'Grantee' => [
'DisplayName' => 'Owner',
'ID' => $awsId,
'Type' => "CanonicalUser"
],
'Permission' => "FULL_CONTROL"
],
[
'Grantee' => [
'DisplayName' => 'All Users',
'URI' => "http://acs.amazonaws.com/groups/global/AllUsers",
'Type' => "Group"
],
'Permission' => "READ"
],
],
'Owner' => [
'ID' => $awsId
]
],
'Bucket' => "our-test-bucket",
'Key' => "800x600.jpg"
];
$result = $awsSdk->getS3Client()->putObjectAcl($params);
Результирующий вывод:
Неустранимая ошибка: неперехваченное исключение ‘Aws S3ExceptionS3Exception’ с сообщением ‘Ошибка при выполнении «PutObjectAcl» на «https://our-test-bucket.s3.us-east-2.amazonaws.com/800×600.jpg?acl«; Ошибка AWS HTTP: ошибка клиента:
PUT
привела к /project/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php в строке 191
https://our-test-bucket.s3.us-east-2.amazonaws.com/800x600.jpg?aclИсключение Aws S3ExceptionS3Exception: ошибка при выполнении «PutObjectAcl» на «https://our-test-bucket.s3.us-east-2.amazonaws.com/800×600.jpg?acl«; Ошибка AWS HTTP: Ошибка клиента:
PUT
привела к
https://our-test-bucket.s3.us-east-2.amazonaws.com/800x600.jpg?acl400 Bad Request
ответу:MalformedACLError
предоставленный вами XML не был исправлен (усечен …) MalformedACLError (клиент): предоставленный вами XML был неправильно сформирован или не соответствовал нашей опубликованной схеме —MalformedACLError
Предоставленный вами XML был неправильно сформирован или не соответствовал нашей опубликованной схеме24661919936c2dadft/***********************************************= в /project/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php в строке 191
Комментарии:
1. Используете ли вы достаточно современный AWS PHP SDK?
2. загружено 4 дня назад
Ответ №1:
Мне удалось поместить трассировку в функцию guzzle html messageTrait withHeader(), чтобы я мог просматривать исходящий xml в потоке php. Затем я сравнил результат с примерами xml, которые я нашел в разных местах в поиске Google, и методом проб и ошибок при сравнениях я проследил проблему вплоть до ‘DisplayName’ => ‘All Users’ в групповом предоставлении. Удалите эту строку, и, похоже, она работает.
$pubAcl = [
'Owner' => [
'ID' => $awsId,
'DisplayName' => 'Owner'
],
'Grants' => [
[
'Grantee' => [
'ID' => $awsId,
'DisplayName' => 'Owner',
'Type' => "CanonicalUser"
],
'Permission' => "FULL_CONTROL"
],
[
'Grantee' => [
'URI' => "http://acs.amazonaws.com/groups/global/AllUsers",
'Type' => "Group"
],
'Permission' => "READ"
]
]
];
(Изменение порядка было результатом тестирования, но не оказалось проблемой)