Funções de condição - AWS CloudFormation

Este é o novo Guia de referência de modelos do AWS 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.

Funções de condição

É 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 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.

Fn::And

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

JSON

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

YAML

Sintaxe para o nome da função completo:

Fn::And: [condition]

Sintaxe para a forma resumida:

!And [condition]

Parâmetros

condition

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

Exemplos de uso de Fn::And

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

JSON

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

YAML

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

Fn::Equals

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

JSON

"Fn::Equals" : ["value_1", "value_2"]

YAML

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

value

Um valor de string que você deseja comparar.

Exemplos de uso de Fn::Equals

A seguinte condição IsProduction avaliará como verdadeira se o valor para o parâmetro EnvironmentType for igual a prod:

JSON

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

YAML

IsProduction: !Equals [!Ref EnvironmentType, prod]

Fn::If

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

YAML

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

condition_name

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

Um valor a ser retornado se a condição especificada avalia como true.

value_if_false

Um valor a ser retornado se a condição especificada avalia como false.

Exemplos de uso de Fn::If

Escolher condicionalmente um recurso

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
"Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0abcdef1234567890", "InstanceType": "t3.micro", "SecurityGroupIds": { "Fn::If": [ "CreateNewSecurityGroup", [{"Ref": "NewSecurityGroup"}], [{"Ref": "ExistingSecurityGroupId"}] ] }] } } }
YAML
Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-0abcdef1234567890 InstanceType: t3.micro SecurityGroupIds: !If - CreateNewSecurityGroup - [!Ref NewSecurityGroup] - [!Ref ExistingSecurityGroupId]

Saídas condicionais

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
"Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroupId"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]

Valores de matriz condicional

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
"Subnets": { "Fn::If": [ "MoreThan2AZs", [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"}, {"Fn::ImportValue": "PublicSubnet03"} ], [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"} ] ] }
YAML
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

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
"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
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

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
"UpdatePolicy": { "Fn::If": [ "RollingUpdates", { "AutoScalingRollingUpdate": { "MaxBatchSize": 2, "MinInstancesInService": 2, "PauseTime": "PT0M30S" } }, { "Ref": "AWS::NoValue" } ] }
YAML
UpdatePolicy: !If - RollingUpdates - AutoScalingRollingUpdate: MaxBatchSize: 2 MinInstancesInService: 2 PauseTime: PT0M30S - !Ref "AWS::NoValue"

Fn::Not

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

JSON

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

YAML

Sintaxe para o nome da função completo:

Fn::Not: [condition]

Sintaxe para a forma resumida:

!Not [condition]

Parâmetros

condition

Uma condição como Fn::Equals que avalia como true ou false.

Exemplos de uso de Fn::Not

A seguinte condição EnvCondition será avaliada como verdadeira se o valor para o parâmetro EnvironmentType não for igual a prod:

JSON

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

YAML

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

Fn::Or

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

JSON

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

YAML

Sintaxe para o nome da função completo:

Fn::Or: [condition, ...]

Sintaxe para a forma resumida:

!Or [condition, ...]

Parâmetros

condition

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

Exemplos de uso de Fn::Or

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

JSON

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

YAML

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

Funções compatíveis

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

Crie condicionalmente recursos para uma produção, desenvolvimento ou teste de pilha

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 Conditionsdo 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.

exemplo 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" ]} } } } }
exemplo 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 Atributo Condition.