AWS SSO 登录凭证作为环境变量

问题描述 投票:0回答:5

使用

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 中记录此行为的位置;
  • 还从名为 something cache 的目录中读取数据似乎并不可靠;
  • 我不知道在具有不同配置的其他机器上工作有多么便携。

理想情况下,我希望得到以下答案:

  • 提供另一种更可靠的方式来获取这些环境变量;
  • 或者给出了一个合理的确认,即从缓存文件中解析这些变量的方法实际上是可以使用的。
amazon-web-services environment-variables command-line-interface aws-sts aws-sso
5个回答
32
投票

现在可以使用 AWS CLI 的内置功能来完成此操作。

只需运行

eval "$(aws configure export-credentials --profile your-profile-name --format env)"
,你就可以开始了。


0
投票

可以从 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库。


0
投票

我这里有两种可能的解决方案:

  1. 使用aws-vault之类的东西来公开凭证。
  2. 修改您的 docker 容器以使用默认凭证链并将您的
    ~./aws
    目录挂载到容器中。

0
投票

安装 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 结合使用的替代建议。


0
投票

我在构建 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/
© www.soinside.com 2019 - 2024. All rights reserved.