環境変数に依存しないassume-roleスクリプト作ってみた

環境変数に依存しないassume-roleスクリプト作ってみた
2022.06.14

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

動機

ターミナルの窓を複数開いて、

  • CloudWatch Logsを観察しながら(aws logs tail --follow
  • AWS CDKをwatchでデプロイしながら(npx cdk watch
  • lambdaを実行したり、MQTTを飛ばしたりしたい時がある(aws lambda invoke, aws iot-data publish

ので、複数窓でassume-roleのクレデンシャルが共有されてくれると嬉しかった。

ので作りました。

先人たちの記事

クラスメソッドの先人たちが無限に記事を書いてくれている。

先輩方に感謝しながらAssume Roleスクリプト書いてみました

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

[小ネタ]ディレクトリ移動した際に自動で一時クレデンシャルを取得・設定する

1 Password ワンタイムパスワードを使った Assume Role をCLIだけで完結するようにしてみた

仕様

  • fish上で動作します
  • ターミナルの窓が変わってもクレデンシャルが引き回されます
  • profileを指定しなくてもクレデンシャルが使えます

ざっくり概要

  1. ~/.aws/credentialを準備します
  2. ~/.aws/configを準備します
  3. fish functionを作成します
  4. assume-roleしたいアカウントの数だけaliasを用意します

1. ~/.aws/credentialを準備します

[default]
aws_access_key_id=XXXX
aws_secret_access_key=XXXX
aws_session_token=XXXX

[hontai]
aws_access_key_id=[ここにAws Access Key Idを入れてね]
aws_secret_access_key=[ここにAws Secret Access Key]
  • XXXX: XXXX のままで問題ないです。これをスクリプトから置き換えます。
  • Aws Access Key Id: assume-role元のIAM UserのアクセスキーIDを入力します。
  • Aws Secret Access Key: assume-role元のIAM Userのシークレットアクセスキーを入力します。

2. ~/.aws/configを準備します

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

3. fish functionを作成する

~/.config/fish/functions/switch_aws_role.fish というファイルを作成し、以下のコードを書きます。

function switch_aws_role
  read -sP "MFA Token Code: " MFA_TOKEN_CODE

  set --local ROLE_ARN $argv[1]
  set --local MFA_ARN [ここにIAM UserのMFAのARNを入れてね]
  set --local DATE (date +%s)
  set --local OUTPUT (\
    aws sts assume-role --profile hontai \
                        --role-arn $ROLE_ARN \
                        --role-session-name $DATE-session \
                        --duration-second 3600 \
                        --serial-number $MFA_ARN \
                        --token-code $MFA_TOKEN_CODE)

  set --local AWS_ACCESS_KEY_ID (echo $OUTPUT | jq -r .Credentials.AccessKeyId)
  set --local AWS_SECRET_ACCESS_KEY (echo $OUTPUT | jq -r .Credentials.SecretAccessKey)
  set --local AWS_SESSION_TOKEN (echo $OUTPUT | jq -r .Credentials.SessionToken)

  sed -i "" "2s~\(aws_access_key_id\=\).*~\1$AWS_ACCESS_KEY_ID~g" ~/.aws/credentials
  sed -i "" "3s~\(aws_secret_access_key\=\).*~\1$AWS_SECRET_ACCESS_KEY~g" ~/.aws/credentials
  sed -i "" "4s~\(aws_session_token\=\).*~\1$AWS_SESSION_TOKEN~g" ~/.aws/credentials
end
  • IAM UserのMFAのARN:
    • webコンソールのIAM Userのページで確認できます。
    • 例: arn:aws:iam::[AWSアカウントID]:mfa/[IAM User name]

sedを使って~/.aws/credentialsを書き換えます。 ここのコードが行数センシティブであるため、~/.aws/credentialsの2,3,4行目が変わると動作しなくなります!ご注意を!

  sed -i "" "2s~\(aws_access_key_id\=\).*~\1$AWS_ACCESS_KEY_ID~g" ~/.aws/credentials
  sed -i "" "3s~\(aws_secret_access_key\=\).*~\1$AWS_SECRET_ACCESS_KEY~g" ~/.aws/credentials
  sed -i "" "4s~\(aws_session_token\=\).*~\1$AWS_SESSION_TOKEN~g" ~/.aws/credentials

4. assume-roleしたいアカウントの数だけaliasを用意します

~/.config/fish/config.fishのfish configにaliasを追加します。

alias switch_aws_role_account_A='switch_aws_role [アカウントAのIAM RoleのARN]'
alias switch_aws_role_account_B='switch_aws_role [アカウントBのIAM RoleのARN]'
alias switch_aws_role_account_C='switch_aws_role [アカウントCのIAM RoleのARN]'
alias switch_aws_role_account_D='switch_aws_role [アカウントDのIAM RoleのARN]'

使い方

swiaccdとか打ってtabキーを打つとfishがサジェストしてくれます。fishかわいい。