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:
-
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ónParameters
. Para obtener más información sobre pseudoparámetros, consulte Obtención de valores de AWS mediante pseudoparámetros. -
Agregar una definición de condición: defina las condiciones en la sección
Conditions
mediante funciones intrínsecas comoFn::If
oFn::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.
-
-
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 usarFn::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.
Temas
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
Temas
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.