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
oufalse
.
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::Equals
que avalia comotrue
oufalse
.
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
oufalse
.
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 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.
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.