

Este é o novo *Guia de referência de modelos do CloudFormation*. Atualize seus favoritos e links. Para obter ajuda para começar a usar o CloudFormation, consulte o [Guia do usuário do AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

# Funções de condição
<a name="intrinsic-function-reference-conditions"></a>

É possível usar funções intrínsecas, como `Fn::If` ou `Fn::Equals`, para criar e configurar recursos de pilha com base em lógica condicional. Essas condições são avaliadas durante a criação ou atualização da pilha. Depois de definir todas as condições, você pode associá-las a recursos ou propriedades de recursos nas seções `Resources` e `Outputs` de um modelo.

Para cenários avançados, é possível combinar condições usando as funções `Fn::And` ou `Fn::Or` ou usar `Fn::Not` para negar o valor de uma condição. Também é possível aninhar condições para criar uma lógica condicional mais complexa.

Se você é novato no uso de condições em seus modelos, recomendamos revisar primeiro o tópico sobre [sintaxe de condições do modelo do CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html) no *Guia do usuário do AWS CloudFormation*.

**nota**  
É necessário definir todas as condições na seção `Conditions` de um modelo, exceto para as condições `Fn::If`. É possível usar a condição `Fn::If` no atributo `Metadata` e atributo `UpdatePolicy` e valores de propriedade nas seções `Resources` e `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)
+ [Funções compatíveis](#w2aac24c20c25)
+ [Modelo de exemplo](#conditions-sample-templates)

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

Retorna `true` se todas as condições especificadas forem verdadeiras, ou retornarem `false` se alguma das condições for falsa. O `Fn::And` atua como operador AND. O número mínimo de condições que você pode incluir é 2 e o máximo é 10.

### Declaração
<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>

Sintaxe para o nome da função completo:

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

Sintaxe para a forma resumida:

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

### Parâmetros
<a name="w2aac24c20c13b7"></a>

condition  <a name="fn-and-condition"></a>
Uma condição que avalia como `true` ou `false`.

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

O seguinte `MyAndCondition` avalia como verdadeiro se o nome do security group referenciado é igual a `sg-mysggroup` e se `SomeOtherCondition` avalia como verdadeiro:

#### 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 se dois valores são iguais. Retorna `true` se os dois valores são iguais ou `false` se eles não são.

### Declaração
<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>

Sintaxe para o nome da função completo:

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

Sintaxe para a forma resumida:

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

### Parâmetros
<a name="w2aac24c20c15b7"></a>

value  
Um valor de string que você deseja comparar.

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

A seguinte condição `IsProduction` avaliará como verdadeira se o valor para o parâmetro `EnvironmentType` for 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>

Retorna um valor se a condição especificada avalia como `true` e outro valor se a condição especificada avalia como `false`. No momento, o CloudFormation oferece suporte à função intrínseca `Fn::If` no atributo `Metadata` e no atributo `UpdatePolicy` e aos valores de propriedade nas seções `Resources` e `Outputs` de um modelo. Você pode usar o pseudoparâmetro `AWS::NoValue` como um valor de retorno para remover a propriedade correspondente.

### Declaração
<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>

Sintaxe para o nome da função completo:

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

Sintaxe para a forma resumida:

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

### Parâmetros
<a name="w2aac24c20c19b7"></a>

condition\_name  <a name="condition_name"></a>
Uma referência a uma condição na seção Condições. Use o nome da condição para fazer referência a ele.

value\_if\_true  <a name="value_if_true"></a>
Um valor a ser retornado se a condição especificada avalia como true.

value\_if\_false  <a name="value_if_false"></a>
Um valor a ser retornado se a condição especificada avalia como `false`.

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

**Topics**
+ [Escolher condicionalmente um recurso](#w2aac24c20c19b9b5)
+ [Saídas condicionais](#w2aac24c20c19b9b7)
+ [Valores de matriz condicional](#w2aac24c20c19b9b9)
+ [Propriedades condicionais e valores de propriedades](#w2aac24c20c19b9c11)
+ [Políticas condicionais de atualização](#w2aac24c20c19b9c13)

#### Escolher condicionalmente um recurso
<a name="w2aac24c20c19b9b5"></a>

O exemplo a seguir usa uma função `Fn::If` em uma definição de recurso do Amazon EC2 para determinar qual recurso de grupo de segurança associar à instância. Se a condição `CreateNewSecurityGroup` for avaliada como verdadeira, o CloudFormation usará o valor referenciado `NewSecurityGroup` (um grupo de segurança criado em outro lugar no modelo) para especificar a propriedade `SecurityGroupIds`. Se `CreateNewSecurityGroup` for falsa, o CloudFormation usará o valor referenciado de `ExistingSecurityGroupId` (um parâmetro que faz referência a um grupo de segurança 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]
```

#### Saídas condicionais
<a name="w2aac24c20c19b9b7"></a>

Na seção `Output` de um modelo, você pode usar a função `Fn::If` para emitir condicionalmente informações. No seguinte trecho, se a condição `CreateNewSecurityGroup` for verdadeira, o CloudFormation emitirá o ID do grupo de segurança do recurso `NewSecurityGroup`. Se a condição for falsa, o CloudFormation emitirá o ID do grupo de segurança do 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 condicional
<a name="w2aac24c20c19b9b9"></a>

O exemplo a seguir usa `Fn::If` para fornecer condicionalmente diferentes valores de matriz com base em uma condição. Se a condição `MoreThan2AZs` for avaliada como verdadeira, ele usará três sub-redes públicas. Caso contrário, ele usará somente duas sub-redes 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
```

#### Propriedades condicionais e valores de propriedades
<a name="w2aac24c20c19b9c11"></a>

O exemplo a seguir usa o pseudoparâmetro `AWS::NoValue` em uma função `Fn::If`. A condição usa um snapshot para uma instância de banco de dados do Amazon RDS somente se o ID do snapshot é fornecido. Se a condição `UseDBSnapshot` for avaliada como verdadeira, o CloudFormation usará o valor do parâmetro `DBSnapshotName` para a propriedade `DBSnapshotIdentifier`. Se a condição for avaliada como falsa, o CloudFormation removerá a propriedade `DBSnapshotIdentifier`.

Ele também usa uma função `Fn::If` na propriedade `AllocatedStorage` da instância de banco de dados do Amazon RDS. Se a condição `IsProduction` for avaliada como verdadeira, o tamanho do armazenamento será definido como `100`. Caso contrário, ele será definido como `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 condicionais de atualização
<a name="w2aac24c20c19b9c13"></a>

O seguinte trecho oferece uma política de atualização do Auto Scaling somente se a condição `RollingUpdates` for verdadeira. Se a condição for avaliada como falsa, o CloudFormation removerá a política de atualização `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>

Retorna `true` para uma condição que avalia como `false` ou retorna `false` para uma condição que avalia como `true`. `Fn::Not` funciona como o operador NOT.

### Declaração
<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>

Sintaxe para o nome da função completo:

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

Sintaxe para a forma resumida:

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

### Parâmetros
<a name="w2aac24c20c21b7"></a>

condition  <a name="condition"></a>
Uma condição como `Fn::Equals` que avalia como `true` ou `false`.

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

A seguinte condição `EnvCondition` será avaliada como verdadeira se o valor para o parâmetro `EnvironmentType` não for 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>

Retorna `true` se alguma das condições especificadas forem verdadeiras, ou retornarem `false` se todas as condições forem falsas. O `Fn::Or` atua como operador OR. O número mínimo de condições que você pode incluir é 2 e o máximo é 10.

### Declaração
<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>

Sintaxe para o nome da função completo:

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

Sintaxe para a forma resumida:

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

### Parâmetros
<a name="w2aac24c20c23b7"></a>

condition  
Uma condição que avalia como `true` ou `false`.

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

O seguinte `MyOrCondition` avalia como verdadeiro se o nome do security group referenciado é igual a `sg-mysggroup` ou se `SomeOtherCondition` avalia como verdadeiro:

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

## Funções compatíveis
<a name="w2aac24c20c25"></a>

Você pode usar as seguintes funções na condição `Fn::If`:
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

Você pode usar as seguintes funções em todas as outras funções de condição, como `Fn::Equals` e `Fn::Or`:
+ `Fn::FindInMap`
+ `Ref`
+ Outras funções de condição

## Modelo de exemplo
<a name="conditions-sample-templates"></a>

### Crie condicionalmente recursos para uma produção, desenvolvimento ou teste de pilha
<a name="w2aac24c20c27b3"></a>

Em alguns casos, você pode criar pilhas que são semelhantes, mas com pequenos ajustes. Por exemplo, você pode ter um modelo que você usa para aplicativos de produção. Você deseja criar a mesma pilha de produção, para que você possa usá-la para desenvolvimento ou teste. No entanto, para desenvolvimento e teste, você pode não exigir toda a capacidade extra incluída em uma pilha de nível de produção. Em vez disso, você pode usar um parâmetro de entrada no tipo de ambiente para criar condicionalmente os recursos de pilha que são específicos para produção, desenvolvimento ou testes, como mostrado no seguinte exemplo:

Você pode especificar `prod`, `dev` ou `test` para o parâmetro `EnvType`. Para cada tipo de ambiente, o modelo especifica um tipo de instância diferente. Os tipos de instância podem variar desde um tipo de instância grande, otimizada por computação, até um tipo de instância pequeno, de uso geral. Para especificar condicionalmente o tipo de instância, o modelo define duas condições na seção `Conditions`do modelo: `CreateProdResources`, que avalia como verdadeiro se o valor do parâmetro `EnvType` é igual a `prod` e `CreateDevResources`, que avalia como verdadeiro se o valor do parâmetro é igual a `dev`.

Na propriedade `InstanceType`, o modelo aninha duas funções intrínsecas `Fn::If` para determinar qual tipo de instância deverá ser usada. Se a condição `CreateProdResources` for verdadeira, o tipo de instância será `c5.xlarge`. Se a condição for falsa, a condição `CreateDevResources` será avaliada. Se a condição `CreateDevResources` for verdadeira, o tipo de instância será `t3.medium`; caso contrário, o tipo de instância será `t3.small`.

Além do tipo de instância, o ambiente de produção cria e anexa um volume do Amazon EC2 à instância. Os recurso `MountPoint` e `NewVolume` estão associados à condição `CreateProdResources` para que os recursos sejam criados somente se a condição for verdadeira.

**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 exemplos mais complexos do uso de condições para criar recursos, consulte o tópico [`Condition`Atributo](aws-attribute-condition.md).