问题描述
在使用 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()
访问。
这里有一些选项:
-
调用
Dotenv())->usePutenv(true)
(但正如 symfony 所说:注意putenv()
不是线程安全的,这就是为什么此设置默认为 false) -
手动调用
putenv()
专门用于 aws 设置 -
将 aws 客户端包装在您自己的 symfony 服务中并从 .env 注入设置