

# IAM JSON ポリシー言語の文法
<a name="reference_policies_grammar"></a>

このページでは、IAM で JSON ポリシーを作成する際に使用する言語の正式な文法を示します。ポリシーを構築および検証する方法を理解できるようにするために、この文法を示しています。

ポリシーの例については、以下のトピックを参照してください。
+ [AWS Identity and Access Management でのポリシーとアクセス許可](access_policies.md)
+ [IAM アイデンティティベースのポリシーの例](access_policies_examples.md)
+ 「Amazon EC2 ユーザーガイド」の「[Amazon EC2 コンソールで機能するサンプル ポリシー](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html)」と「[AWS CLI (Amazon EC2 CLI) または AWS SDK で使用するサンプルポリシー](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html)」。
+  [Amazon Simple Storage Service ユーザーガイド](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)の*バケットポリシーの例*と[ユーザーポリシーの例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-policies-s3.html)。

その他の AWS サービスで使用されるポリシーの例については、各サービスのドキュメントを参照してください。

**Topics**
+ [ポリシー言語と JSON](#policies-grammar-json)
+ [この文法で使用される表記規則](#policies-grammar-conventions)
+ [文法](#policies-grammar-bnf)
+ [ポリシーの文法に関する注意事項](#policies-grammar-notes)

## ポリシー言語と JSON
<a name="policies-grammar-json"></a>

ポリシーは、JSON 形式で表されます。JSON ポリシーを作成または編集するときに、IAM はポリシー検証を実行し、効果的なポリシーを作成するのに役立ちます。IAM は JSON 構文エラーを識別します。一方、IAM Access Analyzer は、ポリシーをさらに絞り込むのに役立つ推奨事項を含む追加のポリシーチェックを提供します。ポリシーの検証の詳細については、「[IAM ポリシーの検証](access_policies_policy-validator.md)」を参照してください。。IAM Access Analyzer ポリシーチェックと実用的な推奨事項の詳細については、「[IAM Access Analyzer ポリシーの検証](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)」を参照してください。

このドキュメントでは、有効な JSON の構成内容については詳しく説明しません。ただし、基本的な JSON のルールをいくつか紹介します。
+ 個々のエンティティ間の空白文字は許可されています。
+ 値は引用符で囲みます。数値やブール値の場合、引用符は省略できます。
+ 多くの要素 (たとえば、`action_string_list` や `resource_string_list`) で、値として JSON 配列を使用できます。配列では 1 つまたは複数の値を使用できます。複数の値が含まれている場合、配列は次の例のように、角括弧 (`[` と `]`) で囲まれ、カンマで区切られます。

  `"Action" : ["ec2:Describe*","ec2:List*"]`
+ 基本的な JSON のデータ型 (ブール値、数値、文字列) は [RFC 7159](https://datatracker.ietf.org/doc/html/rfc7159) で定義されています。

## この文法で使用される表記規則
<a name="policies-grammar-conventions"></a>

この文法では、以下の表記規則が使用されます。
+ 以下の文字は JSON のトークンであり、ポリシーに*含まれます*。

  `{ } [ ] " , :`
+ 以下の文字は文法の特殊文字であり、ポリシーには*含まれません*。

  `= < > ( ) |`
+ 要素で複数の値を使用できる場合、繰り返し値、カンマ区切り文字、および省略符号 (`...`) で示されます。例:

  `[<action_string>, <action_string>, ...]`

  `<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }`

  複数の値が許可されている場合、値が 1 つだけ含むことも有効です。値が 1 つだけである場合、末尾のカンマは省略する必要があります。要素で配列（[ と ] で表される）を使用する場合、含まれている値が 1 つだけであるときは、角括弧を省略できます。例:

  `"Action": [<action_string>]`

  `"Action": <action_string>`
+ 要素に続く疑問符 (`?`) は、その要素が省略できることを示します。例: 

  <`version_block?>`

  ただし、省略可能な要素の詳細については、文法の一覧の後に続く注意事項を参照してください。
+ 要素間の縦棒 (`|`) は選択肢を示します。この文法では、括弧は選択肢の範囲を定義します。例:

  `("Principal" | "NotPrincipal")` 
+ リテラル文字列にする必要がある要素は二重引用符 (`"`) で囲まれます。例:

  `<version_block> = "Version" : ("2008-10-17" | "2012-10-17" )`

その他の注意事項については、文法の一覧の後にある「[ポリシーの文法に関する注意事項](#policies-grammar-notes)」を参照してください。

## 文法
<a name="policies-grammar-bnf"></a>

以下の一覧では、ポリシー言語の文法について説明します。この一覧で使用されている表記規則については、前のセクションを参照してください。詳細については、後に示されている注意事項を参照してください。

**注記**  
この文法では、`2008-10-17 ` と `2012-10-17 ` のバージョンでマークされているポリシーについて説明します。`Version` ポリシー要素は、ポリシーバージョンとは異なります。`Version` ポリシー要素は、ポリシー内で使用され、ポリシー言語のバージョンを定義します。一方で、ポリシーバージョンは、IAM でカスタマー管理ポリシーを変更すると作成されます。変更されたポリシーによって既存のポリシーが上書きされることはありません。代わりに、IAM は管理ポリシーの新しいバージョンを作成します。`Version` ポリシー要素の詳細については、「[IAM JSON ポリシー要素Version](reference_policies_elements_version.md)」を参照してください。ポリシーのバージョンの詳細については、「[IAM ポリシーのバージョニング](access_policies_managed-versioning.md)」を参照してください。

```
policy  = {
     <version_block?>,
     <id_block?>,
     <statement_block>
}

<version_block> = "Version" : ("2008-10-17"		 	 	  | "2012-10-17"		 	 	 )

<id_block> = "Id" : <policy_id_string>

<statement_block> = "Statement" : [ <statement>, <statement>, ... ]

<statement> = { 
    <sid_block?>,
    <principal_block?>,
    <effect_block>,
    <action_block>,
    <resource_block>,
    <condition_block?>
}

<sid_block> = "Sid" : <sid_string>

<effect_block> = "Effect" : ("Allow" | "Deny")  

<principal_block> = ("Principal" | "NotPrincipal") : ("*" | <principal_map>)

<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }

<principal_map_entry> = ("AWS" | "Federated" | "Service" | "CanonicalUser") :   
    [<principal_id_string>, <principal_id_string>, ...]

<action_block> = ("Action" | "NotAction") : 
    ("*" | <action_string> | [<action_string>, <action_string>, ...])

<resource_block> = ("Resource" | "NotResource") : 
    : ("*" | <resource_string> | [<resource_string>, <resource_string>, ...])

<condition_block> = "Condition" : { <condition_map> }
<condition_map> = { 
  <condition_type_string> : { <condition_key_string> : <condition_value_list> },
  <condition_type_string> : { <condition_key_string> : <condition_value_list> }, ...
}  
<condition_value_list> = [<condition_value>, <condition_value>, ...]
<condition_value> = (<condition_value_string> | <condition_value_string> | <condition_value_string>)
```

## ポリシーの文法に関する注意事項
<a name="policies-grammar-notes"></a>
+ 1 つのポリシーにステートメントの配列を含めることができます。
+ ポリシーの最大サイズは 2,048 ～ 10,240 文字で、ポリシーがアタッチされるエンティティによって異なります。詳細については、「[IAM と AWS STSクォータ](reference_iam-quotas.md)」を参照してください。ポリシーのサイズの計算には、空白文字は含まれません。
+ 個々の要素に、同じキーの複数のインスタンスを含めることはできません。たとえば、同じステートメントに `Effect` ブロックを 2 回含めることはできません。
+ ブロックは任意の順序で記述できます。たとえば、ポリシー内で `version_block` が `id_block` の後にあってもかまいません。同様に、ステートメント内で `effect_block`、`principal_block`、`action_block` は任意の順序で記述できます。
+ リソースベースのポリシーでは、`id_block` はオプションです。アイデンティティベースのポリシーに含めることは*できません*。
+ `principal_block` 要素は、リソースベースのポリシー (Amazon S3 のバケットポリシーなど) および IAM ロールの信頼ポリシーでは必須です。アイデンティティベースのポリシーに含めることは*できません*。
+ Amazon S3 バケットポリシーの `principal_map` 要素には、`CanonicalUser` ID を含めることができます。ほとんどのリソースベースのポリシーは、このマッピングをサポートしていません。バケットポリシーでの正規ユーザー ID の使用の詳細については、[Amazon Simple Storage Service ユーザーガイド](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-bucket-user-policy-specifying-principal-intro.html)の「*ポリシーでのプリンシパルの指定の*」を参照してください。
+ 各文字列値（`policy_id_string`、`sid_string`、`principal_id_string`、`action_string`、`resource_string`、`condition_type_string`、`condition_key_string`、および文字列バージョンの `condition_value`）では、それぞれの最小長と最大長の制限、特定の許容値、または必要な内部形式が決まっている場合があります。

### 文字列値に関する注意事項
<a name="policies-grammar-notes-strings"></a>

このセクションでは、ポリシー内の複数の要素で使用される文字列値に関する追加情報を示します。

**`action_string`**  
サービス名前空間、コロン、およびアクション名で構成されます。アクション名にはワイルドカードを含めることができます。例:  

```
"Action":"ec2:StartInstances"

"Action":[
  "ec2:StartInstances",
  "ec2:StopInstances"
]

"Action":"cloudformation:*"

"Action":"*"

"Action":[
  "s3:Get*",
  "s3:List*"
]
```

**`policy_id_string`**  
ポリシーに関する情報をまとめて含める方法を提供します。Amazon SQS や Amazon SNS などの一部のサービスでは、`Id` 要素は予約された方法で使用されます。個々のサービスで制限されていない限り、policy\$1id\$1string には空白文字を含めることができます。一部のサービスでは、この値が AWS アカウント内で一意である必要があります。  
`id_block` は、リソースベースのポリシーでは使用できますが、アイデンティティベースのポリシーでは使用できません。
長さに制限はありません。ただし、この文字列はポリシー全体の長さにカウントされ、全体の長さは制限されます。  

```
"Id":"Admin_Policy"

"Id":"cd3ad3d9-2776-4ef1-a904-4c229d1642ee"
```

**`sid_string`**  
個々のステートメントに関する情報含める方法を提供します。IAM ポリシーでは、基本的な英数字 (A～Z、a～z、0～9) のみを `Sid` 値に使用できます。リソースポリシーをサポートするその他の AWS サービスでは、`Sid` 値に関して他の要件がある場合があります。例えば、一部のサービスには AWS アカウント 内でこの値が一意であること、スペースなどの追加の文字を `Sid` 値で使用できることです。  

```
"Sid":"1" 

"Sid": "ThisStatementProvidesPermissionsForConsoleAccess"
```

**`principal_id_string`**  
AWS アカウント の [Amazon リソースネーム (ARN)](reference_identifiers.md#identifiers-arns)、IAM ユーザー、IAM ロール、フェデレーションユーザー、または引き受けたロールユーザーを使用してプリンシパルを指定する方法を提供します。AWS アカウント では、完全な ARN の代わりに短縮形 `AWS:accountnumber` を使用できます。AWS のサービス、割り当てられたロールなどを含むすべてのオプションについては、「[プリンシパルを指定する方法](reference_policies_elements_principal.md#Principal_specifying)」を参照してください。  
"すべてのユーザー/匿名ユーザー" を指定するには、\$1 のみを使用できることに注意してください。これを使用して名前または ARN の一部を指定することはできません。

**`resource_string`**  
多くの場合、[Amazon リソースネーム](reference_identifiers.md#identifiers-arns) (ARN) で構成されます。ARN のリソース部分でワイルドカード (\$1 と ?) を使用できます。ARN でのワイルドカードの使用の詳細については、「[パスでのワイルドカードの使用](reference-arns.md#arns-paths-wildcards)」を参照してください。  
アイデンティティベースのポリシーで不完全な ARN (標準の 6 フィールド未満の ARN) を指定すると、AWS では、欠落しているすべてのフィールドにワイルドカード文字 (\$1) が追加されて ARN が自動的に完全な形になります。例えば、`arn:aws:sqs` を指定することは `arn:aws:sqs:*:*:*` に相当します。この場合、すべてのリージョンとアカウントですべての Amazon SQS リソースへのアクセスが許可されます。ただし、AWS STS AssumeRole、AssumeRoleWithWebIdentity、AssumeRoleWithSAML リクエストに渡されたセッションポリシーは、不完全な ARN をサポートしていません。セッションポリシーで不完全な ARN を使用すると、`MalformedPolicyDocumentException` エラーが発生します。

```
"Resource":"arn:aws:iam::123456789012:user/Bob"

"Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*"
```

**`condition_type_string`**  
`StringEquals`、`StringLike`、`NumericLessThan`、`DateGreaterThanEquals`、`Bool`、`BinaryEquals`、`IpAddress`、`ArnEquals` など、テストされる条件のタイプを指定します。条件タイプの詳細なリストについては、「[IAM JSON ポリシー要素: 条件演算子](reference_policies_elements_condition_operators.md)」を参照してください。  

```
"Condition": {
  "NumericLessThanEquals": {
    "s3:max-keys": "10"
  }
}

"Condition": {
  "Bool": {
    "aws:SecureTransport": "true"
  }
}

"Condition": {
  "StringEquals": {
      "s3:x-amz-server-side-encryption": "AES256"
   }
}
```

**`condition_key_string`**  
条件が満たされているかどうかを判断するために値がテストされる条件キーを識別します。AWS は、AWS、`aws:PrincipalType`、`aws:SecureTransport`、`aws:userid` を含むすべてのサービスで使用できる条件キーのセットを定義します。  
AWS の条件キーのリストについては、「[AWS グローバル条件コンテキストキー](reference_policies_condition-keys.md)」を参照してください サービスに固有の条件キーについては、以下のようなそのサービスのドキュメントを参照してください。  
+ * Amazon Simple Storage Service ユーザーガイド*の[ポリシーでの条件の指定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazon-s3-policy-keys.html)
+ 「Amazon EC2 ユーザーガイド」の「[Amazon EC2 の IAM ポリシー](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)」。

```
"Condition":{
  "Bool": {
      "aws:SecureTransport": "true"
   }
}

"Condition": {
  "StringNotEquals": {
      "s3:x-amz-server-side-encryption": "AES256"
   }
}

"Condition": {
  "StringEquals": {
    "aws:ResourceTag/purpose": "test"
  }
}
```

**`condition_value_string`**  
条件が満たされているかどうかを判断する condition\$1key\$1string の値を識別します。条件タイプの有効な値の一覧については、「[IAM JSON ポリシー要素: 条件演算子](reference_policies_elements_condition_operators.md)」を参照してください。  

```
"Condition":{
  "ForAnyValue:StringEquals": {
		"dynamodb:Attributes": [
			"ID",
			"PostDateTime"
  	      ]
  }
}
```