Правильный синтаксис для AWS S3 php-sdk «putObjectAcl»

#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
https://our-test-bucket.s3.us-east-2.amazonaws.com/800x600.jpg?acl
привела к /project/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php в строке 191

Исключение 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?acl
привела к 400 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"
        ]
    ]
];
  

(Изменение порядка было результатом тестирования, но не оказалось проблемой)