使用
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 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
目录挂载到容器中。安装 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
将 AWS SSO 与 docker 结合使用的替代建议。
我在构建 docker 镜像时遇到了类似的问题,通过以下方式解决了:
# Get temporary AWS credentials
temp_creds=`aws configure export-credentials --profile readonly-profile`
echo "[default]
aws_access_key_id=`echo $temp_creds | jq -r .AccessKeyId`
aws_secret_access_key=`echo $temp_creds | jq -r .SecretAccessKey`
aws_session_token=`echo $temp_creds | jq -r .SessionToken`
" > $build_folder/temp_aws_credentials
# Build the image
DOCKER_BUILDKIT=1 \
docker build \
--progress plain \
--secret id=aws_creds,src=$build_folder/temp_aws_credentials \
-t my_image_tag:latest \
$build_folder
# Clean up
rm $build_folder/temp_aws_credentials
然后在 Dockerfile 中:
RUN --mount=type=secret,id=aws_creds,dst=/home/.aws/credentials \
aws s3 cp s3://path/file /local/path/