tjinjin's blog

インフラ要素多めの個人メモ

シェルスクリプトで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 getaws_access_key_idが取れるかどうかをAssumeRoleの使用有無の判断に使っています。AssumeRoleの場合aws_access_key_idが取得できないので、実行結果が0になりません。なので上記のようにしました。

まとめ

とりあえず以前から困っていたのでえいやで作ってみた。