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.
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
trueoufalse.
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
JSON
"Fn::If": [condition_name,value_if_true,value_if_false]
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
Tópicos
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::Equalsque avalia comotrueoufalse.
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
trueoufalse.
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.