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, a continuación, asociarla a un recurso o salida de manera que CloudFormation solo cree el recurso o salida si la condición es true. Del mismo modo, puede asociar la condición a una propiedad de manera que CloudFormation solo establezca la propiedad en un valor específico si la condición es true. Si la condición es false, CloudFormation establece la propiedad en un valor diferente del especificado.
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 capacidades reducidas para ahorrar dinero. Con las condiciones, puede definir qué recursos se crean y cómo se configuran para cada tipo de entorno.
Las condiciones se evalúan en función de pseudoparámetros predefinidos o los valores de parámetros de entrada que especifique al crear o actualizar una pila. Dentro de cada condición, puede hacer referencia a otra condición, al valor del parámetro o a un mapeo. Después de definir todas las condiciones, puede asociarlas con los recursos y las propiedades de los recursos en las secciones Resources
y Outputs
de una plantilla.
En la creación o en la actualización de la pila, AWS CloudFormation evalúa todas las condiciones de su plantilla antes de crear cualquier recurso. Se crean recursos asociados a una condición true. Se ignoran los recursos que están asociados a una condición false. Además, CloudFormation reevalúa estas condiciones cada vez que se actualiza una pila antes de actualizar los recursos. Los recursos que siguen estando asociados a una condición true se actualizan. Los recursos que ahora están asociados a una condición false 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.
Cómo usar las condiciones
En función de la entidad que desee crear o configurar condicionalmente, debe incluir declaraciones en las siguientes secciones de plantilla:
- Sección de
Parameters
-
Defina las entradas que desee que sus condiciones evalúen. Las condiciones se evalúan en true o false en función de los valores de estos parámetros de entrada. Si desea que sus condiciones evalúen pseudoparámetros, no es necesario definir los pseudoparámetros de esta sección; CloudFormation los predefine. Para obtener más información sobre pseudoparámetros, consulte Referencia de pseudoparámetros.
- Sección de
Conditions
-
Defina condiciones mediante las funciones de condiciones intrínsecas. Las condiciones determinan cuándo CloudFormation crea los recursos asociados. Para ver ejemplos, consulte Plantillas de ejemplo.
- Secciones
Resources
yOutputs
-
Asocie condiciones con los recursos o salidas que desee crear condicionalmente. CloudFormation crea entidades que se asocian a una condición true e ignora las entidades que están asociadas a una condición false. Utilice la clave
Condition
y el ID lógico de una condición para asociarlo a un recurso o salida. Para especificar condicionalmente una propiedad, utilice la funciónFn::If
. Para ver un ejemplo, consulte Asociación de una condición.
Sintaxis
La sección Conditions
consta del nombre de clave Conditions
. Cada declaración de condición incluye un ID lógico y funciones intrínsecas que se evalúan cuando crea o actualiza una pila. La siguiente pseudoplantilla muestra la sección Conditions
:
JSON
"Conditions" : { "
ConditionLogicalID
" : {Intrinsic function
} }
YAML
Conditions:
ConditionLogicalID
:Intrinsic function
Funciones intrínsecas de condiciones
Puede utilizar las siguientes funciones intrínsecas para definir condiciones:
-
Fn::And
-
Fn::Equals
-
Fn::ForEach
-
Fn::If
-
Fn::Not
-
Fn::Or
Para la sintaxis e información sobre cada función de condición, consulte Funciones de condiciones. Para obtener la sintaxis e información acerca de Fn::ForEach
, consulte Fn::ForEach.
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.
Ejemplos
Condición simple
La siguiente plantilla de ejemplo incluye un parámetro de entrada EnvType
, donde puede especificar prod
para crear una pila para la producción o test
para crear una pila para las pruebas. En un entorno de producción, CloudFormation crea una instancia de Amazon EC2 y asocia un volumen a la instancia. Para un entorno de pruebas, CloudFormation crea únicamente la instancia de Amazon EC2.
La condición CreateProdResources
se evalúa como true
si el parámetro EnvType
es igual a prod
. En la plantilla de ejemplo, los recursos NewVolume
y MountPoint
se asocian con la condición CreateProdResources
. Por lo tanto, los recursos se crean únicamente si el parámetro EnvType
es igual a prod
.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "EnvType": { "Description": "Environment type.", "Default": "test", "Type": "String", "AllowedValues": [ "prod", "test" ], "ConstraintDescription": "must specify prod or test." } }, "Conditions": { "CreateProdResources": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] } }, "Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867" } }, "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" ] } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: - prod - test ConstraintDescription: must specify prod or test. Conditions: CreateProdResources: !Equals - !Ref EnvType - prod Resources: EC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 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
Condición anidada
La siguiente plantilla de ejemplo hace referencia a una condición dentro de otra condición. Puede crear una pila que cree un bucket de s3. Para una pila implementada en un entorno de producción, CloudFormation crea una política para el bucket de S3.
JSON
{ "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" }, "Policy": { "Type": "AWS::S3::BucketPolicy", "Condition": "CreateBucketPolicy", "Properties": { "Bucket": { "Ref": "Bucket" }, "PolicyDocument": "..." } } } }
YAML
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 Policy: Type: 'AWS::S3::BucketPolicy' Condition: CreateBucketPolicy Properties: Bucket: !Ref BucketName PolicyDocument: ...