

# Ejemplo de conjuntos de cambio para pilas de CloudFormation
<a name="using-cfn-updating-stacks-changesets-samples"></a>

En esta sección, se brindan ejemplos de los conjuntos de cambios que CloudFormation crearía para cambios de pila comunes. Muestran cómo editar una plantilla de manera directa, modificar un único parámetro de entrada, planificar la recreación de recursos (sustituciones) para evitar la pérdida de los datos sin copia de seguridad ni interrumpir las aplicaciones que se ejecuten en la pila y añadir y eliminar recursos. Para ilustrar cómo funcionan 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)](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Change.html) en la *referencia de la API de AWS CloudFormation*.

Puede utilizar la [consola](using-cfn-updating-stacks-changesets-view.md), la AWS CLI, o la operación [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeChangeSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeChangeSet.html) de API de CloudFormation para ver los detalles del conjunto de cambios.

Generamos cada uno de los conjuntos de cambios desde una pila con la siguiente [plantilla de ejemplo](https://s3.amazonaws.com/cloudformation-examples/user-guide/changesets/ec2-instance.txt):

```
{
  "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" }
          }
        ]
      }
    }
  }
}
```

## Modificación directa de una plantilla
<a name="using-cfn-updating-stacks-changesets-samples-directly-editing-a-template"></a>

Cuando se modifican 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/MyStack/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": "MyStack",
    "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 con la confianza de 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
<a name="using-cfn-updating-stacks-changesets-samples-modifying-a-single-input-parameter-value"></a>

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 generó 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/MyStack/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": "MyStack",
    "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 de [Modificación directa de una plantilla](#using-cfn-updating-stacks-changesets-samples-directly-editing-a-template). 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 (con la función intrínseca `Ref`) siempre generan dos cambios: uno con una `Dynamic` y otro con una evaluación `Static`. Estos tipos de cambios son visibles al consultar los siguientes campos:
+ Para el cambio de evaluación `Static`, consulte 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 al comparar 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, la cual ofrece más información detallada sobre el 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 campo `CauseEntity` (el parámetro `Purpose`) indica el parámetro exacto que se cambió.

## Determinación del valor del campo de repuesto
<a name="using-cfn-updating-stacks-changesets-samples-determining-the-value-of-the-replacement-field"></a>

El campo `Replacement` de una estructura de `ResourceChange` indica si CloudFormation volverá a crear el recurso. La planificación de la recreación de los recursos (sustituciones) impide la pérdida de datos sin 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, lo cual se indica en 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 tantos cambios requiere una sustitución, CloudFormation debe sustituir el recurso y, por lo tanto, establece el campo `Replacement` en `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/MyStack/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": "MyStack",
    "NotificationARNs": [],
    "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-multiple/1a2345b6-0000-00a0-a123-00abc0abc000"
}
```

Visualice cada cambio (las evaluaciones estáticas de la estructura de `Details`) para identificar el cambio que requiere sustituir el recurso. 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, consulte el comportamiento de la actualización de la propiedad `InstanceType` del tipo de recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html).

## Adición y eliminación de recursos
<a name="using-cfn-updating-stacks-changesets-samples-adding-and-removing-resources"></a>

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/MyStack/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": "MyStack",
    "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.

## Consulta de cambios a nivel de propiedad
<a name="using-cfn-updating-stacks-changesets-samples-property-level-change-set"></a>

En el ejemplo que figura a continuación, se muestran los cambios a nivel de propiedad de la propiedad `Tag` de una instancia de Amazon EC2. La etiqueta `Value` y `Key` cambiarán a `Test`.

```
"ChangeSetName": "SampleChangeSet",
    "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet/38d91d27-798d-4736-9bf1-fb7c46207807",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleEc2Template/68edcdc0-f6b6-11ee-966c-126d572cdd11",
    "StackName": "SampleEc2Template",
    "Description": "A sample EC2 instance template for testing change sets.",
    "Parameters": [
        {
            "ParameterKey": "KeyPairName",
            "ParameterValue": "BatchTest"
        },
        {
            "ParameterKey": "Purpose",
            "ParameterValue": "testing"
        },
        {
            "ParameterKey": "InstanceType",
            "ParameterValue": "t2.micro"
        }
    ],
    "CreationTime": "2024-04-09T21:29:10.759000+00:00",
    "ExecutionStatus": "AVAILABLE",
    "Status": "CREATE_COMPLETE",
    "StatusReason": null,
    "NotificationARNs": [],
    "RollbackConfiguration": {
:...skipping...
{
    "Changes": [
        {
            "Type": "Resource",
            "ResourceChange": {
                "Action": "Modify",
                "LogicalResourceId": "MyEC2Instance",
                "PhysicalResourceId": "i-0cc7856a36315e62b",
                "ResourceType": "AWS::EC2::Instance",
                "Replacement": "False",
                "Scope": [
                    "Tags"
                ],
                "Details": [
                    {
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never",
                            "Path": "/Properties/Tags/0/Value",
                            "BeforeValue": "testing",
                            "AfterValue": "Test",
                            "AttributeChangeType": "Modify"
                        },
                        "Evaluation": "Static",
                        "ChangeSource": "DirectModification"
                    },
                    {
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never",
                            "Path": "/Properties/Tags/0/Key",
                            "BeforeValue": "Purpose",
                            "AfterValue": "Test",
                            "AttributeChangeType": "Modify"
                        },
                        "Evaluation": "Static",
                        "ChangeSource": "DirectModification"
                    }
                ],
                "BeforeContext": "{\"Properties\":{\"KeyName\":\"BatchTest\",\"ImageId\":\"ami-8fcee4e5\",\"InstanceType\":\"t2.micro\",\"Tags\":[{\"Value\":\"testing\",\"Key\":\"Purpose\"}]}}",
                "AfterContext": "{\"Properties\":{\"KeyName\":\"BatchTest\",\"ImageId\":\"ami-8fcee4e5\",\"InstanceType\":\"t2.micro\",\"Tags\":[{\"Value\":\"Test\",\"Key\":\"Test\"}]}}"
            }
        }
    ]
```

La estructura `Details` muestra los valores correspondientes de `Key` y `Value` previos a la ejecución del conjunto de cambios y su estado luego de la ejecución del conjunto.