Sintaxis de Conditions de la plantilla de CloudFormation - AWS CloudFormation

Sintaxis de Conditions de la plantilla de CloudFormation

La sección opcional Conditions contiene declaraciones que definen las circunstancias por las que se crean o configuran las entidades. Por ejemplo, puede crear una condición y asociarla a un recurso o salida de manera que CloudFormation cree el recurso o salida solo si la condición es verdadera. Del mismo modo, puede asociar una condición a una propiedad de manera que CloudFormation establezca la propiedad en un valor específico solo si la condición es verdadera. Si la condición es falsa, CloudFormation establece la propiedad en un valor alternativo que especifica.

Puede utilizar condiciones cuando desee reutilizar una plantilla para crear recursos en diferentes contextos, como, por ejemplo, entornos de pruebas frente a entornos de producción. Por ejemplo, en su plantilla, puede agregar un parámetro de entrada EnvironmentType que acepte prod o test como entradas. Para el entorno prod, podría incluir instancias de EC2 con determinadas capacidades; sin embargo, para el entorno test, podría utilizar capacidades reducidas para ahorrar dinero. La definición de esta condición le permite definir qué recursos se crean y cómo se configuran para cada tipo de entorno.

Sintaxis

La sección Conditions consta del nombre de clave Conditions. Cada declaración de condición incluye un ID lógico y una o más funciones intrínsecas.

JSON

"Conditions": { "LogicalConditionName1": { "Intrinsic function": ...[ }, "LogicalConditionName2": { "Intrinsic function": ... } }

YAML

Conditions: LogicalConditionName1: Intrinsic function: ... LogicalConditionName2: Intrinsic function: ...

Cómo funcionan las condiciones

Para utilizar condiciones, siga estos pasos:

  1. Agregar una definición de parámetro: defina las entradas que evaluarán sus condiciones en la sección Parameters de su plantilla. Las condiciones se evalúan en true o false en función de los valores de estos parámetros de entrada. Tenga en cuenta que los seudoparámetros están disponibles automáticamente y no requieren una definición explícita en la sección Parameters. Para obtener más información sobre pseudoparámetros, consulte Obtención de valores de AWS mediante pseudoparámetros.

  2. Agregar una definición de condición: defina las condiciones en la sección Conditions mediante funciones intrínsecas como Fn::If o Fn::Equals. Las condiciones determinan cuándo CloudFormation crea los recursos asociados. Las condiciones se pueden basar en lo siguiente:

    • Valores de entrada o de seudoparámetros

    • Otras condiciones

    • Valores de asignación

    Sin embargo, no puede hacer referencia a los ID lógicos de los recursos ni a sus atributos en las condiciones.

  3. Asociar las condiciones a recursos o salidas: haga referencia a las condiciones en los recursos o las salidas mediante la clave Condition y el ID lógico de una condición. También puede usar Fn::If en otras partes de la plantilla (como los valores de las propiedades) para establecer valores en función de una condición. Para obtener más información, consulte Utilización de la clave Condition.

CloudFormation evalúa las condiciones al crear o actualizar una pila. CloudFormation crea entidades que se asocian a una condición true e ignora las entidades que están asociadas a una condición false. Además, CloudFormation reevalúa estas condiciones durante las actualizaciones de una pila antes de modificar los recursos. Las entidades que permanecen asociadas a una condición verdadera se actualizan, mientras que las que se asocian a una condición falsa se eliminan.

importante

Durante la actualización de una pila, no se pueden actualizar condiciones por sí mismas. Puede actualizar condiciones solo cuando incluye cambios que añaden, modifican o eliminan recursos.

Funciones intrínsecas de condiciones

Puede utilizar las siguientes funciones intrínsecas para definir condiciones:

nota

Fn::If solo se admite 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.

Utilización de la clave Condition

Una vez que se define una condición, puede aplicarla en varios lugares de la plantilla, como Resources y Outputs, mediante la clave Condition. La clave Condition hace referencia al nombre lógico de una condición y devuelve el resultado evaluado de la condición especificada.

Asociación de condiciones a los recursos

Para crear recursos de forma condicional, añada la clave Condition y el ID lógico de la condición como un atributo del recurso. CloudFormation crea el recurso únicamente cuando la condición se evalúa como true.

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

Asociación de condiciones a las salidas

También puede asociar condiciones a las salidas. CloudFormation crea la salida únicamente cuando la condición asociada se evalúa como verdadera.

JSON

"Outputs" : { "VolumeId" : { "Condition" : "IsProduction", "Value" : { "Ref" : "NewVolume" } } }

YAML

Outputs: VolumeId: Condition: IsProduction Value: !Ref NewVolume

Condiciones de referencia en otras condiciones

Al definir las condiciones en la sección Conditions, puede hacer referencia a otras condiciones mediante la clave Condition. Esto le permite crear una lógica condicional más compleja mediante la combinación de varias condiciones.

En el siguiente ejemplo, la condición IsProdAndFeatureEnabled se evalúa como verdadera solo si las condiciones IsProduction y IsFeatureEnabled se evalúan como verdaderas.

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

Devuelva condicionalmente los valores de las propiedades mediante Fn::If

Para un control más granular, puede utilizar la función intrínseca Fn::If para devolver condicionalmente uno de los dos valores de propiedad de los recursos o las salidas. Esta función evalúa una condición y devuelve un valor si la condición es verdadera y otro valor si la condición es falsa.

Valores condicionales de la propiedad

En el siguiente ejemplo, se muestra la configuración de un tipo de instancia de EC2 en función de una condición del entorno. Si la condición IsProduction es verdadera, el tipo de instancia se establece en c5.xlarge. De lo contrario, se establece en t3.small.

JSON
"Properties" : { "InstanceType" : { "Fn::If" : [ "IsProduction", "c5.xlarge", "t3.small" ] } }
YAML
Properties: InstanceType: !If - IsProduction - c5.xlarge - t3.small

Eliminación condicional de propiedades

Puede utilizar el pseudoparámetro AWS::NoValue como valor devuelto para eliminar la propiedad correspondiente cuando una condición es falsa.

JSON
"DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] }
YAML
DBSnapshotIdentifier: !If - UseDBSnapshot - !Ref DBSnapshotName - !Ref "AWS::NoValue"

Ejemplos

Creación de recursos en función del entorno

En los siguientes ejemplos se aprovisiona una instancia de EC2 y se crea y adjunta condicionalmente un nuevo volumen de EBS solo si el tipo de entorno es prod. Si el entorno es test, simplemente se crea la instancia de EC2 sin el volumen 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

Aprovisionamiento de recursos con varias condiciones

En los siguientes ejemplos se crea condicionalmente un bucket de S3 si se proporciona un nombre de bucket y se adjunta una política de bucket solo cuando el entorno está definido como prod. Si no se proporciona ningún nombre de bucket o el entorno es test, no se crea ningún recurso.

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: ...

En este ejemplo, la condición CreateBucketPolicy demuestra cómo hacer referencia a otras condiciones mediante la clave Condition. La política se crea solo cuando tanto las condiciones IsProduction y CreateBucket se evalúan como verdaderas.

nota

Para ver ejemplos más complejos del uso de condiciones, consulte el tema de atributos de Condition en la Guía de referencia de plantillas de AWS CloudFormation.