Funciones de condiciones - AWS CloudFormation

Funciones de condiciones

Puede utilizar funciones intrínsecas, como por ejemplo Fn::If, Fn::Equals y Fn::Not, para crear condicionalmente los recursos de la pila. Estas condiciones se evalúan en función de los parámetros de entrada que declare al crear o actualizar una pila. 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.

Puede 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 de metadatos, el atributo de la política de actualización y los valores de la propiedad en la sección Resources y en la sección Outputs de una plantilla.

Es posible utilizar condiciones cuando desea reutilizar una plantilla que puede crear recursos en diferentes contextos, como, por ejemplo, un entorno de pruebas frente a un entorno de producción. En su plantilla, puede añadir un parámetro de entrada EnvironmentType, que acepte prod o test como entradas. Para el entorno de producción, podría incluir instancias Amazon EC2 con determinadas capacidades; sin embargo, para el entorno de prueba sugerimos utilizar menos capacidades para ahorrar costos. Con las condiciones, puede definir qué recursos se crean y cómo se configuran para cada tipo de entorno.

Para obtener más información sobre la sección Conditions, consulte Condiciones.

nota

Solo puede hacer referencia a otras condiciones y los valores de las secciones Parameters y Mappings de una plantilla. Por ejemplo, puede hacer referencia a un valor de un parámetro de entrada, pero no puede hacer referencia al ID de lógica de un recurso en una condición.

Asociación de una condición

Para crear salidas, propiedades de recursos o recursos condicionalmente, debe asociar con ellos una condición. Añada la clave Condition: y el ID lógico de la condición como un atributo para asociar una condición, tal y como se muestra en el siguiente fragmento de código. AWS CloudFormation crea el recurso NewVolume únicamente cuando la condición CreateProdResources se evalúa como true.

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 la función Fn::If, solo tiene que especificar el nombre de la condición. Los siguientes fragmentos de código muestran cómo utilizar Fn::If para especificar condicionalmente la propiedad de un recurso. Si la condición CreateLargeSize es true, CloudFormation establece el tamaño del volumen en 100. Si la condición es false, CloudFormation establece el tamaño del volumen en 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

Condiciones anidadas

También puede utilizar las condiciones dentro de otras condiciones. El siguiente fragmento de código es de la sección Conditions de una plantilla. La condición MyAndCondition incluye la condición 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

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.

Ejemplo

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 cualquier tipo que desee comparar.

Ejemplo

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

JSON

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

YAML

UseProdCondition: !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 de metadatos, el atributo de la política de actualización y los valores de la propiedad en las secciones Resources y 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

Para ver ejemplos adicionales, consulte Plantillas de de ejemplo.

Ejemplo 1

El siguiente fragmento de código utiliza una función Fn::If en la propiedad SecurityGroups para un recurso de Amazon EC2. Si la condición CreateNewSecurityGroup se evalúa como true, CloudFormation utiliza el valor al que se hace referencia de NewSecurityGroup para especificar la propiedad SecurityGroups; de lo contrario, CloudFormation utiliza el valor de referencia de ExistingSecurityGroup.

JSON
"SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }]
YAML
SecurityGroups: - !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

Ejemplo 2

En la sección Output de una plantilla, puede utilizar la función Fn::If para devolver condicionalmente información. 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" : "ExistingSecurityGroup"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

Ejemplo 3

El siguiente fragmento de código 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.

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"]

Ejemplo 4

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": { "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

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.

Ejemplo

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.

Ejemplo

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