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 Sintaxis de Conditions de la plantilla de CloudFormation.
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.
Temas
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
ofalse
.
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
JSON
"Fn::If": [
condition_name
,value_if_true
,value_if_false
]
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 comotrue
ofalse
.
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
ofalse
.
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