Sintaxe de Conditions de modelo do CloudFormation
A seção Conditions
opcional contém instruções que definem as circunstâncias nas quais entidades são criadas ou configuradas. Por exemplo, é possível criar uma condição e associá-la a um recurso ou uma saída para que o CloudFormation crie o recurso ou a saída se a condição for true. Da mesma forma, é possível associar uma condição a uma propriedade para que o CloudFormation defina a propriedade como um valor específico se a condição for true. Se a condição for false, o CloudFormation definirá a propriedade para um valor alternativo que você especificar.
Você poderá usar as condições quando quiser reutilizar um modelo para criar recursos em contextos diferentes, como ambientes de teste versus de produção. Por exemplo, no modelo, você pode adicionar um parâmetro de entrada EnvironmentType
que aceita prod
ou test
como entradas. Para o ambiente de prod
, você pode incluir instâncias do EC2 com determinados recursos. No entanto, para o ambiente de test
, você deve usar recursos reduzidos para economizar. Essa definição de condição permite que você defina quais recursos são criados e como eles são configurados para cada tipo de ambiente.
Sintaxe
A seção Conditions
consiste no nome da chave Conditions
. Cada declaração de condição inclui um ID lógico e uma ou mais funções intrínsecas.
JSON
"Conditions": { "
LogicalConditionName1
": { "Intrinsic function
":...
[ }, "LogicalConditionName2
": { "Intrinsic function
":...
} }
YAML
Conditions:
LogicalConditionName1
:Intrinsic function
:...
LogicalConditionName2
:Intrinsic function
:...
Como as condições funcionam
Para usar as condições, siga estas etapas:
-
Adicionar uma definição de parâmetro: defina as entradas que as condições avaliarão na seção
Parameters
do seu modelo. As condições são avaliadas como true ou false com base nos valores dos parâmetros de entrada. Observe que os pseudoparâmetros estão disponíveis automaticamente e não exigem definição explícita na seçãoParameters
. Para obter mais informações sobre pseudoparâmetros, consulte Obter valores da AWS usando pseudoparâmetros. -
Adicionar uma definição de condição: defina condições na seção
Conditions
usando funções intrínsecas comoFn::If
ouFn::Equals
. Essas condições determinam quando o CloudFormation cria os recursos associados. As condições podem ser baseadas em:-
Valores de parâmetros de entrada ou pseudoparâmetros
-
Outras condições
-
Valores de mapeamento
No entanto, você não pode fazer referência a IDs lógicos de recursos ou seus atributos em condições.
-
-
Associar condições a recursos ou saídas: referencie condições em recursos ou saídas usando a chave
Condition
e o ID lógico de uma condição. Opcionalmente, useFn::If
em outras partes do modelo (como valores de propriedades) para definir valores com base em uma condição. Para obter mais informações, consulte Usar a chave Condition.
O CloudFormation avalia as condições ao criar ou atualizar uma pilha. O CloudFormation cria entidades que são associadas a uma condição verdadeira e ignora entidades que são associadas a uma condição falsa. O CloudFormation também reavalia essas condições em cada atualização de pilha antes de modificar qualquer recurso. As entidades que permanecem associadas a uma condição true são atualizadas, enquanto as que se tornam associadas a uma condição false são excluídas.
Importante
Durante uma atualização de pilha, você não pode atualizar as condições por si só. Você pode atualizar condições apenas ao incluir alterações que adicionam, modificam ou excluem recursos.
Funções intrínsecas da condição
Você pode usar as seguintes funções intrínsecas para definir condições:
nota
Fn::If
só tem suporte no atributo de metadados, no atributo de atualização de política e em valores de propriedade nas seções Resources
e Outputs
de um modelo.
Usar a chave Condition
Depois que uma condição é definida, é possível aplicá-la em vários lugares no modelo, como Resources
e Outputs
, usando a chave Condition
. A chave Condition
faz referência ao nome lógico de uma condição e retorna o resultado avaliado da condição especificada.
Tópicos
Associar condições a recursos
Para criar recursos condicionalmente, adicione a chave Condition
e o ID lógico da condição como um atributo ao recurso. O CloudFormation cria o recurso somente quando a condição é avaliada como verdadeira.
JSON
"NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "IsProduction", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} } }
YAML
NewVolume: Type: AWS::EC2::Volume Condition: IsProduction Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
Associar condições a saídas
Também é possível associar condições a saídas. O CloudFormation cria a saída somente quando a condição associada é avaliada como verdadeira.
JSON
"Outputs" : { "VolumeId" : { "Condition" : "IsProduction", "Value" : { "Ref" : "NewVolume" } } }
YAML
Outputs: VolumeId: Condition: IsProduction Value: !Ref NewVolume
Fazer referência a condições em outras condições
Ao definir condições na seção Conditions
, você pode fazer referência a outras condições usando a chave Condition
. Isso permite que você crie uma lógica condicional mais complexa combinando várias condições.
No exemplo a seguir, a condição IsProdAndFeatureEnabled
será avaliada como verdadeira somente se as condições IsProduction
e IsFeatureEnabled
forem avaliadas como verdadeiras.
JSON
"Conditions": { "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "prod"]}, "IsFeatureEnabled" : { "Fn::Equals" : [{"Ref" : "FeatureFlag"}, "enabled"]}, "IsProdAndFeatureEnabled" : { "Fn::And" : [ {"Condition" : "IsProduction"}, {"Condition" : "IsFeatureEnabled"} ] } }
YAML
Conditions: IsProduction: !Equals [!Ref Environment, "prod"] IsFeatureEnabled: !Equals [!Ref FeatureFlag, "enabled"] IsProdAndFeatureEnabled: !And - !Condition IsProduction - !Condition IsFeatureEnabled
Retorne condicionalmente valores de propriedade usando Fn::If
Para um controle mais granular, é possível usar a função intrínseca Fn::If
para retornar condicionalmente um dos dois valores de propriedade em recursos ou saídas. Essa função avalia uma condição e retorna um valor se a condição é verdadeira e outro valor se a condição é falsa.
Valores condicionais da propriedade
O exemplo a seguir demonstra a definição de um tipo de instância do EC2 com base em uma condição do ambiente. Se a condição IsProduction
for verdadeira, o tipo de instância será definido como c5.xlarge
. Caso contrário, ele será definido como t3.small
.
JSON
"Properties" : { "InstanceType" : { "Fn::If" : [ "IsProduction", "c5.xlarge", "t3.small" ] } }
YAML
Properties: InstanceType: !If - IsProduction - c5.xlarge - t3.small
Remoção condicional de propriedades
Também é possível usar o pseudoparâmetro AWS::NoValue
como um valor de retorno para remover a propriedade correspondente quando uma condição é falsa.
JSON
"DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] }
YAML
DBSnapshotIdentifier: !If - UseDBSnapshot - !Ref DBSnapshotName - !Ref "AWS::NoValue"
Exemplos
Criação de recursos com base no ambiente
Os exemplos a seguir provisionam uma instância do EC2 e criam e anexam condicionalmente um novo volume do EBS somente se o tipo de ambiente for prod
. Se o ambiente for test
, eles simplesmente criam a instância do EC2 sem o volume adicional.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "EnvType": { "Description": "Environment type", "Default": "test", "Type": "String", "AllowedValues": [ "prod", "test" ], "ConstraintDescription": "must specify prod or test" } }, "Conditions": { "IsProduction": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] } }, "Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-1234567890abcdef0", "InstanceType": "c5.xlarge" } }, "MountPoint": { "Type": "AWS::EC2::VolumeAttachment", "Condition": "IsProduction", "Properties": { "InstanceId": { "Ref": "EC2Instance" }, "VolumeId": { "Ref": "NewVolume" }, "Device": "/dev/sdh" } }, "NewVolume": { "Type": "AWS::EC2::Volume", "Condition": "IsProduction", "Properties": { "Size": 100, "AvailabilityZone": { "Fn::GetAtt": [ "EC2Instance", "AvailabilityZone" ] } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvType: Description: Environment type Default: test Type: String AllowedValues: - prod - test ConstraintDescription: must specify prod or test Conditions: IsProduction: !Equals - !Ref EnvType - prod Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: c5.xlarge MountPoint: Type: AWS::EC2::VolumeAttachment Condition: IsProduction Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: AWS::EC2::Volume Condition: IsProduction Properties: Size: 100 AvailabilityZone: !GetAtt - EC2Instance - AvailabilityZone
Provisionamento de recursos com várias condições
Os exemplos a seguir criarão condicionalmente um bucket do S3 se um nome de bucket for fornecido, e anexarão uma política de bucket somente quando o ambiente estiver definido como prod
. Se nenhum nome de bucket for fornecido ou se o ambiente for de test
, nenhum recurso será criado.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "EnvType": { "Type": "String", "AllowedValues": [ "prod", "test" ] }, "BucketName": { "Default": "", "Type": "String" } }, "Conditions": { "IsProduction": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] }, "CreateBucket": { "Fn::Not": [ { "Fn::Equals": [ { "Ref": "BucketName" }, "" ] } ] }, "CreateBucketPolicy": { "Fn::And": [ { "Condition": "IsProduction" }, { "Condition": "CreateBucket" } ] } }, "Resources": { "Bucket": { "Type": "AWS::S3::Bucket", "Condition": "CreateBucket", "Properties": { "BucketName": { "Ref": "BucketName" } } }, "Policy": { "Type": "AWS::S3::BucketPolicy", "Condition": "CreateBucketPolicy", "Properties": { "Bucket": { "Ref": "Bucket" }, "PolicyDocument": { ... } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvType: Type: String AllowedValues: - prod - test BucketName: Default: '' Type: String Conditions: IsProduction: !Equals - !Ref EnvType - prod CreateBucket: !Not - !Equals - !Ref BucketName - '' CreateBucketPolicy: !And - !Condition IsProduction - !Condition CreateBucket Resources: Bucket: Type: AWS::S3::Bucket Condition: CreateBucket Properties: BucketName: !Ref BucketName Policy: Type: AWS::S3::BucketPolicy Condition: CreateBucketPolicy Properties: Bucket: !Ref Bucket PolicyDocument: ...
Neste exemplo, a condição CreateBucketPolicy
demonstra como fazer referência a outras condições usando a chave Condition
. A política é criada somente quando as condições IsProduction
e CreateBucket
são avaliadas como verdadeiras.
nota
Para exemplos mais complexos do uso de condições, consulte o tópico atributo Condition no Guia de referência de modelos do AWS CloudFormation.