Funciones de condiciones - AWS CloudFormation

Esta es la nueva Guía de referencia de plantillas de AWS CloudFormation. Actualice sus marcadores y enlaces. Para obtener ayuda sobre cómo empezar a usar CloudFormation, consulte la Guía del usuario de AWS CloudFormation.

Funciones de condiciones

Puede utilizar funciones intrínsecas, como por ejemplo Fn::If o Fn::Equals, para crear y configurar recursos de la pila en función de la lógica condicional. Estas condiciones se evalúan durante la creación de la pila o sus actualizaciones. Después de definir todas las condiciones, puede asociarlas con los recursos o las propiedades de los recursos en las secciones Resources y Outputs de una plantilla.

Para escenarios avanzados, puede combinar condiciones mediante funciones Fn::And o Fn::Or, o usar Fn::Not para negar el valor de una condición. También puede anidar condiciones para crear una lógica condicional más compleja.

Si es la primera vez que utiliza condiciones en sus plantillas, recomendamos consultar primero el tema de sintaxis de las condiciones de las plantillas de CloudFormation en la Guía del usuario de AWS CloudFormation.

nota

Debe definir todas las condiciones en la sección Conditions de una plantilla, excepto las condiciones Fn::If. Puede utilizar la condición Fn::If en el atributo Metadata, en el atributo UpdatePolicy y los valores de la propiedad en la secciones Resources y Outputs.

Fn::And

Devuelve true si todas las condiciones especificadas se evalúan como true o devuelve false si alguna de las condiciones se evalúa como false. Fn::And actúa como operador AND. El número mínimo de las condiciones que puede incluir es 2 y el máximo es 10.

Declaración

JSON

"Fn::And": [{condition}, {...}]

YAML

Sintaxis del nombre de función completo:

Fn::And: [condition]

Sintaxis de la forma abreviada:

!And [condition]

Parámetros

condition

Una condición que se evalúa como true o false.

Ejemplos de uso de Fn::And

La siguiente condición MyAndCondition se evalúa como true si el nombre del grupo de seguridad al que se hace referencia es igual a sg-mysggroup y si SomeOtherCondition se evalúa como true:

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 si dos valores son iguales. Devuelve true si los dos valores son iguales o false si no lo son.

Declaración

JSON

"Fn::Equals" : ["value_1", "value_2"]

YAML

Sintaxis del nombre de función completo:

Fn::Equals: [value_1, value_2]

Sintaxis de la forma abreviada:

!Equals [value_1, value_2]

Parámetros

value

Un valor de cadena que desee comparar.

Ejemplos de uso de Fn::Equals

La siguiente condición IsProduction se evalúa como true si el valor para el parámetro EnvironmentType es igual a prod:

JSON

"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }

YAML

IsProduction: !Equals [!Ref EnvironmentType, prod]

Fn::If

Devuelve un valor si la condición especificada se evalúa como true y otro valor si la condición especificada se evalúa como false. En la actualidad, CloudFormation es compatible con la función intrínseca Fn::If en el atributo Metadata, en el atributo UpdatePolicy y en los valores de la propiedad en la sección Resources y en las secciones Outputs de una plantilla. Puede utilizar el pseudoparámetro AWS::NoValue como valor devuelto para eliminar la propiedad correspondiente.

Declaración

YAML

Sintaxis del nombre de función completo:

Fn::If: [condition_name, value_if_true, value_if_false]

Sintaxis de la forma abreviada:

!If [condition_name, value_if_true, value_if_false]

Parámetros

condition_name

Una referencia a una condición en la sección Conditions. Utilice el nombre de la condición para hacer referencia a él.

value_if_true

Un valor que se devuelve si la condición especificada se evalúa como true.

value_if_false

Un valor que se devuelve si la condición especificada se evalúa como false.

Ejemplos de uso de Fn::If

Elección de un recurso de forma condicional

En el siguiente ejemplo, se utiliza una función Fn::If en una definición de recurso de Amazon EC2 para determinar qué recurso del grupo de seguridad se debe asociar a la instancia. Si la condición CreateNewSecurityGroup se evalúa como verdadera, CloudFormation utiliza el valor al que se hace referencia NewSecurityGroup (un grupo de seguridad creado en otra parte de la plantilla) para especificar la propiedad SecurityGroupIds. Si CreateNewSecurityGroup es falso, CloudFormation utiliza el valor referenciado de ExistingSecurityGroupId (un parámetro que hace referencia a un grupo de seguridad 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]

Salidas condicionales

En la sección Output de una plantilla, puede utilizar la función Fn::If para emitir información de forma condicional. En el siguiente fragmento de código, si la condición CreateNewSecurityGroup se evalúa como true, CloudFormation devuelve el ID del grupo de seguridad del recurso NewSecurityGroup. Si la condición es false, CloudFormation devuelve el ID de grupo de seguridad del recursoExistingSecurityGroup.

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 condicionales

El siguiente ejemplo utiliza Fn::If para proporcionar condicionalmente diferentes valores de matriz en función de una condición. Si la condición MoreThan2AZs se evalúa como verdadera, utiliza tres subredes públicas. De lo contrario, utiliza solo dos subredes 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

Propiedades condicionales y valores de propiedad

El siguiente ejemplo utiliza el pseudoparámetro AWS::NoValue en una función Fn::If. La condición utiliza una instantánea para una instancia de base de datos de Amazon RDS solo si se proporciona un ID de instantánea. Si la condición UseDBSnapshot se evalúa como true, CloudFormation utiliza el valor del parámetro DBSnapshotName para la propiedad DBSnapshotIdentifier. Si se evalúa la condición como false, CloudFormation elimina la propiedad DBSnapshotIdentifier.

También utiliza una función Fn::If en la propiedad AllocatedStorage de la instancia de base de datos de Amazon RDS. Si la condición IsProduction se evalúa como verdadera, el tamaño de almacenamiento se establece en 100. De lo contrario, se establece en 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 de actualización condicional

El siguiente fragmento de código proporciona una política de actualización de escalado automático solo si la condición RollingUpdates se evalúa como true (verdadera). Si la condición se evalúa como false, CloudFormation elimina la política de actualización 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

Devuelve true para una condición que se evalúa en false o devuelve false para una condición que se evalúa en true. Fn::Not actúa como operador NOT.

Declaración

JSON

"Fn::Not": [{condition}]

YAML

Sintaxis del nombre de función completo:

Fn::Not: [condition]

Sintaxis de la forma abreviada:

!Not [condition]

Parámetros

condition

Una condición como, por ejemplo, Fn::Equals que se evalúa como true o false.

Ejemplos de uso de Fn::Not

La siguiente condición EnvCondition se evalúa como true si el valor para el parámetro EnvironmentType no es igual a prod:

JSON

"MyNotCondition" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "EnvironmentType"}, "prod" ] }] }

YAML

MyNotCondition: !Not [!Equals [!Ref EnvironmentType, prod]]

Fn::Or

Devuelve true si alguna de las condiciones especificadas se evalúa como true o devuelve false si todas las condiciones se evalúan como false. Fn::Or actúa como operador OR. El número mínimo de las condiciones que puede incluir es 2 y el máximo es 10.

Declaración

JSON

"Fn::Or": [{condition}, {...}]

YAML

Sintaxis del nombre de función completo:

Fn::Or: [condition, ...]

Sintaxis de la forma abreviada:

!Or [condition, ...]

Parámetros

condition

Una condición que se evalúa como true o false.

Ejemplos de uso de Fn::Or

La siguiente condición MyOrCondition se evalúa como true si el nombre del grupo de seguridad al que se hace referencia es igual a sg-mysggroup o si SomeOtherCondition se evalúa como true:

JSON

"MyOrCondition" : { "Fn::Or" : [ {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]}, {"Condition" : "SomeOtherCondition"} ] }

YAML

MyOrCondition: !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]

Funciones compatibles

Puede utilizar las siguientes funciones en la condición Fn::If:

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::GetAZs

  • Fn::If

  • Fn::Join

  • Fn::Select

  • Fn::Sub

  • Ref

Puede utilizar las siguientes funciones en todas las demás funciones de condiciones, como Fn::Equals y Fn::Or:

  • Fn::FindInMap

  • Ref

  • Otras funciones de condiciones

Plantilla de muestra

Cree condicionalmente recursos para una pila de producción, desarrollo o prueba

En algunos casos, es posible que desee crear pilas que son similares, pero con pequeñas modificaciones. Por ejemplo, podría tener una plantilla que utiliza para aplicaciones de producción. Tiene que crear la misma pila de producción para poder usarla con fines de desarrollo o de realización de pruebas. Sin embargo, para el desarrollo y la realización de pruebas, es posible que no necesite toda la capacidad adicional que se incluye en una pila de nivel de producción. En su lugar, puede utilizar un parámetro de entrada de tipo de entorno para crear condicionalmente recursos de la pila específicos de producción, desarrollo o pruebas, tal y como se muestra en el siguiente ejemplo:

Puede especificar prod, devo test para el parámetro EnvType. Para cada tipo de entorno, la plantilla especifica un tipo de instancia diferente. Los tipos de instancia varían desde un tipo de instancia grande optimizada para computación a un tipo de instancia pequeño de uso general. Para especificar condicionalmente el tipo de instancia, la plantilla define dos condiciones en la sección Conditions de la plantilla: CreateProdResources, que se evalúa como true si el valor del parámetro EnvType es igual a prod y CreateDevResources, que se evalúa como true si el valor del parámetro es igual a dev.

En la propiedad InstanceType, la plantilla anida dos funciones intrínsecas Fn::If para determinar qué tipo de instancia utilizar. Si la condición CreateProdResources es true, el tipo de instancia es c5.xlarge. Si la condición es falsa, se evalúa la condición CreateDevResources. Si la condición CreateDevResources es true, el tipo de instancia es t3.medium o de lo contrario el tipo de instancia es t3.small.

Además del tipo de instancia, el entorno de producción crea y adjunta un volumen de Amazon EC2 a la instancia. Los recursos MountPoint y NewVolume se asocian con la condición CreateProdResources para que los recursos se creen únicamente si la condición se evalúa como true.

ejemplo 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" ]} } } } }
ejemplo 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 ver ejemplos más complejos del uso de condiciones para crear recursos, consulte el tema Atributo Condition.