Você pode usar funções intrínsecas, como Fn::If
, Fn::Equals
e Fn::Not
, para criar condicionalmente recursos da pilha. Essas condições são avaliadas com base nos parâmetros de entrada que você declara ao criar ou atualizar uma pilha. Depois de definir todas as condições, você pode associá-las a recursos ou propriedades de recursos nas seções Recursos e Saídas de um modelo.
Você define todas as condições na seção Condições de um modelo, exceto para as condições Fn::If
. Você pode usar a condição Fn::If
no atributo de metadados, atualizar o atributo de política e valores de propriedade nas seções Recursos e Saídas de um modelo.
Você pode usar as condições quando você deseja reutilizar um modelo que pode criar recursos em contextos diferentes, como um ambiente de teste em comparação com um ambiente de produção. No modelo, você pode adicionar um parâmetro de entrada EnvironmentType
que aceita prod
ou test
como entrada. Para o ambiente de produção, você pode incluir instâncias Amazon EC2 com determinados recursos. No entanto, para o ambiente de teste, você deve usar menos recursos para economizar custos. Com as condições, você pode definir quais recursos são criados e como eles são configurados para cada tipo de ambiente.
Para obter mais informações sobre a seção Condições, consulte Sintaxe de Conditions de modelo do CloudFormation.
nota
Você só pode fazer referência a outras condições e valores das seções Parâmetros e Mapeamentos de um modelo. Por exemplo, você pode fazer referência a um valor de um parâmetro de entrada, mas não ao ID lógico de um recurso em uma condição.
Tópicos
Associar uma condição
Para criar condicionalmente recursos, propriedades de recursos ou saídas, você deve associar uma condição a eles. Adicione a chave Condition:
e o ID lógico da condição como um atributo para associar uma condição, como mostrado no seguinte trecho. O AWS CloudFormation cria o recurso NewVolume
somente quando a condição CreateProdResources
avalia como verdadeira.
JSON
"NewVolume" : {
"Type" : "AWS::EC2::Volume",
"Condition" : "CreateProdResources",
"Properties" : {
"Size" : "100",
"AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
}
YAML
NewVolume:
Type: "AWS::EC2::Volume"
Condition: CreateProdResources
Properties:
Size: 100
AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
Fn::If
Para a função Fn::If
, você só precisa especificar o nome da condição. O seguinte trecho mostra como usar Fn::If
para especificar condicionalmente uma propriedade de recurso. Se a condição CreateLargeSize
for verdadeira, o CloudFormation definirá o tamanho do volume como 100
. Se a condição for falsa, o CloudFormation definirá o tamanho do volume como 10
.
JSON
{
"NewVolume": {
"Type": "AWS::EC2::Volume",
"Properties": {
"Size": {
"Fn::If": [
"CreateLargeSize",
"100",
"10"
]
},
"AvailabilityZone": {
"Fn::GetAtt": [
"Ec2Instance",
"AvailabilityZone"
]
}
},
"DeletionPolicy": "Snapshot"
}
}
YAML
NewVolume:
Type: 'AWS::EC2::Volume'
Properties:
Size:
'Fn::If':
- CreateLargeSize
- '100'
- '10'
AvailabilityZone:
'Fn::GetAtt':
- Ec2Instance
- AvailabilityZone
DeletionPolicy: Snapshot
Condições aninhadas
Você também pode usar condições em outras condições. O seguinte trecho é da seção Conditions
de um modelo. A condição MyAndCondition
inclui a condição SomeOtherCondition
:
JSON
"MyAndCondition": {
"Fn::And": [
{"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]},
{"Condition": "SomeOtherCondition"}
]
}
YAML
MyAndCondition: !And
- !Equals ["sg-mysggroup", !Ref "ASecurityGroup"]
- !Condition SomeOtherCondition
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
.
Exemplo
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 qualquer tipo que você deseja comparar.
Exemplo
A seguinte condição UseProdCondition
avaliará como verdadeira se o valor para o parâmetro EnvironmentType
for igual a prod
:
JSON
"UseProdCondition" : {
"Fn::Equals": [
{"Ref": "EnvironmentType"},
"prod"
]
}
YAML
UseProdCondition:
!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
. Atualmente, o CloudFormation é compatível com a função intrínseca Fn::If
no atributo de metadados, a atualização do atributo de política e os valores de propriedade nas seções Recursos e Saídas 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
Para visualizar mais exemplos, consulte Exemplos de modelo.
Exemplo 1
O seguinte trecho usa uma função Fn::If
na propriedade SecurityGroups
para um recurso do Amazon EC2. Se a condição CreateNewSecurityGroup
for verdadeira, o CloudFormation usará o valor referenciado de NewSecurityGroup
para especificar a propriedade SecurityGroups
; caso contrário, o CloudFormation usará o valor referenciado de ExistingSecurityGroup
.
JSON
"SecurityGroups" : [{
"Fn::If" : [
"CreateNewSecurityGroup",
{"Ref" : "NewSecurityGroup"},
{"Ref" : "ExistingSecurityGroup"}
]
}]
YAML
SecurityGroups:
- !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]
Exemplo 2
Na seção Saída 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" : "ExistingSecurityGroup"}
]
}
}
}
YAML
Outputs:
SecurityGroupId:
Description: Group ID of the security group used.
Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]
Exemplo 3
O seguinte trecho 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
.
JSON
"MyDB" : {
"Type" : "AWS::RDS::DBInstance",
"Properties" : {
"AllocatedStorage" : "5",
"DBInstanceClass" : "db.t2.small",
"Engine" : "MySQL",
"EngineVersion" : "5.5",
"MasterUsername" : { "Ref" : "DBUser" },
"MasterUserPassword" : { "Ref" : "DBPassword" },
"DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" },
"DBSnapshotIdentifier" : {
"Fn::If" : [
"UseDBSnapshot",
{"Ref" : "DBSnapshotName"},
{"Ref" : "AWS::NoValue"}
]
}
}
}
YAML
MyDB:
Type: "AWS::RDS::DBInstance"
Properties:
AllocatedStorage: 5
DBInstanceClass: db.t2.small
Engine: MySQL
EngineVersion: 5.5
MasterUsername: !Ref DBUser
MasterUserPassword: !Ref DBPassword
DBParameterGroupName: !Ref MyRDSParamGroup
DBSnapshotIdentifier:
!If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
Exemplo 4
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": {
"AutoScalingRollingUpdate": {
"Fn::If": [
"RollingUpdates",
{
"MaxBatchSize": "2",
"MinInstancesInService": "2",
"PauseTime": "PT0M30S"
},
{
"Ref" : "AWS::NoValue"
}
]
}
}
YAML
UpdatePolicy:
AutoScalingRollingUpdate:
!If
- RollingUpdates
-
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
.
Exemplo
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
.
Exemplo
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