IAM権限エラー「AccessDeniedException」や「.. not authorized to perform」に遭遇時、必要な権限を付与するためのエラーの見方を解説

IAM権限エラーからアタッチすべき必要な権限が理解できるよう、エラー文を解説します。
2023.04.06

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

はじめに

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権限のエラー対応について、理解できたのではないでしょうか。

参考になれば幸いです。

参考