はじめに
あるAWS環境でAMIからEC2インスタンスを起動したところ、以下のメッセージと共にEC2インスタンスの起動に失敗しました。
You are not authorized to perform this operation. Encoded authorization failure message: XXXXXXX(中略)
調査
操作アカウントはAmazonEC2FullAccess権限が付与されていることは事前確認済みでした。
メッセージを調べてみると、AWSのナレッジ センターに同様の事例がありました。
ナレッジに沿って、下記のコマンドでメッセージをデコードします。実行ユーザにはsts:DecodeAuthorizationMessage権限が付与されていることが前提です。
$ aws sts decode-authorization-message --encoded-message encoded-message
$ aws sts decode-authorization-message --encoded-message XXXXXXX(中略) { "DecodedMessage": "{\"allowed\":false,\"explicitDeny\":false,\"matchedStatements\":(中略)" }
出力結果は見ずらいので、Visual Studio Codeなどで整形すると以下のようになります。
{ "allowed": false, "context": { "action": "iam:PassRole", "conditions": { "items": [ { "key": "aws:Region", "values": { "items": [ { "value": "ap-northeast-1" } ] } }, { "key": "aws:Service", "values": { "items": [ { "value": "ec2" } ] } }, 以下略
ナレッジ同様、PassRoleの権限がないことがわかりました。
PassRoleはどんな権限なのか。回答は公式ドキュメントに記載がありました
ユーザーが AWS サービスにロールを渡すには、IAM ユーザー、ロール、またはグループに PassRole アクセス許可を付与する必要があります。
今回、EC2インスタンスの起動時にIAM instance profileを設定していたため、AmazonEC2FullAccessだけではなく、別にPassRoleの権限も付与が必要だったのです。
PassRoleの権限を追加で付与して起動エラーは解決しました。
あとがき
AmazonEC2FullAccess権限が付与されていれば、EC2インスタンスのを起動するのに必要な権限がすべて揃っていると思われがちですが、
IAM instance profileを起動時に付与する場合は別の権限も必要になるのでユーザの権限設定時は意図した通りの動作になるかテストしましょう。