シェルスクリプトでAssumeRoleするときの工夫
About
複数のAWSアカウント管理していると管理のしやすさからAssumeRoleしてCLIを叩いたりすることがあります。そのときのちょいネタです。
AssumeRole対応していないcommandを使う時
ツールによってはAssumeRoleに対応していないものがあります。そういう場合はAssumeRoleして一時的にTokenを発行したりします。その値を環境変数に埋め込んでツールを実行します。通常は問題ないですが、AWS環境によってAssumeRoleをしていないものがたまにあったりします。そういう場合いい感じにwrapperするようなスクリプトを書きました。
スクリプト
function assumeRole(){ profile_name=$1 && shift aws_account_id=$(aws sts get-caller-identity --profile $profile_name | jq -r '.Account') role_name=${ROLE_NAME:-default} role_arn=arn:aws:iam::${aws_account_id}:role/${role_name} role_session_name=create_iam duration_seconds=3600 # 900-3600 必要に応じて増減 result=`aws sts assume-role --role-arn ${role_arn} --role-session-name ${role_session_name} --duration-seconds ${duration_seconds}` access_key_id=`echo ${result} | jq -r '.Credentials.AccessKeyId'` secret_access_key=`echo ${result} | jq -r '.Credentials.SecretAccessKey'` session_token=`echo ${result} | jq -r '.Credentials.SessionToken'` export AWS_ACCESS_KEY_ID=${access_key_id} export AWS_SECRET_ACCESS_KEY=${secret_access_key} export AWS_SESSION_TOKEN=${session_token} export AWS_DEFAULT_REGION=$region } function useEnviromentVariable() { profile_name=$1 && shift region=$1 export AWS_ACCESS_KEY_ID=$(aws configure get $profile_name.aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get $profile_name.aws_secret_access_key) export AWS_DEFAULT_REGION=$region } # main aws configure get $PROFILE_NAME.aws_access_key_id > /dev/null if [ $? -eq 0 ];then useEnviromentVariable $PROFILE_NAME $REGION else assumeRole $PROFILE_NAME $REGION fi
工夫点としては aws configure get
でaws_access_key_idが取れるかどうかをAssumeRoleの使用有無の判断に使っています。AssumeRoleの場合aws_access_key_idが取得できないので、実行結果が0になりません。なので上記のようにしました。
まとめ
とりあえず以前から困っていたのでえいやで作ってみた。