

# Sintaxe de Conditions de modelo do CloudFormation
<a name="conditions-section-structure"></a>

A seção `Conditions` opcional contém instruções que definem as circunstâncias nas quais entidades são criadas ou configuradas. Por exemplo, é possível criar uma condição e associá-la a um recurso ou uma saída para que o CloudFormation crie o recurso ou a saída se a condição for true. Da mesma forma, é possível associar uma condição a uma propriedade para que o CloudFormation defina a propriedade como um valor específico se a condição for true. Se a condição for false, o CloudFormation definirá a propriedade para um valor alternativo que você especificar.

Você poderá usar as condições quando quiser reutilizar um modelo para criar recursos em contextos diferentes, como ambientes de teste versus de produção. Por exemplo, no modelo, você pode adicionar um parâmetro de entrada `EnvironmentType` que aceita `prod` ou `test` como entradas. Para o ambiente de `prod`, você pode incluir instâncias do EC2 com determinados recursos. No entanto, para o ambiente de `test`, você deve usar recursos reduzidos para economizar. Essa definição de condição permite que você defina quais recursos são criados e como eles são configurados para cada tipo de ambiente.

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

A seção `Conditions` consiste no nome da chave `Conditions`. Cada declaração de condição inclui um ID lógico e uma ou mais funções 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:
      ...
```

## Como as condições funcionam
<a name="conditions-section-structure-overview"></a>

Para usar as condições, siga estas etapas:

1. **Adicionar uma definição de parâmetro**: defina as entradas que as condições avaliarão na seção `Parameters` do seu modelo. As condições são avaliadas como true ou false com base nos valores dos parâmetros de entrada. Observe que os pseudoparâmetros estão disponíveis automaticamente e não exigem definição explícita na seção `Parameters`. Para obter mais informações sobre pseudoparâmetros, consulte [Obter valores da AWS usando pseudoparâmetros](pseudo-parameter-reference.md).

1. **Adicionar uma definição de condição**: defina condições na seção `Conditions` usando funções intrínsecas como `Fn::If` ou `Fn::Equals`. Essas condições determinam quando o CloudFormation cria os recursos associados. As condições podem ser baseadas em:
   + Valores de parâmetros de entrada ou pseudoparâmetros
   + Outras condições
   + Valores de mapeamento

   No entanto, você não pode fazer referência a IDs lógicos de recursos ou seus atributos em condições.

1. **Associar condições a recursos ou saídas**: referencie condições em recursos ou saídas usando a chave `Condition` e o ID lógico de uma condição. Opcionalmente, use `Fn::If` em outras partes do modelo (como valores de propriedades) para definir valores com base em uma condição. Para obter mais informações, consulte [Usar a chave `Condition`](#using-conditions-in-templates).

O CloudFormation avalia as condições ao criar ou atualizar uma pilha. O CloudFormation cria entidades que são associadas a uma condição verdadeira e ignora entidades que são associadas a uma condição falsa. O CloudFormation também reavalia essas condições em cada atualização de pilha antes de modificar qualquer recurso. As entidades que permanecem associadas a uma condição true são atualizadas, enquanto as que se tornam associadas a uma condição false são excluídas.

**Importante**  
Durante uma atualização de pilha, você não pode atualizar as condições por si só. Você pode atualizar condições apenas ao incluir alterações que adicionam, modificam ou excluem recursos.

## Funções intrínsecas da condição
<a name="conditions-section-structure-functions"></a>

Você pode usar as seguintes funções intrínsecas para definir condições:
+ [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` só tem suporte no atributo de metadados, no atributo de atualização de política e em valores de propriedade nas seções `Resources` e `Outputs` de um modelo.

## Usar a chave `Condition`
<a name="using-conditions-in-templates"></a>

Depois que uma condição é definida, é possível aplicá-la em vários lugares no modelo, como `Resources` e `Outputs`, usando a chave `Condition`. A chave `Condition` faz referência ao nome lógico de uma condição e retorna o resultado avaliado da condição especificada.

**Topics**
+ [Associar condições a recursos](#associate-conditions-with-resources)
+ [Associar condições a saídas](#associate-conditions-with-outputs)
+ [Fazer referência a condições em outras condições](#reference-conditions-in-other-conditions)
+ [Retorne condicionalmente valores de propriedade usando `Fn::If`](#conditional-return-property-values-using-fn-if)

### Associar condições a recursos
<a name="associate-conditions-with-resources"></a>

Para criar recursos condicionalmente, adicione a chave `Condition` e o ID lógico da condição como um atributo ao recurso. O CloudFormation cria o recurso somente quando a condição é avaliada como verdadeira.

#### 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
```

### Associar condições a saídas
<a name="associate-conditions-with-outputs"></a>

Também é possível associar condições a saídas. O CloudFormation cria a saída somente quando a condição associada é avaliada como verdadeira.

#### 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
```

### Fazer referência a condições em outras condições
<a name="reference-conditions-in-other-conditions"></a>

Ao definir condições na seção `Conditions`, você pode fazer referência a outras condições usando a chave `Condition`. Isso permite que você crie uma lógica condicional mais complexa combinando várias condições.

No exemplo a seguir, a condição `IsProdAndFeatureEnabled` será avaliada como verdadeira somente se as condições `IsProduction` e `IsFeatureEnabled` forem avaliadas como verdadeiras.

#### 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
```

### Retorne condicionalmente valores de propriedade usando `Fn::If`
<a name="conditional-return-property-values-using-fn-if"></a>

Para um controle mais granular, é possível usar a função intrínseca `Fn::If` para retornar condicionalmente um dos dois valores de propriedade em recursos ou saídas. Essa função avalia uma condição e retorna um valor se a condição é verdadeira e outro valor se a condição é falsa.

#### Valores condicionais da propriedade
<a name="using-fn-if-for-conditional-values"></a>

O exemplo a seguir demonstra a definição de um tipo de instância do EC2 com base em uma condição do ambiente. Se a condição `IsProduction` for verdadeira, o tipo de instância será definido como `c5.xlarge`. Caso contrário, ele será definido como `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
```

#### Remoção condicional de propriedades
<a name="using-fn-if-with-novalue"></a>

Também é possível usar o pseudoparâmetro `AWS::NoValue` como um valor de retorno para remover a propriedade correspondente quando uma condição é 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"
```

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

**Topics**
+ [Criação de recursos com base no ambiente](#environment-based-resource-creation)
+ [Provisionamento de recursos com várias condições](#multi-condition-resource-provisioning)

### Criação de recursos com base no ambiente
<a name="environment-based-resource-creation"></a>

Os exemplos a seguir provisionam uma instância do EC2 e criam e anexam condicionalmente um novo volume do EBS somente se o tipo de ambiente for `prod`. Se o ambiente for `test`, eles simplesmente criam a instância do EC2 sem o volume 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
```

### Provisionamento de recursos com várias condições
<a name="multi-condition-resource-provisioning"></a>

Os exemplos a seguir criarão condicionalmente um bucket do S3 se um nome de bucket for fornecido, e anexarão uma política de bucket somente quando o ambiente estiver definido como `prod`. Se nenhum nome de bucket for fornecido ou se o ambiente for de `test`, nenhum recurso será criado.

#### 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: ...
```

Neste exemplo, a condição `CreateBucketPolicy` demonstra como fazer referência a outras condições usando a chave `Condition`. A política é criada somente quando as condições `IsProduction` e `CreateBucket` são avaliadas como verdadeiras.

**nota**  
Para exemplos mais complexos do uso de condições, consulte o tópico [atributo Condition](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-condition.html) no *Guia de referência de modelos do CloudFormation*.