Assume Roleをいい感じにするスクリプトを書いた

2019.10.17

この記事は公開されてから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がファジー検索をかけてくれます。

eazy-assume-role-with-fzf-1.png

あとは使用するプロファイルを選択するとAWS CLIによってAssume Roleがコールされます。
6桁のトークンを入れましょう。

eazy-assume-role-with-fzf-2.png

成功した場合は何も表示されずに終了するのであとはお好きなコマンド打ちましょう。

さいごに

Assume Roleを簡単にできるようにbrandyという似たようなツールをGoで作っていたのですがfzfでいけると思いサクッとつくってみました。
怠惰を美徳とする私にとっては嬉しいものができあがりました。