Предоставьте AWS PHP SDK с учетными данными через Symfony DotEnv

В приложении Symfony 4.3 с использованием symfony / dotenv 4.3.11 и aws / aws-sdk-php 3.173.13:

Я хотел бы аутентифицировать AWS SDK, используя учетные данные, предоставленные через переменные среды, и я хотел бы использовать компонент dotenv для предоставления этих переменных среды.

Это должно быть возможно: установка переменных среды AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY - это один из способов автоматической аутентификации с помощью aws sdk. И DotEnv должен превратить вашу конфигурацию в переменные среды.

Однако, когда я устанавливаю эти переменные в своих файлах .env.local или .env, я получаю следующую ошибку:

Aws \ Exception \ CredentialsException: ошибка при получении учетных данных из службы метаданных профиля экземпляра.


Это не работает:

.env.local:

AWS_ACCESS_KEY_ID=XXX
AWS_SECRET_ACCESS_KEY=XXXXXX
$  ./bin/console command-that-uses-aws-sdk

Это работает:

$ AWS_ACCESS_KEY_ID=XXX AWS_SECRET_ACCESS_KEY=XXXXXX ./bin/console command-that-uses-aws-sdk

Информация об отладке:

Я сделал команду symfony, которая выводит переменные окружения в $_ENV. С AWS_ACCESS_KEY_ID / SECRET в .env.local, конечно же, он отображается как переменная среды:

...
    [SYMFONY_DOTENV_VARS] => MEQ_ENV,APP_ENV,APP_SECRET,DATABASE_URL,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGION,AWS_ACCOUNT
    [AWS_ACCESS_KEY_ID] => XXX
    [AWS_SECRET_ACCESS_KEY] => XXXXXX
...

person amacrobert    schedule 22.02.2021    source источник


Ответы (1)


В документации клиента php aws говорится :

SDK использует функцию getenv () для поиска переменных среды AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY и AWS_SESSION_TOKEN.

= ›Он использует getenv(), а не $_ENV.

Но компонент Symfony Dotenv (по умолчанию) просто заполняет $_ENV и не вызывает putenv, поэтому ваши настройки в файлах .env недоступны для getenv().

Вот несколько вариантов:

  1. call Dotenv())->usePutenv(true) (но, как утверждает symfony: помните, что putenv() не является потокобезопасным, поэтому этот параметр по умолчанию равен false)

  2. вызов putenv() вручную исключительно для настройки aws

  3. Оберните клиент aws в свой собственный сервис Symfony и вставьте настройки из .env

person simon.ro    schedule 22.02.2021