

# Sintaxis de Conditions de la plantilla de CloudFormation
<a name="conditions-section-structure"></a>

La sección opcional `Conditions` contiene declaraciones que definen las circunstancias por las que se crean o configuran las entidades. Por ejemplo, puede crear una condición y asociarla a un recurso o salida de manera que CloudFormation cree el recurso o salida solo si la condición es verdadera. Del mismo modo, puede asociar una condición a una propiedad de manera que CloudFormation establezca la propiedad en un valor específico solo si la condición es verdadera. Si la condición es falsa, CloudFormation establece la propiedad en un valor alternativo que especifica.

Puede utilizar condiciones cuando desee reutilizar una plantilla para crear recursos en diferentes contextos, como, por ejemplo, entornos de pruebas frente a entornos de producción. Por ejemplo, en su plantilla, puede agregar un parámetro de entrada `EnvironmentType` que acepte `prod` o `test` como entradas. Para el entorno `prod`, podría incluir instancias de EC2 con determinadas capacidades; sin embargo, para el entorno `test`, podría utilizar capacidades reducidas para ahorrar dinero. La definición de esta condición le permite definir qué recursos se crean y cómo se configuran para cada tipo de entorno.

## Sintaxis
<a name="conditions-section-structure-syntax"></a>

La sección `Conditions` consta del nombre de clave `Conditions`. Cada declaración de condición incluye un ID lógico y una o más funciones intrínsecas. 

### JSON
<a name="conditions-section-structure-syntax.json"></a>

```
"Conditions": {
  "LogicalConditionName1": {
    "Intrinsic function": ...[
  },

  "LogicalConditionName2": {
    "Intrinsic function": ...
  }
}
```

### YAML
<a name="conditions-section-structure-syntax.yaml"></a>

```
Conditions:
  LogicalConditionName1:
    Intrinsic function:
      ...

  LogicalConditionName2:
    Intrinsic function:
      ...
```

## Cómo funcionan las condiciones
<a name="conditions-section-structure-overview"></a>

Para utilizar condiciones, siga estos pasos:

1. **Agregar una definición de parámetro**: defina las entradas que evaluarán sus condiciones en la sección `Parameters` de su plantilla. Las condiciones se evalúan en true o false en función de los valores de estos parámetros de entrada. Tenga en cuenta que los seudoparámetros están disponibles automáticamente y no requieren una definición explícita en la sección `Parameters`. Para obtener más información sobre pseudoparámetros, consulte . [Obtención de valores de AWS mediante pseudoparámetros](pseudo-parameter-reference.md).

1. **Agregar una definición de condición**: defina las condiciones en la sección `Conditions` mediante funciones intrínsecas como `Fn::If` o `Fn::Equals`. Las condiciones determinan cuándo CloudFormation crea los recursos asociados. Las condiciones se pueden basar en lo siguiente:
   + Valores de entrada o de seudoparámetros
   + Otras condiciones
   + Valores de asignación

   Sin embargo, no puede hacer referencia a los ID lógicos de los recursos ni a sus atributos en las condiciones.

1. **Asociar las condiciones a recursos o salidas**: haga referencia a las condiciones en los recursos o las salidas mediante la clave `Condition` y el ID lógico de una condición. También puede usar `Fn::If` en otras partes de la plantilla (como los valores de las propiedades) para establecer valores en función de una condición. Para obtener más información, consulte [Utilización de la clave `Condition`](#using-conditions-in-templates).

CloudFormation evalúa las condiciones al crear o actualizar una pila. CloudFormation crea entidades que se asocian a una condición true e ignora las entidades que están asociadas a una condición false. Además, CloudFormation reevalúa estas condiciones durante las actualizaciones de una pila antes de modificar los recursos. Las entidades que permanecen asociadas a una condición verdadera se actualizan, mientras que las que se asocian a una condición falsa se eliminan.

**importante**  
Durante la actualización de una pila, no se pueden actualizar condiciones por sí mismas. Puede actualizar condiciones solo cuando incluye cambios que añaden, modifican o eliminan recursos.

## Funciones intrínsecas de condiciones
<a name="conditions-section-structure-functions"></a>

Puede utilizar las siguientes funciones intrínsecas para definir condiciones:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)

**nota**  
`Fn::If` solo se admite en el atributo de metadatos, el atributo de la política de actualización y los valores de la propiedad en la sección `Resources` y en la sección `Outputs` de una plantilla.

## Utilización de la clave `Condition`
<a name="using-conditions-in-templates"></a>

Una vez que se define una condición, puede aplicarla en varios lugares de la plantilla, como `Resources` y `Outputs`, mediante la clave `Condition`. La clave `Condition` hace referencia al nombre lógico de una condición y devuelve el resultado evaluado de la condición especificada.

**Topics**
+ [Asociación de condiciones a los recursos](#associate-conditions-with-resources)
+ [Asociación de condiciones a las salidas](#associate-conditions-with-outputs)
+ [Condiciones de referencia en otras condiciones](#reference-conditions-in-other-conditions)
+ [Devuelva condicionalmente los valores de las propiedades mediante `Fn::If`](#conditional-return-property-values-using-fn-if)

### Asociación de condiciones a los recursos
<a name="associate-conditions-with-resources"></a>

Para crear recursos de forma condicional, añada la clave `Condition` y el ID lógico de la condición como un atributo del recurso. CloudFormation crea el recurso únicamente cuando la condición se evalúa como true.

#### JSON
<a name="associate-conditions-with-resources.json"></a>

```
"NewVolume" : {
  "Type" : "AWS::EC2::Volume",
  "Condition" : "IsProduction",
  "Properties" : {
     "Size" : "100",
     "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
  }
}
```

#### YAML
<a name="associate-conditions-with-resources.yaml"></a>

```
NewVolume:
  Type: AWS::EC2::Volume
  Condition: IsProduction
  Properties:
    Size: 100
    AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

### Asociación de condiciones a las salidas
<a name="associate-conditions-with-outputs"></a>

También puede asociar condiciones a las salidas. CloudFormation crea la salida únicamente cuando la condición asociada se evalúa como verdadera.

#### JSON
<a name="associate-conditions-with-outputs.json"></a>

```
"Outputs" : {
  "VolumeId" : {
    "Condition" : "IsProduction",
    "Value" : { "Ref" : "NewVolume" }
  }
}
```

#### YAML
<a name="associate-conditions-with-outputs.yaml"></a>

```
Outputs:
  VolumeId:
    Condition: IsProduction
    Value: !Ref NewVolume
```

### Condiciones de referencia en otras condiciones
<a name="reference-conditions-in-other-conditions"></a>

Al definir las condiciones en la sección `Conditions`, puede hacer referencia a otras condiciones mediante la clave `Condition`. Esto le permite crear una lógica condicional más compleja mediante la combinación de varias condiciones.

En el siguiente ejemplo, la condición `IsProdAndFeatureEnabled` se evalúa como verdadera solo si las condiciones `IsProduction` y `IsFeatureEnabled` se evalúan como verdaderas.

#### JSON
<a name="reference-conditions-in-other-conditions.json"></a>

```
"Conditions": {
  "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "prod"]},
  "IsFeatureEnabled" : { "Fn::Equals" : [{"Ref" : "FeatureFlag"}, "enabled"]},
  "IsProdAndFeatureEnabled" : {
    "Fn::And" : [
      {"Condition" : "IsProduction"},
      {"Condition" : "IsFeatureEnabled"}
    ]
  }
}
```

#### YAML
<a name="reference-conditions-in-other-conditions.yaml"></a>

```
Conditions:
  IsProduction:
    !Equals [!Ref Environment, "prod"]
  IsFeatureEnabled:
    !Equals [!Ref FeatureFlag, "enabled"]
  IsProdAndFeatureEnabled: !And
    - !Condition IsProduction
    - !Condition IsFeatureEnabled
```

### Devuelva condicionalmente los valores de las propiedades mediante `Fn::If`
<a name="conditional-return-property-values-using-fn-if"></a>

Para un control más granular, puede utilizar la función intrínseca `Fn::If` para devolver condicionalmente uno de los dos valores de propiedad de los recursos o las salidas. Esta función evalúa una condición y devuelve un valor si la condición es verdadera y otro valor si la condición es falsa.

#### Valores condicionales de la propiedad
<a name="using-fn-if-for-conditional-values"></a>

En el siguiente ejemplo, se muestra la configuración de un tipo de instancia de EC2 en función de una condición del entorno. Si la condición `IsProduction` es verdadera, el tipo de instancia se establece en `c5.xlarge`. De lo contrario, se establece en `t3.small`.

##### JSON
<a name="using-fn-if-for-conditional-values.json"></a>

```
"Properties" : {
  "InstanceType" : {
    "Fn::If" : [
      "IsProduction",
      "c5.xlarge",
      "t3.small"
    ]
  }
}
```

##### YAML
<a name="using-fn-if-for-conditional-values.yaml"></a>

```
Properties:
  InstanceType: !If
    - IsProduction
    - c5.xlarge
    - t3.small
```

#### Eliminación condicional de propiedades
<a name="using-fn-if-with-novalue"></a>

Puede utilizar el pseudoparámetro `AWS::NoValue` como valor devuelto para eliminar la propiedad correspondiente cuando una condición es falsa.

##### JSON
<a name="using-fn-if-with-novalue.json"></a>

```
"DBSnapshotIdentifier" : {
  "Fn::If" : [
    "UseDBSnapshot",
    {"Ref" : "DBSnapshotName"},
    {"Ref" : "AWS::NoValue"}
  ]
}
```

##### YAML
<a name="using-fn-if-with-novalue.yaml"></a>

```
DBSnapshotIdentifier: !If
  - UseDBSnapshot
  - !Ref DBSnapshotName
  - !Ref "AWS::NoValue"
```

## Ejemplos
<a name="conditions-section-structure-examples"></a>

**Topics**
+ [Creación de recursos en función del entorno](#environment-based-resource-creation)
+ [Aprovisionamiento de recursos con varias condiciones](#multi-condition-resource-provisioning)

### Creación de recursos en función del entorno
<a name="environment-based-resource-creation"></a>

En los siguientes ejemplos se aprovisiona una instancia de EC2 y se crea y adjunta condicionalmente un nuevo volumen de EBS solo si el tipo de entorno es `prod`. Si el entorno es `test`, simplemente se crea la instancia de EC2 sin el volumen adicional.

#### JSON
<a name="conditions-section-example-resource-creation.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Description": "Environment type",
            "Default": "test",
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ],
            "ConstraintDescription": "must specify prod or test"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        }
    },
    "Resources": {
        "EC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "ami-1234567890abcdef0",
                "InstanceType": "c5.xlarge"
            }
        },
        "MountPoint": {
            "Type": "AWS::EC2::VolumeAttachment",
            "Condition": "IsProduction",
            "Properties": {
                "InstanceId": {
                    "Ref": "EC2Instance"
                },
                "VolumeId": {
                    "Ref": "NewVolume"
                },
                "Device": "/dev/sdh"
            }
        },
        "NewVolume": {
            "Type": "AWS::EC2::Volume",
            "Condition": "IsProduction",
            "Properties": {
                "Size": 100,
                "AvailabilityZone": {
                    "Fn::GetAtt": [
                        "EC2Instance",
                        "AvailabilityZone"
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-resource-creation.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Description: Environment type
    Default: test
    Type: String
    AllowedValues:
      - prod
      - test
    ConstraintDescription: must specify prod or test
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-1234567890abcdef0
      InstanceType: c5.xlarge
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: IsProduction
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: AWS::EC2::Volume
    Condition: IsProduction
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt
        - EC2Instance
        - AvailabilityZone
```

### Aprovisionamiento de recursos con varias condiciones
<a name="multi-condition-resource-provisioning"></a>

En los siguientes ejemplos se crea condicionalmente un bucket de S3 si se proporciona un nombre de bucket y se adjunta una política de bucket solo cuando el entorno está definido como `prod`. Si no se proporciona ningún nombre de bucket o el entorno es `test`, no se crea ningún recurso.

#### JSON
<a name="conditions-section-example-multi-condition.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ]
        },
        "BucketName": {
            "Default": "",
            "Type": "String"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        },
        "CreateBucket": {
            "Fn::Not": [
                {
                    "Fn::Equals": [
                        {
                            "Ref": "BucketName"
                        },
                        ""
                    ]
                }
            ]
        },
        "CreateBucketPolicy": {
            "Fn::And": [
                {
                    "Condition": "IsProduction"
                },
                {
                    "Condition": "CreateBucket"
                }
            ]
        }
    },
    "Resources": {
        "Bucket": {
            "Type": "AWS::S3::Bucket",
            "Condition": "CreateBucket",
            "Properties": {
                "BucketName": {
                    "Ref": "BucketName"
                }
            }
        },
        "Policy": {
            "Type": "AWS::S3::BucketPolicy",
            "Condition": "CreateBucketPolicy",
            "Properties": {
                "Bucket": {
                    "Ref": "Bucket"
                },
                "PolicyDocument": { ... }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-multi-condition.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Type: String
    AllowedValues:
      - prod
      - test
  BucketName:
    Default: ''
    Type: String
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
  CreateBucket: !Not
    - !Equals
      - !Ref BucketName
      - ''
  CreateBucketPolicy: !And
    - !Condition IsProduction
    - !Condition CreateBucket
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Condition: CreateBucket
    Properties:
      BucketName: !Ref BucketName
  Policy:
    Type: AWS::S3::BucketPolicy
    Condition: CreateBucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument: ...
```

En este ejemplo, la condición `CreateBucketPolicy` demuestra cómo hacer referencia a otras condiciones mediante la clave `Condition`. La política se crea solo cuando tanto las condiciones `IsProduction` y `CreateBucket` se evalúan como verdaderas.

**nota**  
Para ver ejemplos más complejos del uso de condiciones, consulte el tema de [atributos de Condition](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-condition.html) en la *Guía de referencia de plantillas de CloudFormation*.