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

Я пытаюсь отправить сообщения 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

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


person Ravindra    schedule 10.12.2014    source источник
comment
Это означает, что вы неправильно настроили свои учетные данные. См. Предоставление учетных данных для SDK из Руководство пользователя AWS SDK для PHP.   -  person Jeremy Lindblom    schedule 10.12.2014
comment
Я уже настроил файл /.aws/credentials с AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, как упоминалось здесь. Все еще не работает   -  person Ravindra    schedule 11.12.2014
comment
@Ravindra Вы когда-нибудь находили решение? У меня такая же проблема   -  person Ben Sinclair    schedule 16.03.2015
comment
@JeremyLindblom Я серьезно борюсь с документацией по созданию этого единственного файла. Я запускаю экземпляр EC2 и через Putty пытался sudo nano ~/.aws/credentials, sudo mkdir /.aws + cd /.aws + sudo nano credentials - ничего не хочет работать, и в сети мало информации. Любые идеи?   -  person J Young    schedule 18.04.2015
comment
Файлы учетных данных лучше всего использовать для локальных сред разработки. Я бы использовал учетные данные роли IAM на EC2: docs.aws.amazon.com/aws-sdk-php/guide/latest/   -  person Jeremy Lindblom    schedule 20.04.2015
comment
Проблема, однако, в том, что ваш HOME может не быть там, где вы думаете, когда вы используете PHP (т.е. посмотрите, что getenv('HOME') возвращает в вашем приложении). Возможно, вам потребуется переместить файл или вызвать _ 2_ в качестве временного решения. (Однако, как я сказал в последнем комментарии, вы должны использовать учетные данные роли IAM, если вы размещены на EC2.)   -  person Jeremy Lindblom    schedule 20.04.2015
comment
Для меня проблема заключалась в том, что когда я копировал свою базу данных MySQL на новый сервер, зашифрованное значение BackWPup для ключа доступа S3 больше не работал. Мне нужно было зайти в настройки BackWPup и снова указать ключ.   -  person Ryan    schedule 11.11.2019


Ответы (9)


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

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 с использованием переменной среды HOME, которая была пуста. Вы можете проверить его значение, запустив php -r 'var_dump(getenv("HOME"));'.

Это связанное сообщение

person Shadi    schedule 23.07.2015
comment
Это избавило меня от огромной головной боли. - person vcardillo; 28.08.2015
comment
Вау, им удалось убрать эту невероятно важную деталь из своих руководств по SES ... Спасибо - person Jeffrey Cordero; 13.07.2016
comment
Ах я вижу. Поэтому с моим логином сработало из кли, а не другое! - person Nigel Atkinson; 29.01.2019

В моем случае мне пришлось использовать жестко заданные учетные данные

$s3Client = new S3Client([
    'region' => REGION,
    'version' => '2006-03-01',
    'credentials' => [
        'key'    => S3_KEY,
        'secret' => S3_SECRETE,
    ],
]);

Дополнительные сведения см. здесь:

person elegant-user    schedule 15.02.2018

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

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

person Anti    schedule 05.03.2015
comment
echo getenv('HOME'); верните null мне, используя экземпляр Docker php apache :( - person GusDeCooL; 21.08.2020

Я пытался использовать файл учетных данных и получил ту же ошибку, this парень на 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.

person Edson Horacio Junior    schedule 08.02.2017

Вот шаги:

  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
    
person Dibya Sahoo    schedule 06.04.2017
comment
Это отлично работает, если вы пытаетесь использовать AWS SDK в сценариях командной строки. - person apokryfos; 10.05.2017
comment
Чтобы сохранить и выйти из vi - нажмите esc и введите: wq, а затем нажмите Enter. Или если вы ошиблись при наборе текста. Чтобы выйти без сохранения vi - нажмите esc и введите: q! а затем нажмите ввод. - person Bilbo Baggins; 24.04.2019

Возможно, это связано с тем, что файл конфигурации не был опубликован.

Обязательно опубликуйте конфигурационный файл:

php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"

Чтобы проверить, в чем проблема, просто очистите файл config.

php artisan config:clear

Если он работает с очищенным кешем, проблема будет в этом.

person MichaelHoughton    schedule 21.07.2019

предполагая, что сервер расположен на AWS EC2 (вероятно, то же самое для ECS и эластичного beanstalk), правильный способ решения этой проблемы - вообще не хранить учетные данные.

вместо этого сделайте следующее:

  1. создать роль IAM (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)
  2. добавить соответствующие разрешения в политику ролей (в этом случае отправить сообщение SNS)
  3. назначить роль экземпляру EC2 (настройки экземпляра = ›Присоединить / заменить роль IAM)

таким образом вы не оставляете никаких конфиденциальных данных в своем коде.

person Nir    schedule 25.06.2020

Если это laravel и aws / aws-sdk-php-laravel sdk, то после настройки всего шага и определения ключа в файле .env вам необходимо удалить кеш конфигурации и перестроить его, выполнив следующие команды.

php artisan config:cache;
composer dump-autoload;
person JenuJ    schedule 13.02.2019

Вы можете попробовать эти строки:

$ credentials = new Aws \ Credentials \ Credentials ('ключ', 'секретный ключ');

$ s3 = новый S3Client (['версия' => 'последний', 'регион' => 'ap-south-1', 'credentials' => $ credentials]);

person Narayan    schedule 25.01.2019