

Esta es la nueva *Guía de referencia de plantillas de CloudFormation*. Actualice sus marcadores y enlaces. Para obtener ayuda sobre cómo empezar a usar CloudFormation, consulte la [Guía del usuario de AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

# Funciones de condiciones
<a name="intrinsic-function-reference-conditions"></a>

Puede utilizar funciones intrínsecas, como por ejemplo `Fn::If` o `Fn::Equals`, para crear y configurar recursos de la pila en función de la lógica condicional. Estas condiciones se evalúan durante la creación de la pila o sus actualizaciones. Después de definir todas las condiciones, puede asociarlas con los recursos o las propiedades de los recursos en las secciones `Resources` y `Outputs` de una plantilla.

Para escenarios avanzados, puede combinar condiciones mediante funciones `Fn::And` o `Fn::Or`, o usar `Fn::Not` para negar el valor de una condición. También puede anidar condiciones para crear una lógica condicional más compleja.

Si es la primera vez que utiliza condiciones en sus plantillas, recomendamos consultar primero el tema de [sintaxis de las condiciones de las plantillas de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html) en la *Guía del usuario de AWS CloudFormation*.

**nota**  
Debe definir todas las condiciones en la sección `Conditions` de una plantilla, excepto las condiciones `Fn::If`. Puede utilizar la condición `Fn::If` en el atributo `Metadata`, en el atributo `UpdatePolicy` y los valores de la propiedad en la secciones `Resources` y `Outputs`.

**Topics**
+ [`Fn::And`](#intrinsic-function-reference-conditions-and)
+ [`Fn::Equals`](#intrinsic-function-reference-conditions-equals)
+ [`Fn::If`](#intrinsic-function-reference-conditions-if)
+ [`Fn::Not`](#intrinsic-function-reference-conditions-not)
+ [`Fn::Or`](#intrinsic-function-reference-conditions-or)
+ [Funciones compatibles](#w2aac24c20c25)
+ [Plantilla de muestra](#conditions-sample-templates)

## `Fn::And`
<a name="intrinsic-function-reference-conditions-and"></a>

Devuelve `true` si todas las condiciones especificadas se evalúan como true o devuelve `false` si alguna de las condiciones se evalúa como false. `Fn::And` actúa como operador AND. El número mínimo de las condiciones que puede incluir es 2 y el máximo es 10.

### Declaración
<a name="intrinsic-function-reference-conditions-and-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-and-syntax.json"></a>

```
"Fn::And": [{{{condition}}}, {{{...}}}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-and-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::And: [{{condition}}]
```

Sintaxis de la forma abreviada:

```
!And [{{condition}}]
```

### Parameters
<a name="w2aac24c20c13b7"></a>

condition  <a name="fn-and-condition"></a>
Una condición que se evalúa como `true` o `false`.

### Ejemplos de uso de `Fn::And`
<a name="w2aac24c20c13b9"></a>

La siguiente condición `MyAndCondition` se evalúa como true si el nombre del grupo de seguridad al que se hace referencia es igual a `sg-mysggroup` y si `SomeOtherCondition` se evalúa como true:

#### JSON
<a name="intrinsic-function-reference-conditions-and-example.json"></a>

```
"MyAndCondition": {
   "Fn::And": [
      {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]},
      {"Condition": "SomeOtherCondition"}
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-and-example.yaml"></a>

```
MyAndCondition: !And
  - !Equals ["sg-mysggroup", !Ref ASecurityGroup]
  - !Condition SomeOtherCondition
```

## `Fn::Equals`
<a name="intrinsic-function-reference-conditions-equals"></a>

Compara si dos valores son iguales. Devuelve `true` si los dos valores son iguales o `false` si no lo son.

### Declaración
<a name="intrinsic-function-reference-conditions-equals-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-equals-syntax.json"></a>

```
"Fn::Equals" : ["{{value_1}}", "{{value_2}}"]
```

#### YAML
<a name="intrinsic-function-reference-conditions-equals-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Equals: [{{value_1}}, {{value_2}}]
```

Sintaxis de la forma abreviada:

```
!Equals [{{value_1}}, {{value_2}}]
```

### Parameters
<a name="w2aac24c20c15b7"></a>

value  
Un valor de cadena que desee comparar.

### Ejemplos de uso de `Fn::Equals`
<a name="w2aac24c20c15b9"></a>

La siguiente condición `IsProduction` se evalúa como true si el valor para el parámetro `EnvironmentType` es igual a `prod`:

#### JSON
<a name="intrinsic-function-reference-conditions-equals-example.json"></a>

```
"IsProduction" : {
   "Fn::Equals": [
      {"Ref": "EnvironmentType"},
      "prod"
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-equals-example.yaml"></a>

```
IsProduction:
  !Equals [!Ref EnvironmentType, prod]
```

## `Fn::If`
<a name="intrinsic-function-reference-conditions-if"></a>

Devuelve un valor si la condición especificada se evalúa como `true` y otro valor si la condición especificada se evalúa como `false`. En la actualidad, CloudFormation es compatible con la función intrínseca `Fn::If` en el atributo `Metadata`, en el atributo `UpdatePolicy` y en los valores de la propiedad en la sección `Resources` y en las secciones `Outputs` de una plantilla. Puede utilizar el pseudoparámetro `AWS::NoValue` como valor devuelto para eliminar la propiedad correspondiente.

### Declaración
<a name="intrinsic-function-reference-conditions-if-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-if-syntax.json"></a>

```
"Fn::If": [{{condition_name}}, {{value_if_true}}, {{value_if_false}}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-if-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::If: [{{condition_name}}, {{value_if_true}}, {{value_if_false}}]
```

Sintaxis de la forma abreviada:

```
!If [{{condition_name}}, {{value_if_true}}, {{value_if_false}}]
```

### Parameters
<a name="w2aac24c20c19b7"></a>

condition\_name  <a name="condition_name"></a>
Una referencia a una condición en la sección Conditions. Utilice el nombre de la condición para hacer referencia a él.

value\_if\_true  <a name="value_if_true"></a>
Un valor que se devuelve si la condición especificada se evalúa como true.

value\_if\_false  <a name="value_if_false"></a>
Un valor que se devuelve si la condición especificada se evalúa como `false`.

### Ejemplos de uso de `Fn::If`
<a name="w2aac24c20c19b9"></a>

**Topics**
+ [Elección de un recurso de forma condicional](#w2aac24c20c19b9b5)
+ [Salidas condicionales](#w2aac24c20c19b9b7)
+ [Valores de matriz condicionales](#w2aac24c20c19b9b9)
+ [Propiedades condicionales y valores de propiedad](#w2aac24c20c19b9c11)
+ [Políticas de actualización condicional](#w2aac24c20c19b9c13)

#### Elección de un recurso de forma condicional
<a name="w2aac24c20c19b9b5"></a>

En el siguiente ejemplo, se utiliza una función `Fn::If` en una definición de recurso de Amazon EC2 para determinar qué recurso del grupo de seguridad se debe asociar a la instancia. Si la condición `CreateNewSecurityGroup` se evalúa como verdadera, CloudFormation utiliza el valor al que se hace referencia `NewSecurityGroup` (un grupo de seguridad creado en otra parte de la plantilla) para especificar la propiedad `SecurityGroupIds`. Si `CreateNewSecurityGroup` es falso, CloudFormation utiliza el valor referenciado de `ExistingSecurityGroupId` (un parámetro que hace referencia a un grupo de seguridad existente).

##### JSON
<a name="intrinsic-function-reference-conditions-if-example1.json"></a>

```
"Resources": {
  "EC2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "ami-0abcdef1234567890",
      "InstanceType": "t3.micro",
      "SecurityGroupIds": {
        "Fn::If": [
          "CreateNewSecurityGroup",
          [{"Ref": "NewSecurityGroup"}],
          [{"Ref": "ExistingSecurityGroupId"}]
        ]
      }]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example1.yaml"></a>

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0abcdef1234567890
      InstanceType: t3.micro
      SecurityGroupIds: !If
        - CreateNewSecurityGroup
        - [!Ref NewSecurityGroup]
        - [!Ref ExistingSecurityGroupId]
```

#### Salidas condicionales
<a name="w2aac24c20c19b9b7"></a>

En la sección `Output` de una plantilla, puede utilizar la función `Fn::If` para emitir información de forma condicional. En el siguiente fragmento de código, si la condición `CreateNewSecurityGroup` se evalúa como true, CloudFormation devuelve el ID del grupo de seguridad del recurso `NewSecurityGroup`. Si la condición es false, CloudFormation devuelve el ID de grupo de seguridad del recurso`ExistingSecurityGroup`.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example2.json"></a>

```
"Outputs" : {
  "SecurityGroupId" : {
    "Description" : "Group ID of the security group used.",
    "Value" : {
      "Fn::If" : [
        "CreateNewSecurityGroup",
        {"Ref" : "NewSecurityGroup"},
        {"Ref" : "ExistingSecurityGroupId"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example2.yaml"></a>

```
Outputs:
  SecurityGroupId: 
    Description: Group ID of the security group used.
    Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]
```

#### Valores de matriz condicionales
<a name="w2aac24c20c19b9b9"></a>

El siguiente ejemplo utiliza `Fn::If` para proporcionar condicionalmente diferentes valores de matriz en función de una condición. Si la condición `MoreThan2AZs` se evalúa como verdadera, utiliza tres subredes públicas. De lo contrario, utiliza solo dos subredes públicas.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example-arrays.json"></a>

```
"Subnets": {
  "Fn::If": [
    "MoreThan2AZs",
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"},
      {"Fn::ImportValue": "PublicSubnet03"}
    ],
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"}
    ]
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example-arrays.yaml"></a>

```
Subnets:
  Fn::If:
    - MoreThan2AZs
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
      - Fn::ImportValue: PublicSubnet03
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
```

#### Propiedades condicionales y valores de propiedad
<a name="w2aac24c20c19b9c11"></a>

El siguiente ejemplo utiliza el pseudoparámetro `AWS::NoValue` en una función `Fn::If`. La condición utiliza una instantánea para una instancia de base de datos de Amazon RDS solo si se proporciona un ID de instantánea. Si la condición `UseDBSnapshot` se evalúa como true, CloudFormation utiliza el valor del parámetro `DBSnapshotName` para la propiedad `DBSnapshotIdentifier`. Si se evalúa la condición como false, CloudFormation elimina la propiedad `DBSnapshotIdentifier`.

También utiliza una función `Fn::If` en la propiedad `AllocatedStorage` de la instancia de base de datos de Amazon RDS. Si la condición `IsProduction` se evalúa como verdadera, el tamaño de almacenamiento se establece en `100`. De lo contrario, se establece en `20`.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example3.json"></a>

```
"MyDatabase" : {
  "Type" : "AWS::RDS::DBInstance",
  "Properties": {
    "DBInstanceClass": "db.t3.micro",
    "AllocatedStorage": {
      "Fn::If": [
        "IsProduction",
        100,
        20
      ]
    },
    "Engine" : "MySQL",
    "EngineVersion" : "5.5",
    "MasterUsername" : { "Ref" : "DBUser" },
    "MasterUserPassword" : { "Ref" : "DBPassword" },
    "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" },
    "DBSnapshotIdentifier" : {
      "Fn::If" : [
        "UseDBSnapshot",
        {"Ref" : "DBSnapshotName"},
        {"Ref" : "AWS::NoValue"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example3.yaml"></a>

```
MyDatabase:
  Type: AWS::RDS::DBInstance
  Properties:
    DBInstanceClass: db.t3.micro
    AllocatedStorage: !If [IsProduction, 100, 20]
    Engine: MySQL
    EngineVersion: 5.5
    MasterUsername: !Ref DBUser
    MasterUserPassword: !Ref DBPassword
    DBParameterGroupName: !Ref MyRDSParamGroup
    DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
```

#### Políticas de actualización condicional
<a name="w2aac24c20c19b9c13"></a>

El siguiente fragmento de código proporciona una política de actualización de escalado automático solo si la condición `RollingUpdates` se evalúa como true (verdadera). Si la condición se evalúa como false, CloudFormation elimina la política de actualización `AutoScalingRollingUpdate`.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example4.json"></a>

```
"UpdatePolicy": {
  "Fn::If": [
    "RollingUpdates",
    {
      "AutoScalingRollingUpdate": {
        "MaxBatchSize": 2,
        "MinInstancesInService": 2,
        "PauseTime": "PT0M30S"
      }
    },
    {
      "Ref": "AWS::NoValue"
    }
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example4.yaml"></a>

```
UpdatePolicy: !If
  - RollingUpdates
  - AutoScalingRollingUpdate:
      MaxBatchSize: 2
      MinInstancesInService: 2
      PauseTime: PT0M30S
  - !Ref "AWS::NoValue"
```

## `Fn::Not`
<a name="intrinsic-function-reference-conditions-not"></a>

Devuelve `true` para una condición que se evalúa en `false` o devuelve `false` para una condición que se evalúa en `true`. `Fn::Not` actúa como operador NOT.

### Declaración
<a name="intrinsic-function-reference-conditions-not-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-not-syntax.json"></a>

```
"Fn::Not": [{{{condition}}}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-not-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Not: [{{condition}}]
```

Sintaxis de la forma abreviada:

```
!Not [{{condition}}]
```

### Parameters
<a name="w2aac24c20c21b7"></a>

condition  <a name="condition"></a>
Una condición como, por ejemplo, `Fn::Equals` que se evalúa como `true` o `false`.

### Ejemplos de uso de `Fn::Not`
<a name="w2aac24c20c21b9"></a>

La siguiente condición `EnvCondition` se evalúa como true si el valor para el parámetro `EnvironmentType` no es igual a `prod`:

#### JSON
<a name="intrinsic-function-reference-conditions-not-example.json"></a>

```
"MyNotCondition" : {
   "Fn::Not" : [{
      "Fn::Equals" : [
         {"Ref" : "EnvironmentType"},
         "prod"
      ]
   }]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-not-example.yaml"></a>

```
MyNotCondition:
  !Not [!Equals [!Ref EnvironmentType, prod]]
```

## `Fn::Or`
<a name="intrinsic-function-reference-conditions-or"></a>

Devuelve `true` si alguna de las condiciones especificadas se evalúa como true o devuelve `false` si todas las condiciones se evalúan como false. `Fn::Or` actúa como operador OR. El número mínimo de las condiciones que puede incluir es 2 y el máximo es 10.

### Declaración
<a name="intrinsic-function-reference-conditions-or-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-or-syntax.json"></a>

```
"Fn::Or": [{{{condition}}}, {{{...}}}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-or-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Or: [{{condition, ...}}]
```

Sintaxis de la forma abreviada:

```
!Or [{{condition, ...}}]
```

### Parameters
<a name="w2aac24c20c23b7"></a>

condition  
Una condición que se evalúa como `true` o `false`.

### Ejemplos de uso de `Fn::Or`
<a name="w2aac24c20c23b9"></a>

La siguiente condición `MyOrCondition` se evalúa como true si el nombre del grupo de seguridad al que se hace referencia es igual a `sg-mysggroup` o si `SomeOtherCondition` se evalúa como true:

#### JSON
<a name="intrinsic-function-reference-conditions-or-example.json"></a>

```
"MyOrCondition" : {
   "Fn::Or" : [
      {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
      {"Condition" : "SomeOtherCondition"}
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-or-example.yaml"></a>

```
MyOrCondition:
  !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]
```

## Funciones compatibles
<a name="w2aac24c20c25"></a>

Puede utilizar las siguientes funciones en la condición `Fn::If`:
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

Puede utilizar las siguientes funciones en todas las demás funciones de condiciones, como `Fn::Equals` y `Fn::Or`:
+ `Fn::FindInMap`
+ `Ref`
+ Otras funciones de condiciones

## Plantilla de muestra
<a name="conditions-sample-templates"></a>

### Cree condicionalmente recursos para una pila de producción, desarrollo o prueba
<a name="w2aac24c20c27b3"></a>

En algunos casos, es posible que desee crear pilas que son similares, pero con pequeñas modificaciones. Por ejemplo, podría tener una plantilla que utiliza para aplicaciones de producción. Tiene que crear la misma pila de producción para poder usarla con fines de desarrollo o de realización de pruebas. Sin embargo, para el desarrollo y la realización de pruebas, es posible que no necesite toda la capacidad adicional que se incluye en una pila de nivel de producción. En su lugar, puede utilizar un parámetro de entrada de tipo de entorno para crear condicionalmente recursos de la pila específicos de producción, desarrollo o pruebas, tal y como se muestra en el siguiente ejemplo:

Puede especificar `prod`, `dev`o `test` para el parámetro `EnvType`. Para cada tipo de entorno, la plantilla especifica un tipo de instancia diferente. Los tipos de instancia varían desde un tipo de instancia grande optimizada para computación a un tipo de instancia pequeño de uso general. Para especificar condicionalmente el tipo de instancia, la plantilla define dos condiciones en la sección `Conditions` de la plantilla: `CreateProdResources`, que se evalúa como true si el valor del parámetro `EnvType` es igual a `prod` y `CreateDevResources`, que se evalúa como true si el valor del parámetro es igual a `dev`.

En la propiedad `InstanceType`, la plantilla anida dos funciones intrínsecas `Fn::If` para determinar qué tipo de instancia utilizar. Si la condición `CreateProdResources` es true, el tipo de instancia es `c5.xlarge`. Si la condición es falsa, se evalúa la condición `CreateDevResources`. Si la condición `CreateDevResources` es true, el tipo de instancia es `t3.medium` o de lo contrario el tipo de instancia es `t3.small`.

Además del tipo de instancia, el entorno de producción crea y adjunta un volumen de Amazon EC2 a la instancia. Los recursos `MountPoint` y `NewVolume` se asocian con la condición `CreateProdResources` para que los recursos se creen únicamente si la condición se evalúa como true.

**Example JSON**  

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

**Example YAML**  

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

**nota**  
Para ver ejemplos más complejos del uso de condiciones para crear recursos, consulte el tema [`Condition`Atributo](aws-attribute-condition.md).