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

公開日時
更新日時

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

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

そこで今回は、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]}

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

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

参考


Related #aws

Alexaに気温と二酸化炭素濃度を教えてもらう

「Alexa、気温」でセンサー情報を教えてくれるようになった

CloudWatchのカスタムメトリクスを減らす

あまりチェックしないセンサー値の送信を止めた

AWS SAMで作ったLambdaアプリをCircleCIでデプロイする

circleci/aws-serverlessのOrbを使った

AWS SESの受信メールを暗号化してs3に保存しLambdaで読み込む

jsの場合、複合処理を独自実装する必要がある

Nodejs12のLambdaでawscliを使う

aws-lambda-layer-awscliを使う

s3の署名付きURLが有効期限より前に見れなくなってしまう

IAMロールではなくIAMユーザの権限でURLを生成する必要があった