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

Provide the AWS PHP SDK with credentials via Symfony DotEnv

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

我想使用通过环境变量提供的凭据对 AWS SDK 进行身份验证,并且我想使用 dotenv 组件来提供这些环境变量。

这应该是可能的:设置 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 环境变量是使用 aws sdk 自动验证的一种方法。而 DotEnv 应该把你的配置变成环境变量。

但是,当我在 .env.local.env 文件中设置这些变量时,出现以下错误:

Aws\Exception\CredentialsException: Error retrieving credentials from the instance profile metadata service.


这行不通:

.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 状态:

The SDK uses the getenv() function to look for the AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN environment variables.

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

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

这里有一些选项:

  1. call Dotenv())->usePutenv(true)(但正如 symfony 所述:请注意 putenv() 不是线程安全的,这就是此设置默认为 false 的原因)

  2. 为 aws 设置手动调用 putenv()

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