ツール「aws-mfa」でSTS v2 Tokenを利用する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサルティング部の後藤です。

私は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を取得する方法のご紹介でした。手動で追加するリージョンは使用する機会があまり無いので忘れがちです(´・ω・`)この情報が皆さまのお役に立てば幸いです。