IAM Identity Center管理下のアカウントの一時認証情報をCLIで取得する

2023.05.24

AWS事業本部のイシザワです。

CLIを使ってIAM Identity Center管理下のアカウントのリソースにアクセスするためには、通常はプロファイルを作成しますが、プロファイルを作らずに一時認証情報を取得してアクセスする方法があったため備忘録として残しておきます。

具体的には、下図の赤枠をクリックすることで確認できる一時認証情報をCLIで取得します。

手順

まず、IAM Identity Centerの管理アカウントのIAM Identity Centerダッシュボードを開き、下図の赤枠のログインURLを控えておきます。

以下のコマンドを実行し、最後に表示されるURLにブラウザでアクセスし、SSOユーザーの認証とデバイスの認可を行います。START_URLは控えていたログインURLとしてください。CLIENT_NAMEは任意の文字列です。

START_URL="<ログインURL>"
CLIENT_NAME="sample-client"

CLIENT_INFO=$(aws sso-oidc register-client \
                --client-name $CLIENT_NAME \
                --client-type public)

CLIENT_ID=$(echo $CLIENT_INFO | jq -r '.clientId')
CLIENT_SECRET=$(echo $CLIENT_INFO | jq -r '.clientSecret')

DEVICE_INFO=$(aws sso-oidc start-device-authorization \
                --client-id $CLIENT_ID \
                --client-secret $CLIENT_SECRET \
                --start-url $START_URL)

DEVICE_CODE=$(echo $DEVICE_INFO | jq -r '.deviceCode')
VERIFICATION_URI=$(echo $DEVICE_INFO | jq -r '.verificationUriComplete')

echo -e "Please open the following url:\n\n$VERIFICATION_URI"

以下のコマンドを実行し、アクセストークンを取得します。

ACCESS_TOKEN_INFO=$(aws sso-oidc create-token \
                      --client-id $CLIENT_ID \
                      --client-secret $CLIENT_SECRET \
                      --grant-type "urn:ietf:params:oauth:grant-type:device_code" \
                      --device-code $DEVICE_CODE)

ACCESS_TOKEN=$(echo $ACCESS_TOKEN_INFO | jq -r '.accessToken')

get-role-credentialsでアカウントの認証情報を取得します。アカウントIDと権限セット名の他に、SSOの認証情報としてアクセストークンが必要です。

ACCOUNT_ID="123456789012"
ROLE_NAME="AdministratorAccess"

CREDENTIAL_INFO=$(aws sso get-role-credentials \
                    --role-name $ROLE_NAME \
                    --account-id $ACCOUNT_ID \
                    --access-token $ACCESS_TOKEN)

以下のコマンドで、一時認証情報で対象のアカウントにアクセスできていることが確認できます。対象アカウントのアカウントIDが出力されます。

env \
  AWS_ACCESS_KEY_ID=$(echo $CREDENTIAL_INFO | jq -r '.roleCredentials.accessKeyId') \
  AWS_SECRET_ACCESS_KEY=$(echo $CREDENTIAL_INFO | jq -r '.roleCredentials.secretAccessKey') \
  AWS_SESSION_TOKEN=$(echo $CREDENTIAL_INFO | jq -r '.roleCredentials.sessionToken') \
  aws sts get-caller-identity --query 'Account' --output text

注意点

一時認証情報に有効期限があるのはもちろんのことですが、アクセストークンにも有効期限があります。 下記コマンドでアクセストークンの有効期間(秒数)が取得できます。

echo $ACCESS_TOKEN_INFO | jq -r '.expiresIn'