Intereting Posts
Удаление комментариев в формате HTML с помощью PHP, но уход из условий Выберите записи со значениями до и после (но только одного) другого значения? Mysql Count, чтобы вернуть ноль, если нет совпадений Перенаправить все запросы в web / app.php в Symfony Является ли SHA-256 нечувствительным к регистру? Можно ли параметризовать имя таблицы в подготовленном заявлении? Публикация фотографии в FB приводит к ошибке при загрузке файла php: изменение эффектов mysql_real_escape_string на двоичные php аутентификации пользователей / фреймворков … какие варианты? Выбор последних 7 дней из Now () в MYSQL Как я могу заполнить выпадающий список, выбрав значение из другого раскрывающегося списка? PHP разделяет строку на последнем номере, вставляет дополнительную строку и объединяет новую строку SQL-инъекция через mysql_query Как запретить пользователю загружать или сохранять изображение? php / regex: "linkify" заголовки блога

Ошибка учетных данных AWS PHP SDK S

При попытке создания объекта 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