AWS CLIでスイッチロールして一時クレデンシャル情報を環境変数に設定するスクリプト

2021.05.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2021年5月入社の伊藤です。

現在のプロジェクトで、ベースのIAMアカウントからスイッチロールして AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN の環境変数を設定する必要がありました。
今までやったことがなく色々と調べてやってみたので、備忘の意味でも情報を残しておこうと思います。

先輩方の下記の記事は非常に参考になりました!

なお、AWS CLIの設定は完了済みのものとします。

プロファイルの設定

スイッチロール元のIAMユーザーで、MFAのARNを取得します。

スイッチロール先のIAMロールで、ロールARNを取得します。

次に~/.aws/config を編集し、スイッチロール先のプロファイルを追加します。
今回は例として test プロファイルを追加しています。

mfa_serialrole_arn には、それぞれ上記で取得したMFAとロールのARNを設定します。

$ vi ~/.aws/config

[default]
region = ap-northeast-1
output = json

[profile test]
region = ap-northeast-1
mfa_serial = arn:aws:iam::11111111:mfa/hoge
role_arn = arn:aws:iam::22222222:role/hoge
source_profile = default

ここまで設定したら、 test プロファイルを環境変数に設定しておきます。

$ export AWS_DEFAULT_PROFILE=test

一時クレデンシャルを取得し環境変数に設定

毎回手動は大変なので、本操作を行うためのスクリプトを用意しました。
今回は例として、ルートディレクトリに scripts というディレクトリを作成し、その中に scr.sh というスクリプトを作成しました。(scrset credential の略です)

$ mkdir ~/scripts
$ touch ~/scripts/scr.sh
$ chmod +x ~/scripts/scr.sh

scr.sh ファイルは、下記の内容で保存します。

#!/bin/sh

getopts "a:" opt
mfa_code=$OPTARG
AWS_STS_CREDENTIALS=`aws sts assume-role \
  --profile default \
  --role-arn $(aws configure get $AWS_DEFAULT_PROFILE.role_arn) \
  --role-session-name $AWS_DEFAULT_PROFILE-session \
  --serial-number $(aws configure get $AWS_DEFAULT_PROFILE.mfa_serial) \
  --token-code $mfa_code`

AWS_ACCESS_KEY_ID=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.AccessKeyId'`
AWS_SECRET_ACCESS_KEY=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.SecretAccessKey'`
AWS_SESSION_TOKEN=`echo "${AWS_STS_CREDENTIALS}" | jq -r '.Credentials.SessionToken'`

scr コマンドを実行するため、.zshrc に下記を追記します。

alias scr='source ~/scripts/scr.sh'

jqが使われているので、インストールしていない場合はインストールする必要があります。

brew install jq

以上で準備完了です!

スクリプトを実行

下記コマンドで、一時クレデンシャル情報を設定します。
-a オプションに、MFAコードを指定します。

$ scr -a 144086
$ echo $AWS_SESSION_TOKEN
# AWS_SESSION_TOKENが表示される

実行後、各環境変数を確認すると、設定されていることがわかります。

今後は上記コマンドを呼ぶだけなので、楽になった気がします!
まだまだわからないことも多いですが、日々勉強していこうと思います!