AWS SDK для PHP: ошибка получения учетных данных с сервера метаданных профиля экземпляра

Я пытаюсь отправить messeges SNS в android через web api. Загрузили и установили SDK с сайта http://aws.amazon.com/developers/getting-started/php/.

При запуске sample.php возникла следующая ошибка:

Fatal error: Uncaught exception 'Aws\Common\Exception\InstanceProfileCredentialsException' with message 'Error retrieving credentials from the instance profile metadata server. When you are not running inside of Amazon EC2, you must provide your AWS access key ID and secret access key in the "key" and "secret" options when creating a client or provide an instantiated Aws\Common\Credentials\CredentialsInterface object. ([curl] 28: Connection timed out after 5016 milliseconds [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)' in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php:85 Stack trace: #0 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\RefreshableInstanceProfileCredentials.php(52): Aws\Common\InstanceMetadata\InstanceMetadataClient->getInstanceProfileCredentials() #1 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\AbstractRefreshableCredentials.php(54): Aws\Common\Credentials\Refreshable in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php on line 85 

Небольшое руководство по этой теме поможет мне

В моем случае я использовал

 return DynamoDbClient::factory(array( 'version' => 'latest', 'region' => AWS_REGION, 'key' => AWS_KEY, 'secret' => AWS_SECRET )); 

который был в порядке с aws/aws-sdk-php версии 2.8.5, но когда композитор автоматически установил версию 3.2.0, я получил ошибку выше. Проблема в том, что я должен был изменить способ, которым я звонил

 return DynamoDbClient::factory(array( 'version' => 'latest', 'region' => AWS_REGION, 'credentials' => array( 'key' => AWS_KEY, 'secret' => AWS_SECRET, ) )); 

как описано здесь . Без изменения вызова apache php возвращался к ~/.aws/credentials файла ~/.aws/credentials с использованием переменной среды HOME, которая была пуста. Вы можете проверить его значение, запустив php -r 'var_dump(getenv("HOME"));' ,

Это связанная статья

Вы должны поместить файл .aws/credentials с вашей конфигурацией в домашний каталог веб-службы * обычно /var/www ), а не в домашний каталог зарегистрированного пользователя.

Вы можете найти, какой домашний каталог используется веб-службой, запустив echo getenv('HOME'); в php-файле на вашем сервере.

Вот шаги:

  1. Тип cd ~ К этому вы перейдете в домашний каталог.
  2. mkdir .aws
  3. sudo vi .aws/credentials
  4. Напишите следующие строки и сохраните файл.

     [default] aws_access_key_id = Your AWS Access Key aws_secret_access_key = Your AWS Secret Access Key 

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

Файл учетных данных должен быть в формате ini, но не иметь расширения .ini. Он должен иметь раздел «default», определяемый вашим ключом и секретом:

 $ less ~/.aws/credentials [default] aws_access_key_id = key aws_secret_access_key = secret 

Если вы указали другое имя раздела вместо значения по умолчанию, просто добавьте ключ profile к параметрам S3Client:

 [example] aws_access_key_id = key aws_secret_access_key = secret $s3Client = new \Aws\S3\S3Client([ 'version' => '2006-03-01', 'region' => $yourPreferredRegion, 'profile' => 'example', ]); 

Использование файла учетных данных или переменных среды – рекомендуемый способ предоставления учетных данных на вашем собственном сервере

И ответ @Anti также мне очень помог!

Если вы предпочитаете жесткий код, просто следуйте ответам @shadi.