При попытке создания объекта SNSClient
возникает SNSClient
.
InstanceProfileCredentialsException in InstanceMetadataClient.php line 85: 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. (Client error response [status code] 404 [reason phrase] Not Found [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)
Я не понимаю, почему у меня эта ошибка, когда у меня есть aws.php
в папке config моей настройки laravel. Здесь хранятся ключ доступа и секретный ключ.
Мне это не очень нравится, поскольку это приводит к тому, что мои учетные данные сохраняются в настройках папки, в которые может входить SFTP.
У меня также есть учетные данные aws и конфигурационные файлы в корневой папке сервера в пути следующим образом: ~/.aws/
но по какой-то причине приложение не удовлетворено.
Вот как выглядит мой код:
public function about(){ // Instantiate a client with the credentials from the project1 profile $snsClient = SnsClient::factory(array( 'profile' => 'default', 'region' => 'us-west-2', )); // Get the application's endpoints $iOS_AppArn = "arn:aws:sns:us-west-2:235418406768:app/APNS_SANDBOX/ClashTarget"; $iOS_model = $snsClient->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $iOS_AppArn)); }
Обратите внимание, что я использую профиль по default
который должен принимать учетные данные из корневого каталога aws, где хранятся файлы конфигурации и учетных данных.
На данный момент, как временное решение, я сделал это: http://blog.ianholden.com/aws-s3-with-php-on-apache/, который заставляет все работать, но я не доволен наличием ключей мандата, код приложения. Это не так.
Может ли кто-нибудь помочь мне решить эту проблему?
Обновление 1: Комментарий: содержимое конфигурации в ~ / .aws / Это содержимое конфигурационного файла в папке ~/.aws/
[default] output = json region = us-west-2
Ваш файл ~/.aws/credentials
должен выглядеть следующим образом:
[default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY [project1] aws_access_key_id = ANOTHER_AWS_ACCESS_KEY_ID aws_secret_access_key = ANOTHER_AWS_SECRET_ACCESS_KEY
В библиотеке используется следующая функция, чтобы определить каталог для поиска файла .aws/credentials
:
private static function getHomeDir() { // On Linux/Unix-like systems, use the HOME environment variable if ($homeDir = getenv('HOME')) { return $homeDir; } // Get the HOMEDRIVE and HOMEPATH values for Windows hosts $homeDrive = getenv('HOMEDRIVE'); $homePath = getenv('HOMEPATH'); return ($homeDrive && $homePath) ? $homeDrive . $homePath : null; }
Как вы можете видеть, если переменные окружения HOME
или HOMEPATH
и HOMEPATH
не установлены, библиотека не сможет найти ваш файл учетных данных.
Помимо возможности найти файл, он также должен быть доступен для чтения PHP и в формате INI (как описано выше).
Из комментариев, похоже, что переменная среды HOME
не установлена. Из-за этого библиотека не может найти ваш файл учетных данных. Есть несколько вариантов того, куда идти отсюда.
Опция 1:
Исправьте сервер так, чтобы переменная среды HOME была правильно установлена. Вам нужно будет сделать некоторые исследования по наилучшему способу сделать это, так как решение может сильно зависеть от конфигураций server / apache / php …
Вариант 2:
Поскольку вы используете Laravel 5, вы можете добавить свои учетные данные в ваш .env
файл, а затем получить к ним доступ в коде. Так, например, добавьте следующие две строки в конец вашего .env
файла:
AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
Теперь в вашем коде вы можете:
public function about() { // add "use Aws\Credentials\Credentials;" at the top of your file // the env() method reads the values from the .env file $credentials = new Credentials(env('AWS_ACCESS_KEY_ID'), env('AWS_SECRET_ACCESS_KEY')); // if using the 'credentials' key, do not use the 'profile' key $snsClient = SnsClient::factory(array( 'region' => 'us-west-2', 'credentials' => $credentials )); }
Вариант 3:
Вызовите метод CredentialProvider::ini()
и перейдите в профиль и полный путь к вашему ini-файлу. Это обойдется без необходимости в библиотеке, чтобы попытаться определить домашний каталог.
public function about() { // add "use Aws\Credentials\CredentialProvider;" at the top of your file // first parameter is the profile, second parameter is the full path to your credentials file $credentials = CredentialProvider::ini('default', '/root/.aws/credentials'); // if using the 'credentials' key, do not use the 'profile' key $snsClient = SnsClient::factory(array( 'region' => 'us-west-2', 'credentials' => $credentials )); }
Я не вижу точно, почему вы получаете ошибку, но
Мне это не очень нравится, поскольку это приводит к тому, что мои учетные данные сохраняются в настройках папки, в которые может входить SFTP.
Полагаю, вам обязательно нужно настроить роль IAM на консоли AWS, чтобы разрешить подключение к SNS из вашего экземпляра EC2. Таким образом, вам не нужно будет предоставлять какие-либо учетные данные
Из комментария @ Pavan по его вопросу, в котором он показывает содержимое файла учетных данных в ~/.aws
, кажется, что там есть 2 файла. У меня только один файл
$ cat ~/.aws/credentials [default] aws_access_key_id = blablabla aws_secret_access_key = blablabla region = us-west-2