sts decode-authorization-messageコマンドを使い、AWS CLIのエラーメッセージの詳しい情報を確認してみた。

2021.10.01

こんにちは、イムチェジョンです。
今回はsts decode-authorization-messageのコマンドを使い、AWS CLIのエラーメッセージをJSONの形式にして詳しく確認しみました。

アジェンダ

  1. AWS sts decode-authorization-message の定義
  2. sts decode-authorization-message の実行
  3. まとめ

1. AWS sts decode-authorization-message の定義

  • AWSのリクエストに応答し、返却されてエンコードされたメッセージのことで、リクエストの権限付与状態に対する追加情報をデコーディング

  • 権限付与状態のメッセージをデコーディングするには、ユーザーにIAMポリシーを通じてsts(Decode Authorization Message)作業をリクエストする権限が与えられなければならない

  • sts decode-authorization-messageに対する詳しいシノプシス及びオプションは下のドキュメントで参考できる

2. sts decode-authorization-messageの実行

EC2の構築

まず、以下の設定のようにEC2を構築しました。
AMI:Amazon Linux 2 AMI
インスタンスタイプ:t2.micro
セキュリティグループ:SSH 22
IAM ロール:EC2RoleIAM
キーペア : 既存キーペア及び新しいキーペアの中で選択

STSのポリシーの追加

ポリシーを作成します。
今回は作成済みのポリシーを編集してSTSのポリシーを追加してみます。
まず、ポリシーを編集します。

右下にあるさらにアクセス許可を追加するをクリックします。

ポリシーを選択できる部分が出るので、以下の設定で選択します。
サービス:STS
アクション:DecodeAuthorizationMessage

ポリシーが追加されているのを確認して保存します。

次は作成したポリシーがEC2インスタンスに適用されているIAMロールに追加されていると完了です。

AWS CLIで実行

実際にコマンドを実行してみましょう。
コマンドの構成は以下のようにします。
aws sts decode-authorization-message
+オプション
--encoded-message(エラーメッセージ):リクエストと共に返されたエンコードされたメッセージを入力

$ aws sts decode-authorization-message --encoded-message n6bxSs-tabJec7mc28q7GITyi1XuzGCj7VVjucXaSYKqZWKter5K6Uox9e3-j9PylvUIgxudD0MEw7Sm91pY4DDfCAyy9Li0CHyU10eB-9PRh2gNqUKJqlTpqzOnXhrcfFiblkuT1FK4V6T0R8iBDS6fxcI3AunxUm5M0y8vSvG62dvyu3HZNJcORQcIoBfMMShqguE8ptgJG44aAR1Wh__V4CcBk_KqZiBSEdH8twnW3eZx3HVq7K4JspaxaNwCA_LA0azE_KVy1QDqmhNThZp-7koBp_PzW-tYFlUe1KRFxkxzhf-MRRr6YxJK_IB4z_fzK7si3LgidqU-TNdKQpHAXpKkMVBovXtt9JvXsUWhpsoq6SGZRc-IbbYeNlTJWN5h23D4jGMnykS6pENAAe_X4EoQynbrW0j9T9Iyvzsose_CZfiF8CKA2uL8uoWHQij_jkNQhvr-mHWOcexKBBGvxSkyNiO-FaokPicMqFIDJV4HLenv0MbzxDO6bzJJ7GFN-uCAgFYc_q8ksS10k0J8jpzuEKv8YA65iLxghSCksWWp2h08UfW268N_-FJI4R8tsbzJUs_A64-PJ0lel6hC1rIqM9xOI8r3PGIeEzkXl9dflvvvl757qdT_3DAqQbSHO1Kd20oEUPiOE58z6Ljwkf6sCDZHF23F92bJRydzfN0lu-_jyM5qfqcoTiI

{
"DecodedMessage": "{\"allowed\":false,\"explicitDeny\":false,\"matchedStatements\":{\"items\":[]},\"failures\":{\"items\":[]},\"context\":{\"principal\":{\"id\":\"AROA3DULRMV2FQL46MIE4:i-0eb204ac0ae012989\",\"arn\":\"arn:aws:sts::************:assumed-role/EC2RoleIAM/i-0eb204ac0ae012989\"},\"action\":\"ec2:RunInstances\",\"resource\":\"arn:aws:ec2:ap-northeast-2:************:instance/*\",\"conditions\":{\"items\":[{\"key\":\"ec2:InstanceMarketType\",\"values\":{\"items\":[{\"value\":\"on-demand\"}]}},{\"key\":\"aws:Resource\",\"values\":{\"items\":[{\"value\":\"instance/*\"}]}},{\"key\":\"aws:Account\",\"values\":{\"items\":[{\"value\":\"************\"}]}},{\"key\":\"ec2:AvailabilityZone\",\"values\":{\"items\":[{\"value\":\"ap-northeast-2a\"}]}},{\"key\":\"ec2:ebsOptimized\",\"values\":{\"items\":[{\"value\":\"false\"}]}},{\"key\":\"ec2:IsLaunchTemplateResource\",\"values\":{\"items\":[{\"value\":\"false\"}]}},{\"key\":\"ec2:InstanceType\",\"values\":{\"items\":[{\"value\":\"t2.micro\"}]}},{\"key\":\"ec2:RootDeviceType\",\"values\":{\"items\":[{\"value\":\"ebs\"}]}},{\"key\":\"aws:Region\",\"values\":{\"items\":[{\"value\":\"ap-northeast-2\"}]}},{\"key\":\"aws:Service\",\"values\":{\"items\":[{\"value\":\"ec2\"}]}},{\"key\":\"ec2:InstanceID\",\"values\":{\"items\":[{\"value\":\"*\"}]}},{\"key\":\"aws:Type\",\"values\":{\"items\":[{\"value\":\"instance\"}]}},{\"key\":\"ec2:Tenancy\",\"values\":{\"items\":[{\"value\":\"default\"}]}},{\"key\":\"ec2:Region\",\"values\":{\"items\":[{\"value\":\"ap-northeast-2\"}]}},{\"key\":\"aws:ARN\",\"values\":{\"items\":[{\"value\":\"arn:aws:ec2:ap-northeast-2:************:instance/*\"}]}}]}}}"
}

結果が表示されましたが、一行やバックスラッシュのせいで読みにくいですね。
なので、まずはバックスラッシュを無くしましょう。

$ echo (上の結果) 

{"allowed":false,"explicitDeny":false,"matchedStatements":{"items":[]},"failures":{"items":[]},"context":{"principal":{"id":"AROA3DULRMV2FQL46MIE4:i-0eb204ac0ae012989","arn":"arn:aws:sts::************:assumed-role/EC2RoleIAM/i-0eb204ac0ae012989"},"action":"ec2:RunInstances","resource":"arn:aws:ec2:ap-northeast-2:************:instance/*","conditions":{"items":[{"key":"ec2:InstanceMarketType","values":{"items":[{"value":"on-demand"}]}},{"key":"aws:Resource","values":{"items":[{"value":"instance/*"}]}},{"key":"aws:Account","values":{"items":[{"value":"************"}]}},{"key":"ec2:AvailabilityZone","values":{"items":[{"value":"ap-northeast-2a"}]}},{"key":"ec2:ebsOptimized","values":{"items":[{"value":"false"}]}},{"key":"ec2:IsLaunchTemplateResource","values":{"items":[{"value":"false"}]}},{"key":"ec2:InstanceType","values":{"items":[{"value":"t2.micro"}]}},{"key":"ec2:RootDeviceType","values":{"items":[{"value":"ebs"}]}},{"key":"aws:Region","values":{"items":[{"value":"ap-northeast-2"}]}},{"key":"aws:Service","values":{"items":[{"value":"ec2"}]}},{"key":"ec2:InstanceID","values":{"items":[{"value":"*"}]}},{"key":"aws:Type","values":{"items":[{"value":"instance"}]}},{"key":"ec2:Tenancy","values":{"items":[{"value":"default"}]}},{"key":"ec2:Region","values":{"items":[{"value":"ap-northeast-2"}]}},{"key":"aws:ARN","values":{"items":[{"value":"arn:aws:ec2:ap-northeast-2:************:instance/*"}]}}]}}}

echo コマンドを使い、バックスラッシュを無くしたので、今回は一行になっているJSON形式を見やすくしましょう。
結果をVSCodeにコピーします。

その後、下の[Plain Text]の部分をクリックし、JSONを検索して選択します。

そうなると、色が変わります。

その状態でショートカットでフォーマットをすると、見やすいJSONの形式になります。
VSCodeのフォーマットのショートカット
[ Windows : Alt + Shift + F ]
[ Mac : Option + Shift + F ]
[ Ubuntu : Ctrl + Shift + I ]

JSONの内容ではEC2の情報及びどんなアクションをしようとしたのかなどを確認できるので、エラーを解決する時に良いと思います。

{
    "allowed": false,
    "explicitDeny": false,
    "matchedStatements": {
        "items": []
    },
    "failures": {
        "items": []
    },
    "context": {
        "principal": {
            "id": "AROA3DULRMV2FQL46MIE4:i-0eb204ac0ae012989",
            "arn": "arn:aws:sts::************:assumed-role/EC2RoleIAM/i-0eb204ac0ae012989"
        },
        "action": "ec2:RunInstances",
        "resource": "arn:aws:ec2:ap-northeast-2:************:instance/*",
        "conditions": {
            "items": [
                {
                    "key": "ec2:InstanceMarketType",
                    "values": {
                        "items": [
                            {
                                "value": "on-demand"
                            }
                        ]
                    }
                },
                {
                    "key": "aws:Resource",
                    "values": {
                        "items": [
                            {
                                "value": "instance/*"
                            }
                        ]
                    }
                },
                {
                    "key": "aws:Account",
                    "values": {
                        "items": [
                            {
                                "value": "************"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:AvailabilityZone",
                    "values": {
                        "items": [
                            {
                                "value": "ap-northeast-2a"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:ebsOptimized",
                    "values": {
                        "items": [
                            {
                                "value": "false"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:IsLaunchTemplateResource",
                    "values": {
                        "items": [
                            {
                                "value": "false"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:InstanceType",
                    "values": {
                        "items": [
                            {
                                "value": "t2.micro"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:RootDeviceType",
                    "values": {
                        "items": [
                            {
                                "value": "ebs"
                            }
                        ]
                    }
                },
                {
                    "key": "aws:Region",
                    "values": {
                        "items": [
                            {
                                "value": "ap-northeast-2"
                            }
                        ]
                    }
                },
                {
                    "key": "aws:Service",
                    "values": {
                        "items": [
                            {
                                "value": "ec2"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:InstanceID",
                    "values": {
                        "items": [
                            {
                                "value": "*"
                            }
                        ]
                    }
                },
                {
                    "key": "aws:Type",
                    "values": {
                        "items": [
                            {
                                "value": "instance"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:Tenancy",
                    "values": {
                        "items": [
                            {
                                "value": "default"
                            }
                        ]
                    }
                },
                {
                    "key": "ec2:Region",
                    "values": {
                        "items": [
                            {
                                "value": "ap-northeast-2"
                            }
                        ]
                    }
                },
                {
                    "key": "aws:ARN",
                    "values": {
                        "items": [
                            {
                                "value": "arn:aws:ec2:ap-northeast-2:************:instance/*"
                            }
                        ]
                    }
                }
            ]
        }
    }
}

例えば、今回の例で使った上のエラーの場合、RunInstancesを実行する権限がなかったので出るエラーでした。

3. まとめ

今回はsts decode-authorization-messageのコマンドを使い、エラーメッセージを詳しく確認しみました。エラーも早く解決するためには詳しい情報を確認するのも大事だと思いますので、良いコマンドだと思います。