Ejemplo de conjuntos de cambio - AWS CloudFormation

Ejemplo de conjuntos de cambio

En esta sección se proporcionan ejemplos de los conjuntos de cambios que CloudFormation crearía para cambios de pila comunes. Muestran cómo editar una plantilla directamente, modificar un único parámetro de entrada, planificar la recreación de recursos (sustituciones) para no perder datos que no tuvieran copia de seguridad ni interrumpir aplicaciones que se ejecuten en la pila, y añadir y eliminar recursos. Para ilustrar cómo funciona los conjuntos de cambios, le guiaremos por los cambios enviados y debatiremos el conjunto de cambios resultante. Dado que cada ejemplo se basa en el ejemplo anterior y se asume que usted lo entiende, le recomendamos que los lea en orden. Para obtener una descripción de cada campo de un conjunto de cambios, consulte el tipo de datos Change (Cambio) en la referencia de la API de AWS CloudFormation.

Puede utilizar la consola, la AWS CLI, o la operación DescribeChangeSet de API de CloudFormation para ver los detalles del conjunto de cambios.

Hemos generado cada uno de los conjuntos de cambios desde una pila con la siguiente plantilla de ejemplo:

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "A sample EC2 instance template for testing change sets.", "Parameters" : { "Purpose" : { "Type" : "String", "Default" : "testing", "AllowedValues" : ["testing", "production"], "Description" : "The purpose of this instance." }, "KeyPairName" : { "Type": "AWS::EC2::KeyPair::KeyName", "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance" }, "InstanceType" : { "Type" : "String", "Default" : "t2.micro", "AllowedValues" : ["t2.micro", "t2.small", "t2.medium"], "Description" : "The EC2 instance type." } }, "Resources" : { "MyEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "KeyName" : { "Ref" : "KeyPairName" }, "InstanceType" : { "Ref" : "InstanceType" }, "ImageId" : "ami-8fcee4e5", "Tags" : [ { "Key" : "Purpose", "Value" : { "Ref" : "Purpose" } } ] } } } }

Modificar una plantilla directamente

Cuando usted modifica directamente los recursos de la plantilla de pila para generar un conjunto de cambios, CloudFormation clasifica el cambio como una modificación directa, en lugar de cambios iniciados por un valor de parámetros actualizados. El siguiente conjunto de cambios, que añadió una nueva etiqueta a la instancia i-1abc23d4, es un ejemplo de modificación directa. Todos los demás valores de entrada, como los valores de los parámetros y capacidades, no cambian, por lo que vamos a centrarnos en la estructura de Changes.

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet-direct", "Parameters": [ { "ParameterValue": "testing", "ParameterKey": "Purpose" }, { "ParameterValue": "MyKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.micro", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-1abc23d4", "Details": [ { "ChangeSource": "DirectModification", "Evaluation": "Static", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } } ], "Action": "Modify", "Scope": [ "Tags" ], "LogicalResourceId": "MyEC2Instance", "Replacement": "False" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T23:35:25.813Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-direct/1a2345b6-0000-00a0-a123-00abc0abc000" }

En la estructura de Changes, solo hay una estructura de ResourceChange. Esta estructura describe información como el tipo de recurso que cambiará CloudFormation, la acción que realizará CloudFormation, el ID del recurso, el alcance del cambio y si el cambio requiere una sustitución (donde CloudFormation crea un nuevo recurso y, a continuación, elimina el anterior). En el ejemplo, el conjunto de cambios indica que CloudFormation va a modificar el atributo Tags de la instancia de EC2 i-1abc23d4 y no requiere que se sustituya la instancia.

En la estructura de Details, CloudFormation etiqueta este cambio como una modificación directa que nunca necesitará la recreación (sustitución) de la instancia. Puede ejecutar con confianza este cambio, sabiendo que CloudFormation no sustituirá la instancia.

CloudFormation muestra este cambio como una evaluación Static. Una evaluación estática significa que CloudFormation puede determinar el valor de la etiqueta antes de ejecutar el conjunto de cambios. En algunos casos, CloudFormation puede determinar un valor solo después de ejecutar un conjunto de cambios. CloudFormation etiqueta esos cambios como evaluaciones de Dynamic. Por ejemplo, si hace referencia a un recurso actualizado que se sustituye condicionalmente, CloudFormation no puede determinar si cambiará la referencia al recurso actualizado.

Modificación de un valor de parámetro de entrada

Si modifica un valor de parámetro de entrada, CloudFormation genera dos cambios para cada recurso que utilice el valor del parámetro actualizado. En este ejemplo, queremos destacar cómo son dichos cambios y en qué información debería centrarse. El siguiente ejemplo se ha generado al cambiar solo el valor del parámetro de entrada Purpose.

El parámetro Purpose especifica un valor de clave de etiqueta para la instancia de EC2. En el ejemplo, se cambió el valor del parámetro de testing a production. El nuevo valor aparece en la estructura de Parameters.

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet", "Parameters": [ { "ParameterValue": "production", "ParameterKey": "Purpose" }, { "ParameterValue": "MyKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.micro", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-1abc23d4", "Details": [ { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } }, { "CausingEntity": "Purpose", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } } ], "Action": "Modify", "Scope": [ "Tags" ], "LogicalResourceId": "MyEC2Instance", "Replacement": "False" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T23:59:18.447Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000" }

La estructura de Changes funciona de forma similar al ejemplo Modificar una plantilla directamente. Sólo hay una estructura de ResourceChange; describe un cambio en el atributo Tags de la instancia de EC2 i-1abc23d4.

Sin embargo, en la estructura Details, el conjunto de cambios muestra dos cambios para el atributo Tags, aunque solo se cambió el valor de un parámetro. Los recursos que hacen referencia a un valor de parámetro cambiado (utilizando la función intrínseca Ref) siempre generan dos cambios: uno con una Dynamic y otro con una evaluación Static. Se pueden ver estos tipos de cambios consultando los siguientes campos:

  • Para el cambio de evaluación Static, vea el campo ChangeSource. En este ejemplo, el campo ChangeSource equivale a ParameterReference, lo que significa que este cambio es un resultado de un valor de referencia de parámetro actualizado. El conjunto de cambios debe contener un cambio de evaluación Dynamic similar.

  • Puede encontrar el cambio de evaluación Dynamic coincidente comparando la estructura de Target en ambos cambios, que contendrá la misma información. En este ejemplo, las estructuras Target de ambos cambios contienen los mismos valores para los campos Attribute y RequireRecreation.

Para estos tipos de cambios, céntrese en la evaluación estática, que ofrece más información detallada acerca del cambio. En este ejemplo, la evaluación estática muestra que el cambio es el resultado de un cambio en un valor de referencia de parámetro (ParameterReference). El parámetro exacto que se cambió está indicado por el campo CauseEntity (el parámetro Purpose).

Determinar el valor del campo de repuesto

El campo Replacement de una estructura de ResourceChange indica si CloudFormation va a volver a crear el recurso. Planificar la recreación de recursos (sustituciones) le impide perder datos que no tengan copia de seguridad o la interrupción de aplicaciones que se ejecutan en la pila.

El valor del campo Replacement depende de si un cambio requiere una sustitución, algo que indica el campo RequiresRecreation en la estructura Target de un cambio. Por ejemplo, si el campo RequiresRecreation es Never, el campo Replacement es False. Sin embargo, si hay varios cambios en un solo recurso y cada cambio tiene un valor diferente para el campo RequiresRecreation, CloudFormation actualiza el recurso con el comportamiento más intrusivo. En otras palabras, si solo uno de los muchos cambios requiere una sustitución, CloudFormation debe sustituir el recurso y, por lo tanto, establece el campo Replacement como True.

Se generó el siguiente conjunto de cambios al cambiar los valores de cada parámetro (Purpose, InstanceType y KeyPairName), que utiliza la instancia de EC2. Con estos cambios, será necesario que CloudFormation sustituya la instancia, ya que el campo Replacement es igual a True.

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet-multiple", "Parameters": [ { "ParameterValue": "production", "ParameterKey": "Purpose" }, { "ParameterValue": "MyNewKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.small", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-7bef86f8", "Details": [ { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Properties", "Name": "KeyName", "RequiresRecreation": "Always" } }, { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Properties", "Name": "InstanceType", "RequiresRecreation": "Conditionally" } }, { "ChangeSource": "DirectModification", "Evaluation": "Dynamic", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } }, { "CausingEntity": "KeyPairName", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Properties", "Name": "KeyName", "RequiresRecreation": "Always" } }, { "CausingEntity": "InstanceType", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Properties", "Name": "InstanceType", "RequiresRecreation": "Conditionally" } }, { "CausingEntity": "Purpose", "ChangeSource": "ParameterReference", "Evaluation": "Static", "Target": { "Attribute": "Tags", "RequiresRecreation": "Never" } } ], "Action": "Modify", "Scope": [ "Tags", "Properties" ], "LogicalResourceId": "MyEC2Instance", "Replacement": "True" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T00:39:35.974Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-multiple/1a2345b6-0000-00a0-a123-00abc0abc000" }

Identifique el cambio que requiere sustituir el recurso visualizando cada cambio (las evaluaciones estáticas de la estructura de Details). En este ejemplo, cada cambio tiene un valor diferente para el campo RequireRecreation, pero el cambio de la propiedad KeyName tiene el comportamiento de actualización más intrusivo, siempre requiere una recreación. CloudFormation sustituirá la instancia, ya que se cambió el nombre de clave.

Si no se cambió el nombre de clave, el cambio de la propiedad InstanceType tendría el comportamiento de actualización más intrusivo (Conditionally), por lo que el campo Replacement sería Conditionally. Para encontrar las condiciones en las que CloudFormation sustituye la instancia, vea el comportamiento de actualización de la propiedad InstanceType.

Agregar y eliminar recursos

El siguiente ejemplo se ha generado al enviar una plantilla modificada que elimina la instancia de EC2 y añade un grupo de Auto Scaling y una configuración de lanzamiento.

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000", "Status": "CREATE_COMPLETE", "ChangeSetName": "SampleChangeSet-addremove", "Parameters": [ { "ParameterValue": "testing", "ParameterKey": "Purpose" }, { "ParameterValue": "MyKeyName", "ParameterKey": "KeyPairName" }, { "ParameterValue": "t2.micro", "ParameterKey": "InstanceType" } ], "Changes": [ { "ResourceChange": { "Action": "Add", "ResourceType": "AWS::AutoScaling::AutoScalingGroup", "Scope": [], "Details": [], "LogicalResourceId": "AutoScalingGroup" }, "Type": "Resource" }, { "ResourceChange": { "Action": "Add", "ResourceType": "AWS::AutoScaling::LaunchConfiguration", "Scope": [], "Details": [], "LogicalResourceId": "LaunchConfig" }, "Type": "Resource" }, { "ResourceChange": { "ResourceType": "AWS::EC2::Instance", "PhysicalResourceId": "i-1abc23d4", "Details": [], "Action": "Remove", "Scope": [], "LogicalResourceId": "MyEC2Instance" }, "Type": "Resource" } ], "CreationTime": "2020-11-18T01:44:08.444Z", "Capabilities": [], "StackName": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-addremove/1a2345b6-0000-00a0-a123-00abc0abc000" }

En la estructura de Changes, existen tres estructuras de ResourceChange, una para cada recurso. Para cada recurso, el campo Action indica si CloudFormation agrega o elimina el recurso. Los campos Scope y Details están vacíos, ya que se aplican únicamente a los recursos modificados.

Para nuevos recursos, CloudFormation no puede determinar el valor de algunos campos hasta que se ejecute el cambio. Por ejemplo, CloudFormation no proporciona el ID físico del grupo del grupo de escalado automático y la configuración de lanzamiento, ya que no existen todavía. CloudFormation crea los nuevos recursos cuando se ejecuta el conjunto de cambios.