通过 Symfony DotEnv 为 AWS PHP SDK 提供凭证

问题描述

在使用 symfony/dotenv 4.3.11 和 aws/aws-sdk-PHP 3.173.13 的 Symfony 4.3 应用程序中:

我想使用通过环境变量提供的凭证对 AWS 开发工具包进行身份验证,并且我想使用 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 中的环境变量。使用 .env.local 中的 AWS_ACCESS_KEY_ID/SECRET,果然它显示为环境变量:

...
    [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
...

解决方法

aws php client documentation 声明:

开发工具包使用 getenv() 函数查找 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_SESSION_TOKEN 环境变量。

=> 它使用 getenv() 而不是 $_ENV

但 Symfony Dotenv 组件(默认情况下)只填充 $_ENV 而不会调用 putenv 因此您在 .env 文件中的设置不能被 getenv() 访问。

这里有一些选项:

  1. 调用 Dotenv())->usePutenv(true)(但正如 symfony 所说:注意 putenv() 不是线程安全的,这就是为什么此设置默认为 false)

  2. 手动调用 putenv() 专门用于 aws 设置

  3. 将 aws 客户端包装在您自己的 symfony 服务中并从 .env 注入设置