メニュー
AWS Identity and Access Management
ユーザーガイド

IAM ポリシーのトラブルシューティング

この情報は、IAM ポリシーで検出された共通のエラー (例: 構文エラー) を診断して変更するために使用します。

IAM ポリシーは JavaScript Object Notation (JSON) のルールで始まる構文を使用します。JSON では、「オブジェクト」およびオブジェクトを構成する名前と値のペアを指定します。IAM ポリシーの文法は、JSON ルールに基づき、名前と値の意味、およびその名前と値がアクセス権限を付与するために使用する AWS サービスによってどう解釈されるかを定義して構築されます。

複数のポリシーオブジェクト

IAM ポリシーは、1 つの JSON オブジェクトのみで構成する必要があります。オブジェクトは括弧({ })で囲んで示します。外側の { } のペア内に追加の { } を埋め込むことによって JSON オブジェクト内で他のオブジェクトをネストすることができますが、ポリシーに含めることができるのは一番外側の { } のペアのみです。次の例は、最上位に 2 つのオブジェクト (で示した箇所) が含まれているので誤りです。

{
  "Version": "2012-10-17",
  "Statement": 
  {
     "Effect":"Allow",
     "Action":"ec2:Describe*",
     "Resource":"*"
  }
}
{ 
  "Statement": {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "arn:aws:s3:::my-bucket/*"
  }
}

ただし、正しいポリシーの文法を使用して、前述の例の目的を果たすことができます。それぞれに独自の Statement 要素を含む 2 つのポリシーオブジェクトを含める代わりに、1 つの Statement 要素に 2 つのブロックを組み合わせて使用することができます。Statement 要素には、次の例 (太字で示した箇所) に示すように 2 つのオブジェクトの配列を値として指定します。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":" *" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-bucket/*" } ] }

複数の Statement 要素

このエラーは、一見、前のセクションのバリエーションのように見えますが、構文上はエラーの種類が異なります。次の例には、最上位の 1 ペアの { } で示された 1 つのポリシーオブジェクトのみが存在します。そのオブジェクト内に 2 つの Statement 要素が含まれています。

IAM ポリシーには、名前(Statement)の後にコロン、その後に値という形式で構成される 1 つの Statement 要素のみを指定する必要があります。Statement 要素の値は、{} で示され、1 つの Effect 要素、1 つの Action 要素、および 1 つの Resource 要素を含むオブジェクトである必要があります。次の例は、ポリシーオブジェクト ( で示した箇所) に 2 つの Statement 要素が含まれているので誤りです。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "ec2:Describe*",
    "Resource": "*"
  },
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::my-bucket/*"
  }
}

値のオブジェクトは複数の値がオブジェクトの配列でもかまいません。この問題を解決するには、次の例 (太字で示した箇所) に示すように、2 つの Statement 要素を 1 つの要素に合わせます。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":"*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-bucket/*" } ] }

Statement 要素の値はオブジェクト配列です。この例の配列は 2 つのオブジェクトで構成され、各オブジェクトに Statement 要素の正しい値が指定されています。配列内の各オブジェクトはカンマで区切ります。

Statement 要素内の複数の Effect、Action、Resource 要素

Statement の名前と値のペアの値側のオブジェクトは 1 つの Effect 要素、1 つの Action 要素、1 つの Resource 要素のみで構成する必要があります。次のポリシーは、Statement の値オブジェクトに 2 つの Effect 要素が含まれているので誤りです。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Deny",
    "Effect": "Allow",     
    "Action": "ec2:* ",
    "Resource": "*"
  }
}

注記

ポリシーエンジンでは、新規ポリシーまたは編集済みのポリシーでそのようなエラーを許可することはできません。ただし、ポリシーエンジンは、エンジンが更新される前に保存されたポリシーを引き続き許可します。エラーが存在する既存のポリシーの動作は次のとおりです。

  • 複数の Effect 要素: 最後の Effect 要素のみが確認され、それ以外は無視されます。

  • 複数の Action 要素: すべての Action 要素が内部的に結合され、単一のリストとして処理されます。

  • 複数の Resource 要素: すべての Resource 要素が内部的に結合され、単一のリストとして処理されます。

ポリシーエンジンでは、構文エラーのあるポリシーを保存することはできません。保存する前にポリシーのエラーを修正する必要があります。Policy Validator ツールは、すべての旧ポリシーのエラーの検出に役立ち、修正に関する推奨を提示します。

いずれの場合も、解決策は誤って追加した要素を削除することです。Effect の場合は簡単です。前述の例で Amazon EC2 インスタンスへのアクセス権限を拒否するには、次のように、ポリシーから "Effect": "Allow", の行を削除する必要があります。

Copy
{ "Version": "2012-10-17", "Statement": { "Efect": "Deny", "Action": "ec2:* ", "Resource": "*" } }

重複している要素が Action または Resource の場合、解決法はより複雑になることがあります。アクセス権限を許可(または拒否)するアクションが複数存在したり、複数のリソースへのアクセスを制御したりすることが必要な場合があります。たとえば、次の例 (で示した箇所) は、複数の Resource 要素が含まれているので誤りです。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::my-bucket",
    "Resource": "arn:aws:s3:::my-bucket/*"
  }
}

Statement 要素の値オブジェクトに必要な要素は、それぞれ 1 つだけ含めることができます。この問題を解決するには、各値を配列に指定します。次の例は、値オブジェクト形式の配列 (太字で示した箇所) を使用して 2 つの異なるリソース要素を 1 つの Resource 要素として扱う方法を示しています。

Copy
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ] } }

欠落しているポリシーの概要

IAM コンソールには、ポリシー内の各サービスに対して許可または拒否されるアクセスレベル、リソース、条件を定義するポリシー概要テーブルが含まれます。ポリシーは、ポリシー概要サービス概要アクション概要の 3 つのテーブルにまとめられています。ポリシー概要テーブルには、選択したポリシーによって定義されているサービスとアクセス権限の概要のリストが含まれます。[Users] ページで、ユーザーにアタッチされているポリシー概要を表示できます。[Policies] ページで、管理ポリシーのポリシー概要を表示できます。AWS がポリシーの概要をレンダリングできない場合は、概要ではなく JSON ポリシードキュメントが表示され、次のエラーが表示されます。

このポリシーの概要を生成できません。JSON ポリシードキュメントは引き続き表示または編集できます。

ポリシーに要約が含まれていない場合は、次のいずれかのエラーが発生しています。

  • サポート対象外のポリシー要素 – IAM では、以下のポリシー要素のうちいずれかを含むポリシー概要の生成がサポートされていません。

    • Principal

    • NotPrincipal

    • NotResource

  • ポリシーのアクセス権限なし – ポリシーによって有効なアクセス権限が付与されない場合、ポリシー概要を生成できません。たとえば、ポリシーに含まれる 1 つのステートメントで要素 "NotAction": "*" がある場合です。この場合、すべてのアクション (*) を除くすべてのアクションへのアクセスを許可しています。つまり、Deny または Allow のいずれにもアクセスを付与しません。

    注記

    NotPrincipalNotActionNotResource など、これらのポリシー要素は慎重に使用する必要があります。ポリシー要素の使用に関する詳細については、「IAM ポリシーエレメントのリファレンス」を参照してください。

    作成したポリシーで、サービスとリソースが一致していないと、有効なアクセス権限が付与されないことがあります。たとえば、あるサービスのアクションを指定し、別のサービスのリソースを指定した場合です。この場合は、ポリシー概要が表示されます。概要のリソース列に別のサービスのリソースが含まれていることからしか、問題があることはわかりません。この列に不一致のリソースが含まれる場合は、ポリシーのエラーを確認する必要があります。ポリシーをより深く理解するために、必ず Policy Simulator でテストしてください。

ポリシー概要に認識されないサービス、アクション、リソースタイプが含まれる

IAM コンソールで、ポリシー概要に警告記号 ( ) が表示される場合、認識されないサービス、アクション、またはリソースタイプがポリシーに含まれている可能性があります。ポリシー概要内での警告については、「ポリシー概要 (サービスの一覧)」を参照してください。

注記

IAM によって、ポリシー概要をサポートするサービスの名前、アクション、リソースタイプが確認されます。ただし、ポリシー概要には、存在しないリソース値または条件が含まれる可能性があります。必ず Policy Simulator でポリシーをテストしてください。

ポリシーに認識されないサービス、アクション、またはリソースタイプが含まれている場合は、以下のいずれかのエラーが発生しています。

  • プレビューサービス – プレビュー中のサービスはポリシー概要をサポートしていません。

  • カスタムサービス – カスタムサービスはポリシー概要をサポートしていません。

  • サービスが概要をサポートしていない – ポリシー概要をサポートしていない一般公開された (GA) サービスがポリシーに含まれる場合、そのサービスは、ポリシー概要テーブルの [Unrecognized services] セクションに含まれます。一般公開されたサービスとは、プレビューやカスタムサービスではない、一般にリリースされたサービスです。認識されないサービスが一般公開されていて、名前のスペルが正しくない場合、そのサービスは IAM ポリシー概要をサポートしません。GA サービスに対するポリシー概要のサポートをリクエストする方法については、「サービスが IAM ポリシー概要をサポートしていない」を参照してください。

  • アクションが概要をサポートしていない – ポリシーに含まれるサービスがサポートされていても、アクションがサポートされていない場合、そのアクションはサービス概要テーブルの [Unrecognized actions] セクションに含まれます。サービス概要内での警告については、「サービス概要 (アクションのリスト)」を参照してください。

  • リソースタイプが概要をサポートしていない – ポリシーに含まれるアクションがサポートされていても、リソースタイプがサポートされていない場合、そのリソースは、サービス概要テーブルの [Unrecognized resource types] セクションに含まれます。サービス概要内での警告については、「サービス概要 (アクションのリスト)」を参照してください。

  • タイプミス – AWS の Policy Validator は JSON が構文上正しいことのみをチェックするため、タイプミスを含むポリシーが作成される可能性があります。ポリシーに、確実に上記のエラーが含まれていない場合は、ポリシーにタイプミスが含まれている可能性があります。サービス、アクション、およびリソースタイプの名前にタイプミスがないか確認してください。たとえば、s3 ではなく s2 を使用したり、ListAllMyBucketsではなく ListMyBuckets を使用する場合があります。アクションによくある別のタイプミスは、arn:aws:s3: : :* など、ARN に不要なテキストが含まれているものや、AWSAuthRuntimeService.AuthenticatePassword など、アクションにコロンがないものです。ポリシーシュミレーターを使用して、タイプミスを含む可能性のあるポリシーを評価し、そのポリシーが意図したアクセス許可を付与するかどうかを確認できます。

サービスが IAM ポリシー概要をサポートしていない

一般公開された (GA) サービスまたはアクションが IAM のポリシー概要で認識されない場合、サービスがこれらの概要をサポートしていない可能性があります。一般公開されたサービスとは、プレビューやカスタムサービスではない、一般にリリースされたサービスです。認識されないサービスが一般公開されていて、名前のスペルが正しくない場合、そのサービスは IAM ポリシー概要をサポートしません。ポリシーに含まれるサービスがサポートされていても、アクションがサポートされていない場合、そのサービスは IAM ポリシー概要を一部サポートしません。

IAM ポリシー概要サポートがサービスに適用されるようにリクエストするには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. サポートされていないサービスを含むポリシーを特定する

    • ポリシーが管理ポリシーの場合は、ナビゲーションペインの [Policies] を選択します。ポリシーの一覧で、表示するポリシーの名前を選択します。

    • ポリシーが、ユーザーにアタッチされているインラインポリシーの場合は、ナビゲーションペインの [Users] を選択します。ユーザーのリストから、ポリシーを表示するユーザーを選択します。ユーザーのポリシーのテーブルで、表示するポリシー概要のヘッダーを展開します。

  3. AWS マネジメントコンソール のフッターの左側にある [Feedback] を選択します。[Tell us about your experience:] ボックスに、I request that the <ServiceName> service add support for IAM policy summaries と入力します。2 つ以上のサービスで概要をサポートする場合は、I request that the <ServiceName1>, <ServiceName2>, and <ServiceName3> services add support for IAM policy summaries と入力します。

サービスの欠落したアクション向けに IAM ポリシー概要のサポートが適用されるようにリクエストするには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. サポートされていないサービスを含むポリシーを特定する

    • ポリシーが管理ポリシーの場合は、ナビゲーションペインの [Policies] を選択します。ポリシーの一覧で、表示するポリシーの名前を選択します。

    • ポリシーが、ユーザーにアタッチされているインラインポリシーの場合は、ナビゲーションペインの [Users] を選択します。ユーザーのリストから、ポリシーを表示するユーザーを選択します。ユーザーのポリシーのテーブルで、ポリシー概要を展開するために表示するポリシー名を選択します。

  3. ポリシー概要で、サポートされていないアクションを含むサービスの名前を選択します。

  4. AWS マネジメントコンソール のフッターの左側にある [Feedback] を選択します。[Tell us about your experience:] ボックスで、I request that the <ServiceName> service add IAM policy summary support for the <ActionName> action と入力します。サポートされていないアクションを 2 つ以上レポートする場合は、I request that the <ServiceName> service add IAM policy summary support for the <ActionName1>, <ActionName2>, and <ActionName3> actions と入力します。

不足しているアクションを別のサービスに含めるようにリクエストするには、最後の 3 つの手順を繰り返します。

使用するポリシーが予期するアクセス許可を付与しない

ユーザー、グループ、ロール、リソースにアクセス許可を割り当てるには、ポリシーを作成します。このポリシーは、アクセス許可を定義したドキュメントです。ポリシードキュメントには以下の要素が含まれます。

  • Effect – ポリシーがアクセスを許可または拒否するかどうか

  • Action – ポリシーによって許可または拒否されるアクションのリスト

  • Resource – アクションを起こすことができるリソースのリスト

  • Condition (オプション) – ポリシーがアクセス許可を付与する状況

これらのポリシーの要素の詳細または他の要素については「IAM ポリシーエレメントのリファレンス」を参照してください。

アクセスを許可するには、サポートされたリソースでポリシーにアクションを定義する必要があります。ポリシーに条件も含まれている場合は、条件にグローバル条件キーが含まれている必要があります。または、条件をアクションに適用する必要があります。アクションでサポートされているリソースを確認するには、サービスの「AWS に関するドキュメント」を参照してください。アクションでサポートされている条件を確認するには、「IAM ポリシーで使用できる AWS サービスアクションと条件コンテキストキー」を参照してください。

アクセス許可を付与しないアクション、リソース、条件がポリシーで定義されていないか確認するには、https://console.aws.amazon.com/iam/ で IAM コンソールを使用してポリシー概要を表示すると確認できます。ポリシー概要を使用すると、ポリシーの問題を特定して解決することができます。

次のような理由により、IAM ポリシーで定義されているにもかかわらず、要素がアクセス許可を付与しない場合があります。

警告を含むポリシー概要の例を表示するには、「ポリシー概要 (サービスの一覧)」を参照してください。

該当するリソースのないアクションが定義されている

以下のポリシーは、すべての ec2:Describe* アクションを定義し、特定のリソースを定義します。すべての ec2:Describeアクションにはサポートされるリソースレベルのアクセス許可がないため、アクセスが付与されません。リソースレベルのアクセス権限とは、ポリシーの Resource 要素で ARN を使用するリソースをアクションがサポートしていることを意味します。アクションがリソースレベルのアクセス許可をサポートしない場合、ポリシーのステートメントは Resource 要素でワイルドカード (*) を使用する必要があります。リソースレベルのアクセス許可をサポートするサービスを確認するには、「IAM と連携する AWS サービス」を参照してください。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": "ec2:Describe*",
        "Resource": "arn:aws:ec2:us-east-2:ACCOUNT-ID:instance/*"
    }]
}

このポリシーはアクセス許可を指定せず、ポリシー概要には次のエラーが表示されます。

This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.

このポリシーを修正するには、Resource 要素に * を使用する必要があります。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": "ec2:Describe*",
        "Resource": "*"
    }]
}

該当するアクションのないリソースが定義されている

以下のポリシーは Amazon S3 バケットリソースを定義していますが、そのリソースで実行可能な S3 アクションは含まれていません。このポリシーはすべての Amazon CloudFront アクションに対するフルアクセスも供与しています。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": "cloudfront:*",
        "Resource": [
            "arn:aws:cloudfront:*",
            "arn:aws:s3:::examplebucket"
        ]
    }]
}

このポリシーではすべての CloudFront アクションに対するアクセス許可が与えられています。しかし、ポリシーが S3 アクションを定義せずに S3 examplebucket リソースを定義しているために、ポリシー概要では次のように警告されます。

This policy defines some actions, resources, or conditions that do not provide permissions. To grant access, policies must have an action that has an applicable resource or condition.

このポリシーを修正して S3 バケットのアクセス許可を与えるために、バケットリソースで実行可能な S3 アクションを定義する必要があります。

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "cloudfront:*",
            "s3:CreateBucket",
            "s3:ListBucket*",
            "s3:PutBucket*",
            "s3:GetBucket*"
        ],
        "Resource": [
            "arn:aws:cloudfront:*",
            "arn:aws:s3:::examplebucket"
        ]
    }]
}

あるいは、CloudFront アクセス許可のみが提供されるように、S3 リソースを削除してこのポリシーを修正してください。

該当するアクションのない条件が定義されている

以下のポリシーは、S3 プレフィックスが custom でバージョン ID が 1234 の場合に、すべての S3 リソースに対して 2 つの Amazon S3 アクションを定義しています。しかし、s3:VersionId 条件キーは、オブジェクトバージョンのタグ付けに使用され、定義済みのバケットアクションではサポートされていません。アクションでサポートされている条件を確認するには「IAM ポリシーで使用できる AWS サービスアクションと条件コンテキストキー」を参照して、条件キーのサービスドキュメントのリンクをクリックしてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "custom"
                    ],
                    "s3:VersionId": [
                        "1234"
                    ]
                }
            }
        }
    ]
}

このポリシーでは s3:ListBucket アクションに対するアクセス許可が与えられ、さらに、バケット名に custom プレフィックスが含まれている場合、s3:ListBucket アクションに対するアクセス許可が与えられています。しかし、定義済みのアクションでは s3:VersionId 条件がサポートされていないために、ポリシー概要には次のエラーが表示されます。

This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.

S3 オブジェクトのバージョンをタグ付けできるようにこのポリシーを修正するには、s3:VersionId 条件キーをサポートする S3 アクションを定義する必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket",
                "s3:GetObjectVersion"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "custom"
                    ],
                    "s3:VersionId": [
                        "1234"
                    ]
                }
            }
        }
    ]
}

このポリシーでは、ポリシー内のすべてのアクションと条件に対するアクセス許可が提供されています。それにもかかわらず、ポリシーからはどのアクセス許可もいまだに指定されていません。これは、1 つのアクションで両方の条件に一致しているケースがないためです。この場合は、適用する条件付きの専用アクションが含まれている、個別のステートメントを 2 つ作成する必要があります。

このポリシーを修正するには、次のようにステートメントを 2 つ作成します。最初のステートメントには s3:prefix 条件をサポートするアクションが含まれるようにし、2 番目のステートメントには s3:VersionId 条件をサポートするアクションが含まれるようにします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:prefix": "custom"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObjectVersion",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:VersionId": "1234"
                }
            }
        }
    ]
}

Version 要素の欠落

Version ポリシー要素は、 ポリシーバージョンとは異なります。Version ポリシー要素は、ポリシー内で使用され、ポリシー言語のバージョンを定義します。一方で、ポリシーバージョンは、IAM でカスタマー管理ポリシーを変更すると作成されます。変更されたポリシーによって既存のポリシーが上書きされることはありません。代わりに、IAM は管理ポリシーの新しいバージョンを作成します。Version ポリシー要素の詳細については、「Version」を参照してください。ポリシーのバージョンの詳細については、「管理ポリシーのバージョニング」を参照してください。

AWS 機能の進化に伴い、この機能をサポートする新しい機能が IAM ポリシーに追加されました。ポリシー構文を更新すると、新しいバージョン番号が含まれている場合があります。ポリシーでポリシー文法の新しい機能を使用する場合は、使用しているバージョンをポリシー解析エンジンに通知する必要があります。デフォルトのポリシーのバージョンは "2008-10-17" です。後から導入されたポリシー機能を使用する場合は、使用する機能をサポートするバージョン番号を指定する必要があります。必ず最新のポリシー構文のバージョン番号 (現時点では "Version": "2012-10-17") を指定することをお勧めします。たとえば、次のポリシーは、ポリシー変数をサポートするポリシー構文のバージョン (で示した箇所) を指定せずにリソースの ARN でポリシー変数 (${...}) を使用しているので誤りです。

{
  "Statement": 
  {
    "Action": "iam:*AccessKey*",
    "Effect": "Allow",
    "Resource": "arn:aws:iam::123456789012:user/${aws:username}"
  }
}

ポリシーの先頭に Version 要素とその値 2012-10-17 (ポリシー変数をサポートする IAM API の最初のバージョン) を追加することで、この問題 (太字で示した箇所) を解決します。

Copy
{ "Version": "2012-10-17", "Statement": { "Action": "iam:*AccessKey*", "Effect": "Allow", "Resource": "arn:aws:iam::123456789012:user/${aws:username}" } }

IAM アカウントでポリシーをアタッチまたはデタッチできない

一部の AWS 管理ポリシーはサービスにリンクされています。これらのポリシーは、そのサービス用に作成したサービスにリンクされたロールでのみ使用されます。IAM コンソールでは、ポリシーの [Summary] ページを表示すると、そのポリシーがサービスにリンクされていることを示すバナーが、そのページに表示されます。このポリシーは IAM 内でユーザー、グループ、またはロールにアタッチできます。サービスにリンクされたロールをサービス用に作成すると、このポリシーは新しいロールに自動的にアタッチされます。ポリシーは必須であるため、サービスにリンクされたロールからポリシーをデタッチすることはできません。