IAM権限エラー「AccessDeniedException」や「.. not authorized to perform」に遭遇時、必要な権限を付与するためのエラーの見方を解説
はじめに
AWSを触っていると、CLIやコンソール上で、以下のような権限エラーに遭遇することが多々あると思います。
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::<アカウントID>:assumed-role/cm-hirai.yuji/botocore-session-xxxxxxxxx is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action
エラー解消するためのエラーの見方について解説いたします
エラーを解消する見方
エラー内容は、以下のように区切る(分解する)と理解しやすいです。
- User:
- 対象のIAMユーザー、IAMロール
- perform:
- アクション名
- resource:
- 対象のリソース
- ポリシータイプ
- アイデンティティベースポリシー、リソースベースポリシーなど
具体的なエラーを元に、エラー文分解してみましょう。
エラー例1
冒頭で例として出した、下記のエラー内容を見てみます。
こちらは、スイッチロール先でCLIでECRのログインを実行しようとした時に、発生したエラーです。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::<アカウントID>:assumed-role/cm-hirai.yuji/botocore-session-xxxxxxxxx is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action
こちらのエラーを分解してみます。
- An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation:
- User:arn:aws:sts:::
assumed-role/cm-hirai.yuji
/botocore-session-xxxxxxxxx- is not authorized to
- perform:
ecr:GetAuthorizationToken
on - resource:
*
- because no
identity-based policy
- allows the ecr:GetAuthorizationToken action
上記をまとめますと、以下のように解説できます
「スイッチ先のロール名
cm-hirai.yuji
は、リソース*
に対して、ecr:GetAuthorizationToken
権限を有したアイデンティティベースポリシー
がアタッチされていない」
というエラーになります。
そのため、下記のポリシーをアタッチすることで、解決します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ecr:GetAuthorizationToken", "Resource": "*" } ] }
エラー例2
次のエラーは、AWSマネジメントコンソールにログインしたユーザーがデータベースを作成しようとしたときのエラーになります。
User: arn:aws:iam::<アカウントID>:user/cm-hirai.yuji is not authorized to perform: rds:DescribeDBInstances on resource: arn:aws:rds:ap-northeast-1:<アカウントID>:db:* because no identity-based policy allows the rds:DescribeDBInstances action
こちらのエラーを分解してみます。
- User: arn:aws:iam:::
user/cm-hirai.yuji
- is not authorized to
- perform:
rds:DescribeDBInstances
on - resource:
arn:aws:rds:ap-northeast-1::db:*
- because no
identity-based policy
- allows the rds:DescribeDBInstances action
上記をまとめますと、以下のように解説できます
「IAMユーザー
cm-hirai.yuji
は、リソースarn:aws:rds:ap-northeast-1::db:*
に対して、rds:DescribeDBInstances
の権限を有したアイデンティティベースポリシー
がアタッチされていない」
というエラーになります。
そのため、下記のポリシーをアタッチすることで、解決します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rds:DescribeDBInstances", "Resource": "arn:aws:rds:ap-northeast-1:<アカウントID>:db:*" } ] }
エラー内容がエンコードされている場合
エラー内容がエンコードされている場合、デコードする必要があります。
次のエラーは、CLIでEC2を終了するコマンドを実行したときのものです。
$ aws ec2 terminate-instances --instance-id i-0dxxxxxxxxxx An error occurred (UnauthorizedOperation) when calling the TerminateInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: xMOMccXPAB9xXFxxxxxxxxxxxxx
Encoded authorization failure message:
以降の文字列がエンコードされていることが分かります。(マスキング済み)
デコードするためには、デコードする権限が必要ですので、以下のポリシーをアタッチしてください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:DecodeAuthorizationMessage", "Resource": "*" } ] }
デコードしてみる
以下のコマンドを実行するとデコードされます。
$ aws sts decode-authorization-message --encoded-message <デコードされたエラー内容> | jq .DecodedMessage --raw-output | jq .
jq
がインストールされていない場合、インストールするか、CloudShellをご利用ください。
出力されたjsonコードの一部を抜粋します。
{ "allowed": false, ….. "context": { "principal": { "id": "XXXXXXXXXXXXXXXX:cm-hirai.yuji", "arn": "arn:aws:sts::<アカウントID>:assumed-role/cm-hirai.yuji" }, "action": "ec2:TerminateInstances", "resource": "arn:aws:ec2:ap-northeast-1:<アカウントID>:instance/i-0dxxxxxxxxxx", …..
上記をまとめますと、以下のように解説できます
「スイッチ先のロール名
cm-hirai.yuji
は、リソースarn:aws:ec2:ap-northeast-1::instance/i-0dxxxxxxxxxx
に対して、ec2:TerminateInstances
権限を有したアイデンティティベースポリシー
がアタッチされていない」
というエラーになります。
そのため、以下のポリシーをアタッチすると解決します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:TerminateInstances", "Resource": "arn:aws:ec2:ap-northeast-1:<アカウントID>:instance/i-0dxxxxxxxxxx" } ] }
最後に
IAM権限のエラー対応について、理解できたのではないでしょうか。
参考になれば幸いです。