🔐
AWS SSO のログイン情報を credentials ファイルに反映する
はじめに
AWS CLI の aws sso
コマンドで SSO ログインしたとき、その認証情報は ~/.aws/credentials ファイルには書き込まれません。
AWS を利用するライブラリが ~/.aws/credentials ファイルからは認証情報を取得できても SSO の認証情報は取得しないような実装になっている場合、 AWS に SSO ログインしても、そのライブラリでは認証情報を利用できません。
AWS CLI には SSO の認証情報から AWS_ACCESS_KEY_ID や AWS_SECRET_ACCESS_KEY などの値を取得できる仕組みがあるため、そこで取得した情報を ~/.aws/credentials ファイルに反映させれば、上記のようなライブラリが正しく動作するようになります。
これを行うスクリプトは以下のようになります。
update-aws-credentials.sh
#!/bin/bash
# Description:
# SSO ログインした AWS の認証情報をもとに ~/.aws/credentials ファイルを更新する。
set -e -u -o pipefail
# jq コマンドが必要なので存在確認
if ! command -v jq > /dev/null ; then
echo "jq command is required." 1>&2
exit 1
fi
# 事前に SSO ログインしたプロファイルを AWS_PROFILE という名前で設定済みであることを確認
if [ -z "${AWS_PROFILE:+UNDEF}" ]; then
echo "AWS_PROFILE environment variable must be defined." 1>&2
exit 1
fi
# SSO のログイン情報を取得
SSO_ACCOUNT_ID=$(aws configure get sso_account_id --profile ${AWS_PROFILE})
SSO_ROLE_NAME=$(aws configure get sso_role_name --profile ${AWS_PROFILE})
SSO_REGION=$(aws configure get sso_region --profile ${AWS_PROFILE})
SSO_ACCESS_TOKEN=
OIFS="$IFS"
IFS=$'\n'
for file in $(find ~/.aws/sso/cache -type f ! -name "botocore*.json"); do
# echo "file = $file"
RESULT=$(cat "${file}" | jq -r '.accessToken | select (. != null)')
if [ ! -z "${RESULT}" ]; then
# echo "Result: ${RESULT}"
SSO_ACCESS_TOKEN=${RESULT}
break
fi
done
IFS="$OIFS"
if [ -z "${SSO_ACCOUNT_ID}" ]; then
echo "Invalid SSO_ACCOUNT_ID" 1>&2
exit 1
fi
if [ -z "${SSO_ROLE_NAME}" ]; then
echo "Invalid SSO_ROLE_NAME" 1>&2
exit 1
fi
if [ -z "${SSO_REGION}" ]; then
echo "Invalid SSO_REGION" 1>&2
exit 1
fi
if [ -z "${SSO_ACCESS_TOKEN}" ]; then
echo "Invalid SSO_ACCESS_TOKEN" 1>&2
exit 1
fi
# ログイン情報を取得
CREDENTIALS=$(aws sso get-role-credentials \
--account-id "${SSO_ACCOUNT_ID}" \
--role-name "${SSO_ROLE_NAME}" \
--region "${SSO_REGION}" \
--access-token "${SSO_ACCESS_TOKEN}" \
--profile "${AWS_PROFILE}"
)
AWS_ACCESS_KEY_ID=$(echo "${CREDENTIALS}" | jq -r '.roleCredentials.accessKeyId')
AWS_SECRET_ACCESS_KEY=$(echo "${CREDENTIALS}" | jq -r '.roleCredentials.secretAccessKey')
AWS_SESSION_TOKEN=$(echo "${CREDENTIALS}" | jq -r '.roleCredentials.sessionToken')
# ~/.aws/credentials ファイルへ反映
aws configure set aws_access_key_id "${AWS_ACCESS_KEY_ID}" --profile "${AWS_PROFILE}"
aws configure set aws_secret_access_key "${AWS_SECRET_ACCESS_KEY}" --profile "${AWS_PROFILE}"
aws configure set aws_session_token "${AWS_SESSION_TOKEN}" --profile "${AWS_PROFILE}"
echo "Finished successfully."
使い方
事前に aws sso login
コマンドで SSO ログイン済みであるとします。
aws sso login --profile <プロファイル名>
次に、 SSO ログインに使用したプロファイル名を AWS_PROFILE 環境変数に設定し、その状態で
スクリプトを実行します。
export AWS_PROFILE=<プロファイル名>
./update-aws-credentials.sh
# あるいは
AWS_PROFILE=<プロファイル名> ./update-aws-credentials.sh
スクリプトの処理が完了すると ~/.aws/credentials ファイルの中で対象のプロファイルの aws_access_key_id/aws_secret_access_key/aws_session_token の値が設定され、画面に Finished successfully. と表示されます。
Discussion