Esta es la nueva Guía de referencia de plantillas de AWS CloudFormation. Actualice sus marcadores y enlaces. Para obtener ayuda sobre cómo empezar a usar CloudFormation, consulte la Guía del usuario de AWS CloudFormation.
Funciones de condiciones
Puede utilizar funciones intrínsecas, como por ejemplo Fn::If
o Fn::Equals
, para crear y configurar recursos de la pila en función de la lógica condicional. Estas condiciones se evalúan durante la creación de la pila o sus actualizaciones. 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.
Para escenarios avanzados, puede combinar condiciones mediante funciones Fn::And
o Fn::Or
, o usar Fn::Not
para negar el valor de una condición. También puede anidar condiciones para crear una lógica condicional más compleja.
Si es la primera vez que utiliza condiciones en sus plantillas, recomendamos consultar primero el tema de sintaxis de las condiciones de las plantillas de CloudFormation en la Guía del usuario de AWS CloudFormation.
nota
Debe 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 Metadata
, en el atributo UpdatePolicy
y los valores de la propiedad en la secciones Resources
y Outputs
.
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
.
Ejemplos de uso de Fn::And
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 cadena que desee comparar.
Ejemplos de uso de Fn::Equals
La siguiente condición IsProduction
se evalúa como true si el valor para el parámetro EnvironmentType
es igual a prod
:
JSON
"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }
YAML
IsProduction: !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 Metadata
, en el atributo UpdatePolicy
y en los valores de la propiedad en la sección Resources
y en las secciones 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 de uso de Fn::If
Temas
Elección de un recurso de forma condicional
En el siguiente ejemplo, se utiliza una función Fn::If
en una definición de recurso de Amazon EC2 para determinar qué recurso del grupo de seguridad se debe asociar a la instancia. Si la condición CreateNewSecurityGroup
se evalúa como verdadera, CloudFormation utiliza el valor al que se hace referencia NewSecurityGroup
(un grupo de seguridad creado en otra parte de la plantilla) para especificar la propiedad SecurityGroupIds
. Si CreateNewSecurityGroup
es falso, CloudFormation utiliza el valor referenciado de ExistingSecurityGroupId
(un parámetro que hace referencia a un grupo de seguridad existente).
JSON
"Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0abcdef1234567890", "InstanceType": "t3.micro", "SecurityGroupIds": { "Fn::If": [ "CreateNewSecurityGroup", [{"Ref": "NewSecurityGroup"}], [{"Ref": "ExistingSecurityGroupId"}] ] }] } } }
YAML
Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-0abcdef1234567890 InstanceType: t3.micro SecurityGroupIds: !If - CreateNewSecurityGroup - [!Ref NewSecurityGroup] - [!Ref ExistingSecurityGroupId]
Salidas condicionales
En la sección Output
de una plantilla, puede utilizar la función Fn::If
para emitir información de forma condicional. 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" : "ExistingSecurityGroupId"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]
Valores de matriz condicionales
El siguiente ejemplo utiliza Fn::If
para proporcionar condicionalmente diferentes valores de matriz en función de una condición. Si la condición MoreThan2AZs
se evalúa como verdadera, utiliza tres subredes públicas. De lo contrario, utiliza solo dos subredes públicas.
JSON
"Subnets": { "Fn::If": [ "MoreThan2AZs", [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"}, {"Fn::ImportValue": "PublicSubnet03"} ], [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"} ] ] }
YAML
Subnets: Fn::If: - MoreThan2AZs - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02 - Fn::ImportValue: PublicSubnet03 - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02
Propiedades condicionales y valores de propiedad
El siguiente ejemplo 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
.
También utiliza una función Fn::If
en la propiedad AllocatedStorage
de la instancia de base de datos de Amazon RDS. Si la condición IsProduction
se evalúa como verdadera, el tamaño de almacenamiento se establece en 100
. De lo contrario, se establece en 20
.
JSON
"MyDatabase" : { "Type" : "AWS::RDS::DBInstance", "Properties": { "DBInstanceClass": "db.t3.micro", "AllocatedStorage": { "Fn::If": [ "IsProduction", 100, 20 ] }, "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDatabase: Type: AWS::RDS::DBInstance Properties: DBInstanceClass: db.t3.micro AllocatedStorage: !If [IsProduction, 100, 20] Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
Políticas de actualización condicional
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": { "Fn::If": [ "RollingUpdates", { "AutoScalingRollingUpdate": { "MaxBatchSize": 2, "MinInstancesInService": 2, "PauseTime": "PT0M30S" } }, { "Ref": "AWS::NoValue" } ] }
YAML
UpdatePolicy: !If - RollingUpdates - AutoScalingRollingUpdate: 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
.
Ejemplos de uso de Fn::Not
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
.
Ejemplos de uso de Fn::Or
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
Plantilla de muestra
Cree condicionalmente recursos para una pila de producción, desarrollo o prueba
En algunos casos, es posible que desee crear pilas que son similares, pero con pequeñas modificaciones. Por ejemplo, podría tener una plantilla que utiliza para aplicaciones de producción. Tiene que crear la misma pila de producción para poder usarla con fines de desarrollo o de realización de pruebas. Sin embargo, para el desarrollo y la realización de pruebas, es posible que no necesite toda la capacidad adicional que se incluye en una pila de nivel de producción. En su lugar, puede utilizar un parámetro de entrada de tipo de entorno para crear condicionalmente recursos de la pila específicos de producción, desarrollo o pruebas, tal y como se muestra en el siguiente ejemplo:
Puede especificar prod
, dev
o test
para el parámetro EnvType
. Para cada tipo de entorno, la plantilla especifica un tipo de instancia diferente. Los tipos de instancia varían desde un tipo de instancia grande optimizada para computación a un tipo de instancia pequeño de uso general. Para especificar condicionalmente el tipo de instancia, la plantilla define dos condiciones en la sección Conditions
de la plantilla: CreateProdResources
, que se evalúa como true si el valor del parámetro EnvType
es igual a prod
y CreateDevResources
, que se evalúa como true si el valor del parámetro es igual a dev
.
En la propiedad InstanceType
, la plantilla anida dos funciones intrínsecas Fn::If
para determinar qué tipo de instancia utilizar. Si la condición CreateProdResources
es true, el tipo de instancia es c5.xlarge
. Si la condición es falsa, se evalúa la condición CreateDevResources
. Si la condición CreateDevResources
es true, el tipo de instancia es t3.medium
o de lo contrario el tipo de instancia es t3.small
.
Además del tipo de instancia, el entorno de producción crea y adjunta un volumen de Amazon EC2 a la instancia. Los recursos MountPoint
y NewVolume
se asocian con la condición CreateProdResources
para que los recursos se creen únicamente si la condición se evalúa como true.
ejemplo JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "dev", "test"], "ConstraintDescription" : "must specify prod, dev, or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}, "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-1234567890abcdef0", "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c5.xlarge", {"Fn::If" : [ "CreateDevResources", "t3.medium", "t3.small" ]} ]} } }, "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" ]} } } } }
ejemplo YAML
AWSTemplateFormatVersion: "2010-09-09" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: [prod, dev, test] ConstraintDescription: must specify prod, dev, or test. Conditions: CreateProdResources: !Equals [!Ref EnvType, prod] CreateDevResources: !Equals [!Ref EnvType, "dev"] Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.small]] 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
nota
Para ver ejemplos más complejos del uso de condiciones para crear recursos, consulte el tema Atributo Condition.