direnvでMFA必須のスイッチロールアカウントのAWS_ACCESS_KEY_IDを設定する

昨日の記事でMFA必須のスイッチロールアカウントでaws cliを使う方法を書いたが、都度profileを指定するのは手間なのと、profileの指定漏れで意図せずdefault profileでコマンドを実行されてしまう懸念がある。

そのため複数のawsアカウントを利用する場合はdirenvを使って、ディレクトリごとにAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを設定することが多い。

そこで今回は、MFA必須のスイッチロールアカウントをdirenvを使って設定する方法をまとめておく。

昨日の記事と同様のproductionというロールが存在する場合のサンプルは以下。

# .envrc
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_ACCOUNT=xxxxxxx

export AWS_ACCESS_KEY_ID=xxxxx
export AWS_SECRET_ACCESS_KEY=xxxx
export AWS_USER_NAME={iam-user}

echo 'input mfa token:'
read TOKEN_CODE
ROLE_ARN="arn:aws:iam::${AWS_DEFAULT_ACCOUNT}:role/production"
SERIAL_NUMBER="arn:aws:iam::${AWS_DEFAULT_ACCOUNT}:mfa/${AWS_USER_NAME}"
CREDENTIALS=($(aws sts assume-role --role-arn "${ROLE_ARN}" --serial-number ${SERIAL_NUMBER} --token-code ${TOKEN_CODE} --role-session-name cli-session --query '[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]' --output text))
unset AWS_SECURITY_TOKEN

export AWS_ACCESS_KEY_ID=${CREDENTIALS[0]}
export AWS_SECRET_ACCESS_KEY=${CREDENTIALS[1]}
export AWS_SESSION_TOKEN=${CREDENTIALS[2]}

AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYにはスイッチロール前のアカウントの認証情報を入力し、direnv allowを実行する際にaws sts assume-roleを実行して一時クレデンシャルを取得しAWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKENを上書きしている。

一時クレデンシャルの有効期限が切れた場合は、再度direnv allowを実行してMFA認証コードを入力すれば再設定できる。

参考