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

Я получаю следующую ошибку при попытке создать 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

0

Решение

Ваш ~/.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 или HOMEDRIVE а также HOMEPATH Переменные среды не заданы, библиотека не сможет найти ваш файл учетных данных.

Помимо возможности найти файл, он также должен быть доступен для чтения PHP и в формате INI (как описано выше).

редактировать

Из комментариев это звучит как HOME переменная окружения не установлена. Из-за этого библиотека не может найти ваш файл учетных данных. Есть несколько вариантов, куда идти отсюда.

Опция 1:

Исправьте ваш сервер так, чтобы переменная среды HOME была установлена ​​правильно. Вам нужно будет провести некоторое исследование о том, как это сделать наилучшим образом, поскольку решение может сильно зависеть от конфигурации сервера / 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. ideally you should never
// use the env() method outside of a config file, though, so I'd suggest adding
// a new config file that uses the env statements and using the config here.
$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

// the first parameter is the profile, the second parameter is the full path to
// your credentials file. You may want to add this to your .env file, and
// access using env()/config() instead of hardcoding here, though.
$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
));
}
4

Другие решения

Я не вижу точной причины, по которой вы получаете ошибку, но

Мне это не очень нравится, так как это приводит к хранению моих учетных данных
в настройке папки, где другие могут SFTP в.

Полагаю, вам, безусловно, нужно настроить роль IAM на консоли AWS, чтобы разрешить подключение к SNS из ваших экземпляров EC2. Таким образом, вам не нужно будет предоставлять какие-либо учетные данные

0

Из комментария @ Павана к его вопросу, в котором он показывает содержимое файла учетных данных в ~/.awsВроде там 2 файла. у меня есть только один файл

$ cat ~/.aws/credentials
[default]
aws_access_key_id = blablabla
aws_secret_access_key = blablabla
region = us-west-2
0