Я пытаюсь отправить 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-файле на вашем сервере.
Вот шаги:
cd ~
К этому вы перейдете в домашний каталог. mkdir .aws
sudo vi .aws/credentials
Напишите следующие строки и сохраните файл.
[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.