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

Funções de condição

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 Condições.

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.

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: !If [CreateLargeSize, 100, 10] AvailabilityZone: !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 ou false.

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

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 Modelos de exemplo.

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 de escalabilidade automática 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 como true ou false.

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 ou false.

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