Cuando intento actualizar una variable de exportación que se usa en otra pila de AWS CloudFormation, recibo un mensaje de error. El error es: «No se puede actualizar una variable de exportación porque está siendo utilizada por otra pila. »
Descripción corta
Como solución alternativa, puede utilizar los parámetros del Almacén de parámetros de AWS Systems Manager para compartir valores entre pilas de CloudFormation. Un parámetro SSM almacena un valor en una pila (pila A) que puede usar otra pila (**pila ** B).
Cuando usa un parámetro SSM, no hay ninguna dependencia entre las dos pilas de CloudFormation. Esto se debe a que el almacén de parámetros de AWS Systems Manager almacena la variable.
**Nota:**CloudFormation admite varios tipos de parámetros de SSM.
Resolución
-
Cree una pila de CloudFormation ( ** stackA **) basada en la siguiente plantilla:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"AvailabilityZone": {
"Description": "Amazon EC2 instance Availability Zone",
"Type": "String"
},
"AMIId": {
"Description": "The Amazon Machine Image id",
"Type": "String"
},
"InstanceType": {
"Description": "The Type of instance",
"Type": "String"
}
},
"Resources": {
"myinstance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"AvailabilityZone": {
"Fn::GetAtt": ["BasicParameter", "Value"]
},
"ImageId": {
"Ref": "AMIId"
},
"InstanceType": {
"Ref": "InstanceType"
}
}
},
"BasicParameter": {
"Type": "AWS::SSM::Parameter",
"Properties": {
"Name": "AvailabilityZone",
"Type": "String",
"Value": {
"Ref": "AvailabilityZone"
}
}
}
}
}
La plantilla anterior crea una instancia y un parámetro SSM. El valor del parámetro SSM se establece en la zona de disponibilidad de la instancia que se ha creado. **StackA ** crea un almacén de parámetros de SSM con el ** nombre ** establecido en ** AvailabilityZone ** y el valor establecido en us-east-2a. ** ** ** **
**Nota:**Debe usar un nombre único para el parámetro SSM.
- Cree otra pila de CloudFormation (StackB) basada en la siguiente plantilla.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"AMIId": {
"Description": "The Amazon Machine Image id",
"Type": "String"
},
"InstanceType": {
"Description": "The Type of instance",
"Type": "String"
},
"AvailabilityZone": {
"Description": "Amazon EC2 instance Availablity Zone",
"Type": "AWS::SSM::Parameter::Value<String>",
"Default": "AvailabilityZone"
}
},
"Mappings": {},
"Conditions": {},
"Resources": {
"myinstance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"AvailabilityZone": {
"Ref": "AvailabilityZone"
},
"ImageId": {
"Ref": "AMIId"
},
"InstanceType": {
"Ref": "InstanceType"
}
}
}
}
}
Esta plantilla usa el parámetro SSM que ** StackA ** creó en el paso 1.
Nota:Para usar este parámetro, debes declarar un parámetro en ** StackB. Defina el ** tipo ** en ** AWS: :SSM: :Parameter: :Value<String>. La instancia creada a partir de ** StackB ** se lanza luego en la zona de disponibilidad ** ** us-east-2a.
-
Para actualizar la ** pila A**, cambia el ** parámetro ** AvailabilityZone de us-east-2a a us-east-2b. ** ** ** **
-
Lanza la instancia desde ** StackA ** en la misma zona de disponibilidad actualizada que StackB. ** ** La instancia se reemplaza y, a continuación, se lanza en la zona de ** disponibilidad us-east-2b**.