

# 単一値と複数値のコンテキストキー
<a name="reference_policies_condition-single-vs-multi-valued-context-keys"></a>

単一値のコンテキストキーと複数値のコンテキストキーの違いは、ポリシー条件の値の数ではなく、[リクエストコンテキスト](intro-structure.md#intro-structure-request)の値の数にあります。
+ 単一値の条件コンテキストキーはリクエストコンテキストに、最大で 1 つの値を持ちます。例えば、AWS でリソースにタグを付けると、各リソースタグは key-value ペアとして保存されます。リソースタグキーは単一のタグ値しか持つことができないため、[aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag) は単一値のコンテキストキーです。単一値のコンテキストキーで条件集合演算子を使用しないでください。
+ 複数値の条件コンテキストキーは、リクエストコンテキストに複数の値を持つことができます。例えば、AWS でリソースにタグを付ける場合、1 つのリクエストに複数のタグの key-value ペアを含めることができます。したがって、[aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) は複数の値を持つコンテキストキーです。複数値のコンテキストキーには条件集合演算子が必要です。

例えば、リクエストは最大でも 1 つの VPC エンドポイントから発信されるため、[aws:SourceVpce](reference_policies_condition-keys.md#condition-keys-sourcevpce) は単一値のコンテキストキーです。サービスには、そのサービスに属するサービスプリンシパル名を複数持つことができるため、[aws:PrincipalServiceNamesList](reference_policies_condition-keys.md#condition-keys-principalservicenameslist) は複数値のコンテキストキーです。

**重要**  
単一値と複数値のコンテキストキーの違いは、ポリシー条件の値の数ではなく、リクエストコンテキストの値の数によります。

## 重要ポイント
<a name="reference_policies_condition-key-points"></a>
+ 単一値と複数値の分類については、条件コンテキストキーの値の種類として、[AWS グローバル条件コンテキストキー](reference_policies_condition-keys.md) トピックでそれぞれ説明されています。
+ 「[サービス認証リファレンス](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)」にある複数値のコンテキストキーは、`ArrayOfString` や `ArrayOfARN` などの条件演算子カテゴリタイプが付加された `ArrayOf` プレフィックスを使用します。これらは、リクエスト内に条件コンテキストキーの複数の値が含まれる可能性があることを示します。
+ 使用可能な単一値のコンテキストキーはポリシー変数として使用できますが、複数値のコンテキストキーをポリシー変数として使用することはできません。ポリシー変数の詳細については、「[IAM ポリシーの要素: 変数とタグ](reference_policies_variables.md)」を参照してください。
+ key-value ペアを含むコンテキストキーを使用する場合は、複数の tag-key 値があっても、各 `tag-key` は 1 つの値しか持てないことに留意してください。
  + [aws:PrincipalTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-principaltag)、[aws:RequestTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-requesttag)、[aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag) は単一値のコンテキストキーです。
  + [aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) はリクエストで許可されるタグキーを定義しますが、タグキー値は含まれません。1 つのリクエストにタグのキーバリューペアを複数含めることができるため、`aws:TagKeys` は複数値のコンテキストキーです。
+ 複数値のコンテキストキーには条件集合演算子が必要です。単一値のコンテキストキーで、条件集合演算子の `ForAllValues` または `ForAnyValue` を使用しないでください。単一値のコンテキストキーで条件集合演算子を使用すると、過度にポリシーが許容される可能性があります。

## 複数値のコンテキストキーの演算子を設定する
<a name="reference_policies_condition-multi-valued-context-keys"></a>

条件コンテキストキーを、複数の値を持つ[リクエストコンテキスト](intro-structure.md#intro-structure-request)キーと比較するには、`ForAllValues` または `ForAnyValue` 集合演算子を使用する必要があります。これらの集合演算子は、リクエストにあるタグのセットと、ポリシー条件にあるタグのセットなど、2 つの値のセットを比較する場合に使われます。

`ForAllValues` および `ForAnyValue` の修飾子によって条件演算子にセット演算機能が追加されるため、リクエストコンテキストキーを、ポリシー条件内の複数のコンテキストキーの値に照らしてテストできます。さらに、ワイルドカードまたは変数を使用してポリシーに複数値の文字列コンテキストキーを含める場合は、`StringLike` [条件演算子](reference_policies_elements_condition_operators.md#Conditions_String)も使用する必要があります。複数の条件キーの値は、[配列](reference_policies_grammar.md#policies-grammar-json)のように括弧で囲む必要があります (例: `"Key2":["Value2A", "Value2B"]`)。

### ForAllValues
<a name="reference_policies_condition-forallvalues"></a>

`ForAllValues` 修飾子は、リクエストコンテキストのすべてのメンバーの値が、修飾子の後に続く条件演算子と一致するかどうかをテストします。条件は、リクエスト内のすべてのコンテキストキーの値がポリシー内のコンテキストキーの値に一致する場合に `true` を返します。また、リクエストにコンテキストキーがない場合も、`true` を返します。

**重要**  
`ForAllValues` を `Allow` 効果で使用するときは、リクエストコンテキストでのコンテキストキーの欠落が予想外である場合に許容範囲が広くなりすぎる可能性があるため、注意が必要です。ポリシーには [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) 条件演算子と `false` 値を常に含めて、コンテキストキーが存在するかどうか、その値が null でないかどうかをチェックする必要があります。例については、[タグキーに基づいたアクセスの制御](access_tags.md#access_tags_control-tag-keys)を参照してください。

#### ForAllValues 集合演算子の例
<a name="reference_policies_condition-forallvalues-example"></a>

次の例では、ユーザーが EC2 インスタンスに割り当てられた特定のタグを削除できるようにするために、ForAllValues が aws:TagKeys とともに使用されています。このポリシーは、ユーザーが `environment` タグと `cost-center` タグのみを削除できるようにします。これらのタグは、個別に削除することも、一緒に削除することも可能です。リクエスト内のタグキーは、ポリシーで指定されたキーと完全に一致する必要があります。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DeleteTags",
            "Resource": "arn:aws:ec2:us-east-1:{{111122223333}}:instance/*",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "environment",
                        "cost-center"
                    ]
                },
                "Null": {
                    "aws:TagKeys": "false"
                }
            }
        }
    ]
}
```

------

次の表は、AWS がリクエストの条件キー値に基づいてこのポリシーを評価する方法を示しています。


| ポリシー条件 | リクエストコンテキスト | 結果 | 
| --- | --- | --- | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment</pre>  | **一致** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – cost-center</pre>  | **一致** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – cost-center</pre>  | **一致** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – dept</pre>  | **一致なし** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | リクエストコンテキストに `aws:TagKeys` はありません。 | **一致なし** | 

最後の例では、Null 条件チェックがコンテキストキーが欠落している場合の一致を防ぐため、結果が「一致なし」になることに留意してください。これは、許容範囲が過度に広範なポリシーを回避するためのベストプラクティスです。

### ForAnyValue
<a name="reference_policies_condition-foranyvalue"></a>

`ForAnyValue` 修飾子は、リクエストにあるコンテキストキーの値セットの少なくとも 1 メンバーが、ポリシー条件にあるコンテキストキーの値セットの少なくとも 1 メンバーに一致するかどうかをテストします。リクエストにあるコンテキストキーの値のいずれかが、ポリシーにあるコンテキストキーの値のいずれかに一致すると、条件が `true` を返します。一致するコンテキストキーがない、またはキーが存在しない場合、条件は `false` を返します。

**重要**  
`ForAnyValue` を `Deny` 効果で使用していて、リクエストにコンテキストキーが存在しないという場合、ポリシーは**一致なし**として評価します。一貫した動作のため、ポリシーに明示的な [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) 条件チェックを追加して、コンテキストキーが存在するかどうかを確認します。詳細については、「[条件キーの有無をチェックする条件演算子](reference_policies_elements_condition_operators.md#Conditions_Null)」を参照してください。

#### ForAnyValue 集合演算子の例
<a name="reference_policies_condition-foranyvalue-example"></a>

次の例では、ユーザーが EC2 インスタンスに割り当てられた特定のタグを削除できるようにするために、ForAnyValue が aws:TagKeys とともに使用されています。このポリシーは、リクエストで指定されたタグキーに `environment` または `cost-center` が含まれている場合に、ユーザーがインスタンスのタグを削除できるようにします。リクエストには、ポリシーで指定されたタグキー以外の追加のタグキーを含めることができますが、条件に一致させるには、指定されたキーの少なくとも 1 つを含める必要があります。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DeleteTags",
            "Resource": "arn:aws:ec2:us-east-1:{{111122223333}}:instance/*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:TagKeys": [
                        "environment",
                        "cost-center"
                    ]
                }
            }
        }
    ]
}
```

------

次の表は、AWS がリクエストの条件キー値に基づいてこのポリシーを評価する方法を示しています。


| ポリシー条件 | リクエストコンテキスト | 結果 | 
| --- | --- | --- | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment</pre>  | **一致** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – cost-center</pre>  | **一致** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – cost-center</pre>  | **一致** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – dept</pre>  | **一致** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – dept</pre>  | **一致なし** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | リクエストコンテキストに `aws:TagKeys` はありません。 | **一致なし** | 