PHP Загрузить файл в корзину Amazon S3 через предварительно подписанный URL

Я пытаюсь загрузить файл в корзину Amazon S3 через заранее подписанный URL-адрес, который я получил от третьей службы. Это означает, что я не создаю этот URL. Я просмотрел документацию AWS, но не могу собрать все вместе. Вот что я имею в виду.

В настоящее время мой код выглядит так. Обратите внимание, что $key - это предварительно подписанный URL.

use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use GuzzleHttp\Psr7\Stream;
use GuzzleHttp\Psr7\CachingStream;

$client = new GuzzleHttp\Client(['verify' => false ]);
$response = $client->get($image_url);
$s3 = new Aws\S3\S3Client([
  'version'   => 'latest',
  'region'    => 'eu-west-1',
  'signature_version' => 'v4'
  )        
]);

$s3->putObject([
  'Bucket'        => '<BUCKET NAME HERE>',
  'Key'           => $key,
  'ContentLength' => get_headers($image_url,1)['Content-Length'],
  'ContentType'   => 'image/png',
  'Body'          => $response->getBody(),
  'ACL'           => 'private-write',
]);

В настоящее время я получаю эту ошибку: PHP Fatal error: Uncaught Aws\Exception\CredentialsException: Error retrieving credentials from the instance profile metadata service. (cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://169.254.169.254/latest/meta-data/iam/security-credentials/) in <PATH TO SITE>\vendor\aws\aws-sdk-php\src\Credentials\InstanceProfileProvider.php:242

Любая помощь горячо приветствуется.


person ivan marchenko    schedule 31.05.2021    source источник


Ответы (1)


Проблема здесь в том, что вы не передали учетные данные, то есть AccessKey и Secret Key, при инициализации клиента S3.

$s3 = new Aws\S3\S3Client([
  'version'   => 'latest',
  'region'    => 'eu-west-1',
  'signature_version' => 'v4',
  'credentials' => [
            'key'    => 'access-key',
            'secret' => 'secret-key' ,
        ]
  )        
]);

Если вы хотите передать AccessKey и SecretKey из файла, а не жестко закодированные строки, вы можете проверить принял ответ здесь.

person bottomofeverything    schedule 31.05.2021
comment
У меня нет доступа к секретному ключу, я его даже не знаю, но у меня есть заранее подписанный URL-адрес, который выглядит так raw/764ae0a75654fe9cb468c2b35142499b.png. Стороннее программное обеспечение, которое предоставило мне заранее подписанный URL, не выдаст мне секретный ключ по очевидным причинам. - person ivan marchenko; 31.05.2021
comment
Если у вас есть предварительно подписанный URL-адрес, все, что вам нужно сделать, это сделать HTTP-запрос с методом PUT для загрузки объекта. - person bottomofeverything; 01.06.2021
comment
Предписанный URL-адрес - это скорее URI, что означает, что я не могу публиковать его, однако у меня есть URL-адрес корзины s3 от стороннего программного обеспечения. Могу ли я указать этот URL-адрес и передать предварительно подписанный URL-адрес как key? - person ivan marchenko; 01.06.2021
comment
Я думаю, что URL-адрес стороннего программного обеспечения, о котором вы говорите, является предварительно подписанным URL-адресом, если он предоставлен вам для загрузки объектов, поэтому я думаю, что то, что вы говорите, кажется правильным. - person bottomofeverything; 02.06.2021