

# Claves de contexto de valor único y multivalor
<a name="reference_policies_condition-single-vs-multi-valued-context-keys"></a>

La diferencia entre las claves de contexto de valor único y de valor múltiple depende de la cantidad de valores en el [contexto de la solicitud](intro-structure.md#intro-structure-request), no de la cantidad de valores en la condición de la política.
+ Las claves de contexto de condición *de valor único* tienen como máximo un valor en el contexto de la solicitud. Por ejemplo, cuando etiqueta recursos en AWS, cada etiqueta de recurso se almacena como un par de clave-valor. Como una clave de etiqueta de recurso solo puede tener un valor de etiqueta único, [aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag) es una clave de contexto de valor único. No utilice un operador de conjunto de condiciones con una clave de contexto de un solo valor.
+ Las claves de contexto de condición *multivalor* pueden tener varios valores en el contexto de la solicitud. Por ejemplo, cuando etiqueta recursos en AWS, puede incluir varios pares de etiquetas de clave-valor en una única solicitud. Por lo tanto, [aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) es una clave de contexto multivalor. Las claves de contexto multivalor requieren un operador de conjunto de condiciones.

Por ejemplo, una solicitud puede originarse a lo sumo de un punto de conexión de VPC, por lo que [aws:SourceVpce](reference_policies_condition-keys.md#condition-keys-sourcevpce) es una clave de contexto de valor único. Dado que un servicio puede tener más de un nombre de entidad principal de servicio que pertenece al servicio, [aws:PrincipalServiceNamesList](reference_policies_condition-keys.md#condition-keys-principalservicenameslist) es una clave de contexto multivalor.

**importante**  
La diferencia entre las claves de contexto de valor único y multivalor depende del número de valores en el contexto de la solicitud, no de la cantidad de valores de la condición de política.

## Puntos clave
<a name="reference_policies_condition-key-points"></a>
+ Las clasificaciones *Valor único* y *Multivalor* se incluyen en la descripción de cada clave de contexto de condición como *Tipo de valor* en el tema [Claves de contexto de condición globales de AWS](reference_policies_condition-keys.md).
+ Las claves de contexto multivalor en la [Referencia de autorizaciones de servicio](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html) utilizan un prefijo `ArrayOf` seguido de la categoría del operador de condición, como `ArrayOfString` o `ArrayOfARN`, lo que indica que la solicitud puede incluir múltiples valores para una clave de contexto de condición.
+ Puede utilizar cualquier clave de contexto de valor único disponible como variable de política, pero no puede utilizar una clave de contexto de valor múltiple como variable de política. Para obtener más información sobre las variables de las políticas, consulte [Elementos de la política de IAM: variables y etiquetas](reference_policies_variables.md).
+ Cuando utiliza claves de contexto que incluyen pares de clave-valor, es importante tener en cuenta que, si bien puede haber varios valores de etiqueta y clave, cada `tag-key` solo puede tener un valor.
  + [aws:PrincipalTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-principaltag), [aws:RequestTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-requesttag) y [aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag) son claves de contexto de valor único.
  + [aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) define qué claves de etiqueta están permitidas en una solicitud, pero no incluye los valores de las claves de etiqueta. Dado que puede incluir varios pares de clave-valor de etiqueta en una solicitud, `aws:TagKeys` es una clave de contexto multivalor.
+ Las claves de contexto multivalor requieren un operador de conjunto de condiciones. No utilice los operadores de conjunto de condiciones `ForAllValues` o `ForAnyValue` con claves de contexto de un solo valor. El uso de operadores de conjuntos de condiciones con claves de contexto de valor único puede dar lugar a políticas demasiado permisivas.

## Operadores de conjunto para claves de contexto multivalor
<a name="reference_policies_condition-multi-valued-context-keys"></a>

Para comparar su clave de contexto de condición con un [contexto de solicitud](intro-structure.md#intro-structure-request) con varios valores, debe utilizar los operadores de conjunto `ForAllValues` o `ForAnyValue`. Estos operadores de conjunto se utilizan para comparar dos conjuntos de valores, como el conjunto de etiquetas en una solicitud y el conjunto de etiquetas en una condición de política.

Los calificadores `ForAllValues` y `ForAnyValue` agregan la funcionalidad de operación de conjunto al operador de condición para que pueda probar claves de contexto de solicitudes con varios valores y compararlos con varias claves de contexto de valor en una condición de política. Además, si incluye una clave de contexto multivalor en su política con un comodín o una variable, también debe utilizar el [operador de condición](reference_policies_elements_condition_operators.md#Conditions_String) `StringLike`. Las múltiples claves de contexto de valor se deben escribir entre corchetes como una [matriz](reference_policies_grammar.md#policies-grammar-json), por ejemplo, `"Key2":["Value2A", "Value2B"]`.

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

El calificador `ForAllValues` comprueba si el valor de cada miembro del contexto de solicitud coincide con el operador de condición que sigue al calificador. La condición devuelve un resultado `true` si cada clave de contexto de valor de la solicitud coincide con una clave de contexto de valor de la política. También devuelve `true` si no hay claves de contexto en la solicitud.

**importante**  
Tenga cuidado si utiliza `ForAllValues` con un efecto `Allow`, ya que puede resultar demasiado permisivo si la presencia de claves de contexto ausentes en el contexto de la solicitud es inesperada. Siempre debe incluir el operador de condición [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) en su política con un valor `false` para comprobar si la clave de contexto existe y su valor no es nulo. Para ver un ejemplo, consulta [Control del acceso en función de las claves de etiqueta](access_tags.md#access_tags_control-tag-keys).

#### Ejemplo de operador de conjunto ForAllValues
<a name="reference_policies_condition-forallvalues-example"></a>

En el siguiente ejemplo, ForAllValues se utiliza con aws:TagKeys para permitir a los usuarios eliminar etiquetas específicas asignadas a una instancia de EC2. Esta política permite a los usuarios eliminar solo las etiquetas `environment` y `cost-center`. Puede eliminarlas por separado o juntas. Las claves de etiqueta en la solicitud deben coincidir exactamente con las claves especificadas en la política.

------
#### [ 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"
                }
            }
        }
    ]
}
```

------

La siguiente tabla muestra cómo AWS evalúa esta política en función de los valores de clave de condición en su solicitud.


| Condición de política | Contexto de la solicitud | Resultado | 
| --- | --- | --- | 
|  <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>  |  **Match**  | 
|  <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>  |  **Match**  | 
|  <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>  |  **Match**  | 
|  <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>  |  **No match**  | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  |  No hay `aws:TagKeys` en el contexto de la solicitud.  |  **No match**  | 

Tenga en cuenta que, en el último ejemplo, el resultado es “No hay coincidencia” porque la comprobación de la condición nula impide que haya coincidencias cuando falta la clave de contexto. Esta es una práctica recomendada para evitar políticas demasiado permisivas.

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

El calificador `ForAnyValue` prueba si al menos un miembro del conjunto de valores de clave de contexto de la solicitud coincide con al menos un miembro del conjunto de valores de la clave de contexto de su política. La condición devuelve un resultado `true` si una de las claves de contexto de valor en la solicitud coincide con alguna de las claves de contexto de valor en la política. Si no hay una clave de contexto que coincida o si la clave no existe, la condición devuelve `false`.

**importante**  
Cuando se usa `ForAnyValue` con un efecto `Deny`, si la clave de contexto no está presente en la solicitud, la política se evalúa como **Sin coincidencia**. Para lograr un comportamiento coherente, agregue una comprobación de condición [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) explícita en su política para verificar si existe la clave de contexto. Para obtener más información, consulte [Operador de condición para comprobar la existencia de claves de condición](reference_policies_elements_condition_operators.md#Conditions_Null).

#### Ejemplo de operador de conjunto ForAnyValue
<a name="reference_policies_condition-foranyvalue-example"></a>

En el siguiente ejemplo, ForAnyValue se utiliza con aws:TagKeys para permitir a los usuarios eliminar etiquetas específicas asignadas a una instancia de EC2. Esta política permite a los usuarios eliminar etiquetas de una instancia si las claves de etiqueta especificadas en la solicitud incluyen `environment` o `cost-center`. La solicitud puede incluir claves de etiquetas adicionales a las especificadas en la política, pero debe incluir al menos una de las claves especificadas para que cumpla con la condición.

------
#### [ 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"
                    ]
                }
            }
        }
    ]
}
```

------

La siguiente tabla muestra cómo AWS evalúa esta política en función de los valores de clave de condición en su solicitud.


| Condición de política | Contexto de la solicitud | Resultado | 
| --- | --- | --- | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment</pre>  |  **Match**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – cost-center</pre>  |  **Match**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – cost-center</pre>  |  **Match**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – dept</pre>  |  **Match**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – dept</pre>  |  **No match**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  |  No hay `aws:TagKeys` en el contexto de la solicitud.  |  **No match**  | 