ツール「aws-mfa」でSTS v2 Tokenを利用する
こんにちは、コンサルティング部の後藤です。
私はTerraformやAWS CLIを実行する際、一時的な資格情報を取得する手段として「aws-mfa」というツールを使用しているのですが、手動で有効にする必要があるAWSリージョンに対してTerraformやAWS CLIを実行すると認証情報エラーが発生したので、原因と解決策と調べてみました。
aws-mfaについて
aws-mfaはAWS STSから一時的な認証情報を取得し、保持してくれるツールになります。詳細は下記ブログが非常に参考になります。
認証情報のエラーについて
まず、aws-mfaを以下のようにインストールし、実行してみます。
# インストール $ git clone https://github.com/broamski/aws-mfa $ cd aws-mfa/ $ sudo python setup.py install # ~/.aws/credentialは以下のように記述 $ cat ~/.aws/credentials [default-long-term] aws_access_key_id = ****ACCESSKEY-ID aws_secret_access_key = ****SECRETACCESSKEY aws_mfa_device = arn:aws:iam::123456789010:mfa/cm-goto.naoki assume_role = arn:aws:iam:010987654321:role/cm-goto.naoki # 実行 $ aws-mfa
すると、aws-mfaは一時的認証情報を取得します。
$ cat ~/.aws/credentials [default] assumed_role = True assumed_role_arn = arn:aws:iam::010987654321:role/cm-goto.naoki aws_access_key_id = ****ACCESSKEY-ID aws_secret_access_key = ****SECRETACCESSKEY aws_session_token = ********YXdzEGsaDI5Rh38ElpvpcB35PiKsAS3FkIx9Wf11s7E00o/uqqH7sj9QqAo/XoLwcS3vF/Tm3ax87ndYQwpmrwIH7ZsvaHaw5cU7RWmTlezeogFji5D/gqMAvCBJOQOthJGBf/MHNqRMA8YOH1wm5l0fR4Ko+qWuT+GMnpS+9FK9AY3XbNyXfoY9Gj7yvSGDN536jViREbfJEQZ9UiblAtlVWAKqTtrYbIxGvYNoY76bgluJbU1LvuVpKCc9owF8LEoo9K6x+gUyLRj4G3EB6FV7M1an3pREl98tVuRAObWnw6YBA/pFCsC+h5HIVlq0Kq9+******== aws_security_token = ********YXdzEGsaDI5Rh38ElpvpcB35PiKsAS3FkIx9Wf11s7E00o/uqqH7sj9QqAo/XoLwcS3vF/Tm3ax87ndYQwpmrwIH7ZsvaHaw5cU7RWmTlezeogFji5D/gqMAvCBJOQOthJGBf/MHNqRMA8YOH1wm5l0fR4Ko+qWuT+GMnpS+9FK9AY3XbNyXfoY9Gj7yvSGDN536jViREbfJEQZ9UiblAtlVWAKqTtrYbIxGvYNoY76bgluJbU1LvuVpKCc9owF8LEoo9K6x+gUyLRj4G3EB6FV7M1an3pREl98tVuRAObWnw6YBA/pFCsC+h5HIVlq0Kq9+*******== expiration = 2020-08-31 02:50:44
一時的認証情報を取得出来たため、東京リージョンやバージニアリージョン等に対してAWS CLIが実行できますが、
$ aws ec2 describe-instances --region us-east-1 { "Reservations": [] } $ aws ec2 describe-instances --region ap-northeast-1 { "Reservations": [ { "Instances": [ { ~~
手動で追加した香港リージョンに対して実行すると、認証エラーとなります。
$ aws ec2 describe-regions --output table ~~ ec2.ap-east-1.amazonaws.com | opted-in | ap-east-1 ~~ $ aws ec2 describe-instances --region ap-east-1 An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials
認証エラーとなる原因はこちらに記載ある通り、手動で追加したリージョン(香港リージョン等)にはバージョン1のトークンでは動作せず、バージョン2のトークンを取得する必要があるようです。
aws-mfaでバージョン2のトークンを取得する
何か無いかとgithubのプルリクエストを探してみると、上記問題に対するアプローチがありました。
上記プルリクエストをローカルに持ってきてaws-mfaを更新します。
$ git fetch origin pull/52/head:aws-region-sts $ git checkout aws-region-sts $ sudo python setup.py install
すると、今までに無かったオプション--region
が追加されています。
$ aws-mfa -h ~~ --region REGION The region of AWS STS
regionオプションを追加して、aws-mfaで一時的認証情報を取得してみます。
※ ~/.aws/credentials に古いトークンが残っていると取得できないため、残っている場合は削除が必要です。
$ aws-mfa --region ap-northeast-1
すると、先程より明らかに長いトークンが取得出来ていることが確認できました。
$ cat ~/.aws/credentials [default] assumed_role = True assumed_role_arn = arn:aws:iam::010987654321:role/cm-goto.naoki aws_access_key_id = ****ACCESSKEY-ID aws_secret_access_key = ****SECRETACCESSKEY aws_session_token = *********2luX2VjEFsaDmFwLW5vcnRoZWFzdC0xIkYwRAIgIcEg0gzNpLgC9rWZveRG+yhRSRjri6s96nmc+Uezu94CICKA8b+VsI0y6ralK/MB9SrV+RN8nC4IrKEKVbXad4shKpUCCFQQARoMMDc0NTQ3MjU4NjUzIgy1ketwlS2FXR2uzT8q8gHAnKVyjr5yAMAQXVV71Jb9z0Ct5RRWFCnl60BmjV+tTtRqyyX9lCoqfw2ko2/6vCSJHLfxmZ/39jemNxvgS25wwchz/HJpZ0eFsYRN9eV/jtozAhxF+nHHrcCaUS8AIvbqnGyKawXcL4Z8xtkFCYHtYpa7UIZSd+xoAAH8IGNh7LL3Uy8BcewnatVTeE7rKYgoXFFzzKhPimZtaW0ZPZfNjFeOQpOeHBDsc8qzNcKHfLX2LISWyDu5rxpWqMW69D2RD9qCrtfyw4IHs/QIGkOElBVjag4FeeJFo/sgEPp3HTNsdcZX6fu89tZcwyFvQe8QbDC9y7H6BTqeAWmuPH06E6p+0+k3UQlnE4DrIix05me3bGz1KH3oXxH8f5V6TZaHqSSEwW6jo019dbvF2OP4EQLwkJCqhO21DgZD9lyDhsqEu2X6lbAdvaQ1/YuwT7pcEonIFhNaLxdetIXsVau5sRpPYJAbh28UFTuImfKg0nD6uIcnizgPxYZltUbeJ5Dq7cT87wByIu1pbFIxRzmzH*********** aws_security_token = *********2luX2VjEFsaDmFwLW5vcnRoZWFzdC0xIkYwRAIgIcEg0gzNpLgC9rWZveRG+yhRSRjri6s96nmc+Uezu94CICKA8b+VsI0y6ralK/MB9SrV+RN8nC4IrKEKVbXad4shKpUCCFQQARoMMDc0NTQ3MjU4NjUzIgy1ketwlS2FXR2uzT8q8gHAnKVyjr5yAMAQXVV71Jb9z0Ct5RRWFCnl60BmjV+tTtRqyyX9lCoqfw2ko2/6vCSJHLfxmZ/39jemNxvgS25wwchz/HJpZ0eFsYRN9eV/jtozAhxF+nHHrcCaUS8AIvbqnGyKawXcL4Z8xtkFCYHtYpa7UIZSd+xoAAH8IGNh7LL3Uy8BcewnatVTeE7rKYgoXFFzzKhPimZtaW0ZPZfNjFeOQpOeHBDsc8qzNcKHfLX2LISWyDu5rxpWqMW69D2RD9qCrtfyw4IHs/QIGkOElBVjag4FeeJFo/sgEPp3HTNsdcZX6fu89tZcwyFvQe8QbDC9y7H6BTqeAWmuPH06E6p+0+k3UQlnE4DrIix05me3bGz1KH3oXxH8f5V6TZaHqSSEwW6jo019dbvF2OP4EQLwkJCqhO21DgZD9lyDhsqEu2X6lbAdvaQ1/YuwT7pcEonIFhNaLxdetIXsVau5sRpPYJAbh28UFTuImfKg0nD6uIcnizgPxYZltUbeJ5Dq7cT87wByIu1pbFIxRzmzH*********** expiration = 2020-08-31 03:51:41
先程同様、AWS CLIを東京 / バージニア / 香港リージョンに対して実行してみます。
$ aws ec2 describe-instances --region ap-northeast-1 { "Reservations": [ { "Instances": [ ~~ $ aws ec2 describe-instances --region us-east-1 { "Reservations": [] } $ aws ec2 describe-instances --region ap-east-1 { "Reservations": [] }
認証エラーは出ず、AWS CLIを実行することができました。
まとめ
aws-mfaでSTS v2 Tokenを取得する方法のご紹介でした。手動で追加するリージョンは使用する機会があまり無いので忘れがちです(´・ω・`)この情報が皆さまのお役に立てば幸いです。