Ошибка при выполнении "PutObject" 400 неверный запрос aws - PullRequest
0 голосов
/ 25 марта 2020

Я очень новичок в работе с AWS, и я работаю с примером AWS, который дает использовать putObject, найденный здесь https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpPHP.html

Все, что я попытка на этом этапе - просто загрузить любой объект в мое хранилище S3, используя AWS SDK, как в примере, но я получаю сообщение об ошибке 400 Bad Request (полный вывод приведен ниже). Ведро, в которое я пытаюсь записать, намеренно не публикуется c, потому что я не хочу, чтобы все хранилище было доступно. Я не совсем уверен, является ли это проблемой, но если это так, я не уверен, как дать моему коду доступ для записи в корзину, и в документации нет примера для этого. Если это не проблема, то я не уверен, что еще может пойти не так.

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

Вывод ошибки:

Ошибка выполнения «PutObject» для «https://frank-transcribe-mediaconvert.s3.amazonaws.com/032420-test-upload.txt»; AWS Ошибка HTTP: ошибка клиента: PUT https://frank-transcribe-mediaconvert.s3.amazonaws.com/032420-test-upload.txt, в результате которого 400 Bad Request получен ответ: InvalidToken. Предоставленный токен неверен или другой (усеченный ...). - InvalidTokenПоставленный токен неверен или иным образом недействителен.

Вот мой код php:

<?php

    require 'vendor/autoload.php';

    use Aws\Sts\StsClient;
    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;

    $bucket = 'frank-transcribe-mediaconvert';
    $keyname = date('mdy') . '-test-upload.txt';

    $s3 = new S3Client([
        'version' => 'latest',
        'region'  => 'us-east-1'
    ]);

    try {
        // Upload data.
        $result = $s3->putObject([
            'Bucket' => $bucket,
            'Key'    => $keyname,
            'Body'   => 'Hello, world!',
            'ACL'    => 'public-read'
        ]);

        // Print the URL to the object.
        echo $result['ObjectURL'] . PHP_EOL;
    } catch (S3Exception $e) {
        echo $e->getMessage() . PHP_EOL;
    }

?>

1 Ответ

1 голос
/ 25 марта 2020

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

Следовательно, если вы не запускаете его на экземпляре AWS, который может аутентифицироваться по API по его роли IAM , вам придется передавать учетные данные клиенту S3.

Вот выдержка из документов :

$credentials = new Aws\Credentials\Credentials('key', 'secret');

$s3 = new Aws\S3\S3Client([
    'version'     => 'latest',
    'region'      => 'us-west-2',
    'credentials' => $credentials
]);

Вы правы, что «Ключ» в вашем коде - это имя файла (S3 видит себя как ключ -значение хранилища объектов, где каталог и имя файла являются ключом, а значение - содержимым файла, поэтому он называется ключом.

Однако , «ключ» для учетных данных - вместе с секретом - AWS ключи доступа, которые вы можете установить с помощью IAM. Если вы не знаете, как это сделать, я рекомендую вам прочитать Управление ключами доступа (консоль) в AWS документах.

Также обратите внимание, что пользователь IAM, который вы создаете, ключи доступа (ключ и секрет) для него должны иметь соответствующие разрешения, чтобы делать через S3 то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...