Я пытаюсь отправить сообщения SNS на Android через веб-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,
)
));
как задокументировано Вот. Без изменения вызова, апаш php возвращается к поиску ~/.aws/credentials
файл с использованием переменной среды HOME, которая была пустой. Вы можете проверить его значение, запустив php -r 'var_dump(getenv("HOME"));'
,
это это связанный пост
Вы должны разместить .aws/credentials
файл с вашей конфигурацией в домашнем каталоге веб-службы * обычно /var/www
) не в домашнем каталоге вошедшего в систему пользователя.
Вы можете узнать, какой домашний каталог использует ваш веб-сервис, запустив echo getenv('HOME');
в файле php на вашем сервере.
В моем случае мне пришлось использовать жестко закодированные учетные данные
$s3Client = new S3Client([
'region' => REGION,
'version' => '2006-03-01',
'credentials' => [
'key' => S3_KEY,
'secret' => S3_SECRETE,
],
]);
Смотрите больше деталей Вот:
Вот шаги:
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. Он должен иметь раздел «по умолчанию», определенный с вашим ключом и секретом:
$ 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.
Если это laravel и aws / aws-sdk-php-laravel sdk, то после настройки всех шагов и определения ключа в файле .env
Вы должны удалить конфигурационный кеш и восстановить его, выполнив следующие команды.
php artisan config:cache;
composer dump-autoload;
Вы можете попробовать эти строки:
$credentials = new Aws\Credentials\Credentials('key' , 'secret-key');
$s3 = new S3Client(['version' => 'latest','region' => 'ap-south-1','credentials'=>$credentials]);