Не удалось создать экземпляр \Aws\Ec2\Ec2Client

Попытка создать экземпляр ec2client w.r.t

$ec2Client = \Aws\Ec2\Ec2Client::factory(array(
    'profile' => 'default',
    'region'  => 'us-west-2',
    'version' => '2014-10-01'
));

но вылетает с ошибкой

Uncaught exception 'Aws\Common\Exception\CredentialsException' with message 'Could not load credentials.'

У меня есть :

cat ~/.aws/credentials 

[default]
aws_access_key_id = xxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxx

Я использую aws-sdk через композитор "aws/aws-sdk-php": "3.*@dev".

Изменить 1): я пытаюсь это сделать на своей локальной машине разработки.

Изменить 2): я пробовал это:

 use Aws\Common\Credentials\InstanceProfileProvider;
    $profile= new InstanceProfileProvider(['profile'=>'default']);
    $ec2Client = \Aws\Ec2\Ec2Client::factory(array(
        'region'  => 'us-west-2',
        'version' =>'2014-10-01',
        'credentials' => $profile
    ));

Это дает мне другую ошибку:

'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 error 28: Connection timed out after 1000 milliseconds)' in .. /InstanceProfileProvider.php:9 ..

Это создает у меня впечатление, что профили учетных данных существуют только тогда, когда приложение запускается из облачного экземпляра AWS! Что делает бесполезной идею профилей (которые предназначены для среды разработки)

Изменить 3)

После отладки кажется, что SDK с профилями учетных данных не работает или не соответствует ожиданиям. И credential profiles, и environment variable зависят от переменных окружения. Если переменные среды отключены, обе не будут работать.

Возможный обходной путь:

а) Включить переменные среды

б) Установить переменную HOME evn

putenv('HOME=/Users/yourname');
$ec2Client = \Aws\Ec2\Ec2Client::factory(array(
'region'  => 'us-west-2',
'version' => '2014-10-01'
));

Функция Profile init() имеет параметр имени файла, но нет очевидного способа передать путь к профилю учетных данных, отличный от переменной HOME env

Aws\Common\Credentails\Profiler->init()
public static function ini($profile = null, $filename = null){
...
}

Опять же, если вы не можете прочитать файл /Users/yourname/.aws/credentials, вам нужно немного его настроить.

chmod 644 /Users/yourname/.aws/credentials


person sakhunzai    schedule 30.12.2014    source источник
comment
очень похоже на это: sdk для ошибки php при получении учетных данных из метаданных профиля экземпляра"> stackoverflow.com/questions/27400563/   -  person sakhunzai    schedule 30.12.2014


Ответы (2)


Вы должны поместить файл .aws/credentials в корень вашего веб-сервиса, а не в корень вашего пользователя ssh.

person Anti    schedule 05.03.2015

Вы должны поместить файл .aws/credentials с вашей конфигурацией в домашнюю директорию веб-сервиса.

Поместите это в какой-нибудь файл PHP вашего сайта

echo getenv('HOME');

затем в этом каталоге:

mkdir .aws
touch credentials
nano credentials

И туда нужно вставить содержимое (в ключах кавычки не нужны):

[default]
aws_access_key_id     = xxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxx

И это должно сделать это!


Изменить: как говорит sakhunzai в комментарии (спасибо!), echo getenv('HOME') иногда может возвращать значение null, если это произойдет, он предлагает следующее решение: «Однако из командной строки php -i |grep HOME дает мне правильный домашний каталог пользователя "

Так что имейте это в виду.

person Franco Risso    schedule 10.06.2015
comment
echo getenv('HOME'); возвращает ноль, если я не установил его putenv('HOME=/Users/yourname'); Однако из командной строки php -i |grep HOME дает мне правильный домашний каталог пользователя - person sakhunzai; 11.06.2015