🔐

AWS SSO のログイン情報を credentials ファイルに反映する

2024/03/29に公開

はじめに

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