假设aws login sso
登录成功
Successully logged into Start URL: *****
从这里开始,我想启动我的服务,它需要设置以下环境变量和AWS凭据:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
如何将这些变量提取到当前shell中?
我目前正在使用的解决方案:
我发现了一个可能的解决方案,适用于我:我注意到,在我登录并运行aws sts get-caller-identity
后,它会在~/.aws
目录中创建文件,从那里它可以用脚本解析:
#!/usr/bin/env bash
set -e
AWS_ACCESS_KEY_ID=$(cat ~/.aws/cli/cache/*.json | jq '.Credentials.AccessKeyId' --raw-output)
AWS_SECRET_ACCESS_KEY=$(cat ~/.aws/cli/cache/*.json | jq '.Credentials.SecretAccessKey' --raw-output)
AWS_SESSION_TOKEN=$(cat ~/.aws/cli/cache/*.json | jq '.Credentials.SessionToken' --raw-output)
>&2 echo "✨ you need to eval output of this script in your current window:"
>&2 echo ' eval $('$0')'
>&2 echo ""
echo "export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}"
echo "export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}"
echo "export AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}"
在用eval $(./parse-aws-cache.sh)
评估脚本的输出后,设置了环境变量,我可以启动使用AWS凭证的服务。
它今天对我有效,但是我对这个解决方案有一些疑问:
- 我看不出这个行为在AWS中的记录;
- 还从名为的目录中读取缓存似乎不可靠;
- 我不知道在其他机器上使用不同的配置有多便携。
理想情况下,我希望得到的答案是:
- 提供了另一种更可靠的方式获取这些环境变量;
- 或给出合理的确认,从缓存文件解析这些变量的方法实际上是可以使用的。
现在可以使用AWS CLI的内置功能来完成。
简单地运行eval "$(aws configure export-credentials --profile your-profile-name --format env)"
,你应该很好去。
凭证值可以从SDK中获取,而不是解析缓存文件。
下面是打印AWS凭证的Javascript代码:
const { fromSSO } = require("@aws-sdk/credential-provider-sso");
const getCredentials = fromSSO({ profile: "🛠-MY-AWS-PROFILE" });
getCredentials().then(credentials => {
console.error('✨ you need to eval output of this script in your current window');
console.error(` eval $(node ${__filename})`);
console.log(`export AWS_ACCESS_KEY_ID=${credentials.accessKeyId}`);
console.log(`export AWS_SECRET_ACCESS_KEY=${credentials.secretAccessKey}`);
console.log(`export AWS_SESSION_TOKEN=${credentials.sessionToken}`);
}).catch(e => {
console.error('Error parsing credentials', e);
});
唯一的问题是它依赖于NodeJs,并且需要安装SDK库。
我有两个可能的解决方案:
- 使用类似aws-vault的东西来暴露凭证。
- 修改docker容器以使用默认凭证链,并将
~./aws
目录挂载到容器中。
安装aws2-wrap之后,我可以导出AWS环境变量并使用
将它们传递给容器eval "$(aws2-wrap --export)"
docker run -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN -e AWS_DEFAULT_REGION my-image-name
我在Docker Github问题中发现了aws2-wrap,以增加对AWS SSO的支持。关于如何通过创建docker context
与docker一起使用AWS SSO,请参阅该线程的另一个建议。