この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。Assume Roleしてますか。
スイッチロール先の環境でAWS関連のCLIツールを使用すると大抵Assume Roleを使う必要が出てきます。
assume-roleとdirenvを使って設定している
ブログ
もありますが、それすら面倒なので楽にする方法を考えてスクリプトを書いてみました。
スクリプトについて
前置きが長くなってしまいましたが本題に入っていきます。
実装して、その後に動作イメージを載せたいと思います。
前準備
まずスクリプトを書く前に準備を行います。
fzfとGrepをお手元に用意しておいてください。
fzfに関しては様々なOSでのインストール方法がREADMEに書いてあります。
私がmacユーザなのでmacOSでのインストール方法のみ記載しておきます。
$ brew install fzf
スクリプトの配置
下記スクリプトを好きな場所に配置してください。
配置する際にスクリプトのMFAが必要な場合は3行目のMFA Serialを各々の値に変更してください。
不要な場合はそこを消してaws sts assume-role
の引数を変更してください。
また、4行目のSOURCE_PROFILE
にAssume Roleを実行するAWSアカウントのプロファイルを書いてください。
_assumer
#!/bin/bash
SERIAL_NUMBER='arn:aws:iam::xxxxxxxxxxxx:mfa/xxxxxxxxxxxx'
SOURCE_PROFILE='xxxxxxxxxxxx'
DATE=`date +%s`
PROFILE=`grep -oP '\[profile *\K\w+' ~/.aws/config | fzf`
if [ "$PROFILE" = "" ]; then
return 1
fi
ROLE_ARN=`aws configure get role_arn --profile $PROFILE`
read -sp "Input MFA Code: " TOKEN_CODE
OUTPUT=`aws sts assume-role \
--role-arn ${ROLE_ARN} \
--serial-number ${SERIAL_NUMBER} \
--role-session-name ${DATE}-session \
--profile ${SOURCE_PROFILE} \
--duration-second 3600 \
--token-code ${TOKEN_CODE}
`
export AWS_ACCESS_KEY_ID=`echo $OUTPUT | jq -r .Credentials.AccessKeyId`
export AWS_SECRET_ACCESS_KEY=`echo $OUTPUT | jq -r .Credentials.SecretAccessKey`
export AWS_SESSION_TOKEN=`echo $OUTPUT | jq -r .Credentials.SessionToken`
echo ""
エイリアスの設定
先ほど設置したスクリプトに対してエイリアスを設定します。
シェルスクリプトをただ実行するだけだと親プロセスに対してシェル変数を渡せません。
なのでsourceコマンドでシェル変数をいい感じに橋渡しできるようにします。
私はbashを使用しているので、.bash_profile
に下記のようなエイリアスを設定します。
.bash_profile
alias assume='. /path/to/_assumer'
動作イメージ
画像で申し訳ありませんがこのように動作します。
assume
と打つと、fzfがファジー検索をかけてくれます。
あとは使用するプロファイルを選択するとAWS CLIによってAssume Roleがコールされます。
6桁のトークンを入れましょう。
成功した場合は何も表示されずに終了するのであとはお好きなコマンド打ちましょう。
さいごに
Assume Roleを簡単にできるようにbrandyという似たようなツールをGoで作っていたのですがfzfでいけると思いサクッとつくってみました。
怠惰を美徳とする私にとっては嬉しいものができあがりました。