ハンズオン(簡易版): STS基礎 (Assume Role)

1. IAMロールの引き受けトークンの発行 (handson-cli-sts-assume-role-user: handson-cli-sts-assume-role-role)

手順の目的

IAMユーザー"handson-cli-sts-assume-role-user"がIAMロール"handson-cli-sts-assume-role-role"を引き受けるための認証トークンを発行します。

設定値の指定

設定値の指定

手順に必要な設定値を変数に格納をします。

0.a. リージョン

リージョンを指定します。

変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

0.b. クレデンシャルファイル

クレデンシャルファイルを指定します。

環境変数の設定:

export AWS_SHARED_CREDENTIALS_FILE="${HOME}/.credentials-handson-cli-sts-assume-role/handson-cli-sts-assume-role-user.ini"

0.c. AWSプロファイル名

AWSプロファイル名を指定します。

環境変数の設定:

export AWS_PROFILE='handson-cli-sts-assume-role-user'

1. IAMロール名

IAMロール名を指定します。

変数の設定:

IAM_ROLE_NAME='handson-cli-sts-assume-role-role'

2. IAMロール引受けトークンセッション名

IAMロール引受けトークンのセッション名を指定します。

変数の設定:

STS_ASSUME_ROLE_SESSION_NAME='handson-cli-sts-assume-role-session'

3. IAMロール引受けトークン有効期限

IAMロール引受けトークンの有効期限(秒)を指定します。

変数の設定:

STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS='900'

4. AWS CLI認証情報ファイル用ディレクトリ

AWS CLI認証情報ファイル用ディレクトリを指定します。

変数の設定:

DIR_CREDENTIAL="${HOME}/environment/tmp-handson-cli-sts-assume-role"

ディレクトリが存在することを確認し、存在しない場合は作成します。

コマンド:

ls -d ${DIR_CREDENTIAL} > /dev/null 2>&1 \
  || mkdir -p ${DIR_CREDENTIAL}

結果(例):

(出力なし)

5. AWS認証情報ファイル名

AWS CLI認証情報ファイル名を指定します。

変数の設定:

FILE_AWS_CREDENTIAL_STS_ASSUME_ROLE="${DIR_CREDENTIAL}/${STS_ASSUME_ROLE_SESSION_NAME}.ini" \
  && echo ${FILE_AWS_CREDENTIAL_STS_ASSUME_ROLE}

結果(例):

${HOME}/environment/tmp-handson-cli-sts-assume-role/handson-cli-sts-assume-role-session.ini

6. 一時ファイル保存用ディレクトリ

一時ファイル保存用ディレクトリ名を指定します。

変数の設定:

DIR_TMP="${HOME}/environment/tmp-handson-cli-sts-assume-role"

ディレクトリが存在することを確認し、存在しない場合は作成します。

コマンド:

ls -d ${DIR_TMP} > /dev/null 2>&1 \
  || mkdir -p ${DIR_TMP}

設定値の確認

各変数に正しい設定値が格納されていることを確認します。

変数の確認:

cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"
  #    AWS_SHARED_CREDENTIALS_FILE:"${HOME}/.credentials-handson-cli-sts-assume-role/handson-cli-sts-assume-role-user.ini"
       AWS_SHARED_CREDENTIALS_FILE="${AWS_SHARED_CREDENTIALS_FILE}"
  #    AWS_PROFILE:"handson-cli-sts-assume-role-user"
       AWS_PROFILE="${AWS_PROFILE}"

  # 1. IAM_ROLE_NAME:"handson-cli-sts-assume-role-role"
       IAM_ROLE_NAME="${IAM_ROLE_NAME}"
  # 2. STS_ASSUME_ROLE_SESSION_NAME:"handson-cli-sts-assume-role-session"
       STS_ASSUME_ROLE_SESSION_NAME="${STS_ASSUME_ROLE_SESSION_NAME}"
  # 3. STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS:"900"
       STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS="${STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS}"
  # 4. DIR_CREDENTIAL:"${HOME}/environment/tmp-handson-cli-sts-assume-role"
       DIR_CREDENTIAL="${DIR_CREDENTIAL}"
  # 5. FILE_AWS_CREDENTIAL_STS_ASSUME_ROLE:"${HOME}/environment/tmp-handson-cli-sts-assume-role/handson-cli-sts-assume-role-session.ini"
       FILE_AWS_CREDENTIAL_STS_ASSUME_ROLE="${FILE_AWS_CREDENTIAL_STS_ASSUME_ROLE}"
  # 6. DIR_TMP:"${HOME}/environment/tmp-handson-cli-sts-assume-role"
       DIR_TMP="${DIR_TMP}"

END

各変数について、上の行と下の行の値の内容もしくは形式が同じであることを確認します。 もし異なる場合は、それぞれの手順番号に戻って変数の設定を行います。

処理の実行

IAMロールのARNを取得します。

コマンド:

iam_role_arn=$( \
  aws iam get-role \
    --role-name ${IAM_ROLE_NAME} \
    --query 'Role.Arn' \
    --output text \
) \
  && echo ${iam_role_arn}

結果(例):

arn:aws:iam::XXXXXXXXXXXX:role/handson-cli/handson-cli-sts-assume-role-role

出力ファイル名を指定します。

変数の設定:

FILE_STS_ASSUME_ROLE_TOKEN="${DIR_TMP}/${AWS_PROFILE}.json" \
  && echo ${FILE_STS_ASSUME_ROLE_TOKEN}

結果(例):

${HOME}/environment/tmp-handson-cli-sts-assume-role/handson-cli-sts-assume-role-user.json

IAMロール引き受けトークンの発行

IAMロール引き受けトークンを発行します。

変数の確認:

cat << END

  # iam_role_arn:"arn:aws:iam::XXXXXXXXXXXX:role/handson-cli/handson-cli-sts-assume-role-role"
    iam_role_arn="${iam_role_arn}"
  # STS_ASSUME_ROLE_SESSION_NAME:"handson-cli-sts-assume-role-session"
    STS_ASSUME_ROLE_SESSION_NAME="${STS_ASSUME_ROLE_SESSION_NAME}"
  # STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS:"900"
    STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS="${STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS}"
  # FILE_STS_ASSUME_ROLE_TOKEN:"${HOME}/environment/tmp-handson-cli-sts-assume-role/handson-cli-sts-assume-role-user.json"
    FILE_STS_ASSUME_ROLE_TOKEN="${FILE_STS_ASSUME_ROLE_TOKEN}"

END

コマンド:

aws sts assume-role \
  --role-arn ${iam_role_arn} \
  --role-session-name ${STS_ASSUME_ROLE_SESSION_NAME} \
  --duration-seconds ${STS_ASSUME_ROLE_TOKEN_DURATION_SECONDS} \
  > ${FILE_STS_ASSUME_ROLE_TOKEN} \

cat ${FILE_STS_ASSUME_ROLE_TOKEN}

結果(例):

{
  "AssumedRoleUser": {
    "AssumedRoleId": "AROAXXXXXXXXXXXXXXXXX:handson-cli-sts-assume-role-role-session",
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/handson-cli-sts-assume-role-role/handson-cli-sts-assume-role-role-session"
  },
  "Credentials": {
    "SecretAccessKey": "EAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=",
    "Expiration": "2023-07-06T02:23:45Z",
    "AccessKeyId": "ASIAXXXXXXXXXXXXXXXX"
  }
}

AWS CLI認証情報の設定

アクセスキー保存ファイルを指定します。

環境変数の設定:

export AWS_SHARED_CREDENTIALS_FILE="${FILE_AWS_CREDENTIAL_STS_ASSUME_ROLE}"

プロファイルを指定します。

環境変数の設定:

export AWS_PROFILE="${STS_ASSUME_ROLE_SESSION_NAME}"

AWSアクセスキーIDの設定

AWSアクセスキーIDを取得します。

コマンド:

aws_access_key_id=$(
  cat "${FILE_STS_ASSUME_ROLE_TOKEN}" \
    | jp.py 'Credentials.AccessKeyId' \
    | sed 's/"//g' \
) \
  && echo ${aws_access_key_id}

結果(例):

AKIAXXXXXXXXXXXXXXXX

AWS CLIの設定をします。

変数の確認:

cat << END

  # AWS_PROFILE:"handson-cli-sts-assume-role-session"
    AWS_PROFILE="${AWS_PROFILE}"
  # aws_access_key_id:"AKIAXXXXXXXXXXXXXXXX"
    aws_access_key_id="${aws_access_key_id}"

END

コマンド:

aws configure set \
  aws_access_key_id ${aws_access_key_id}

結果(例):

(出力なし)

AWSシークレットアクセスキーの設定

AWSシークレットアクセスキーを取得します。

コマンド:

aws_secret_access_key=$( \
  cat "${FILE_STS_ASSUME_ROLE_TOKEN}" \
    | jp.py 'Credentials.SecretAccessKey' \
    | sed 's/"//g' \
) \
  && echo ${aws_secret_access_key}

結果(例):

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

AWS CLIの設定をします。

変数の確認:

cat << END

  # AWS_PROFILE:"handson-cli-sts-assume-role-session"
    AWS_PROFILE="${AWS_PROFILE}"
  # aws_secret_access_key:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    aws_secret_access_key="${aws_secret_access_key}"

END

コマンド:

aws configure set \
  aws_secret_access_key ${aws_secret_access_key}

結果(例):

(出力なし)

セッショントークンの設定

セッショントークンを取得します。

コマンド:

aws_session_token=$(
  cat "${FILE_STS_ASSUME_ROLE_TOKEN}" \
    | jp.py 'Credentials.SessionToken' \
    | sed 's/"//g' \
) \
  && echo ${aws_session_token}

結果(例):

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==

AWS CLIの設定をします。

変数の確認:

cat << END

  # AWS_PROFILE:"handson-cli-sts-assume-role-session"
    AWS_PROFILE="${AWS_PROFILE}"
  # aws_session_token:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=="
    aws_session_token="${aws_session_token}"

END

コマンド:

aws configure set \
  aws_session_token ${aws_session_token}

結果(例):

(出力なし)

完了確認

「AWS CLI認証情報ファイル"${HOME}/environment/tmp-handson-cli-sts-assume-role/handson-cli-sts-assume-role-session.ini"が存在する。」ことを確認します。

コマンド:

ls ${FILE_AWS_CREDENTIAL_STS_ASSUME_ROLE}

結果(例):

${HOME}/environment/tmp-handson-cli-sts-assume-role/handson-cli-sts-assume-role-session.ini

「AWS CLI設定'aws_access_key_id'が存在する。」ことを確認します。

コマンド:

aws configure get \
  aws_access_key_id

結果(例):

AKIAXXXXXXXXXXXXXXXX

「AWS CLI設定'aws_secret_access_key'が存在する。」ことを確認します。

コマンド:

aws configure get \
  aws_secret_access_key

結果(例):

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

「AWS CLI設定'aws_session_token'が存在する。」ことを確認します。

コマンド:

aws configure get \
  aws_session_token

結果(例):

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==

IAMロール引受けトークンファイルを削除します。

コマンド:

rm ${FILE_STS_ASSUME_ROLE_TOKEN}

結果(例):

(出力なし)

プロファイルの権限を無効にする場合は、環境変数を削除します。

変数の設定:

export -n AWS_SHARED_CREDENTIALS_FILE

変数の設定:

export -n AWS_PROFILE

手順の完了