

# Resolver desviaciones con una operación de importación
<a name="resource-import-resolve-drift"></a>

Puede haber casos en los que la configuración de un recurso se haya desviado de la configuración prevista y desee aceptar la nueva configuración como la configuración prevista. En la mayoría de los casos, se resolverían los resultados de desviación actualizando la definición de recursos en la plantilla de pila con una nueva configuración y, a continuación, se realizaría una actualización de pila. Sin embargo, si la nueva configuración actualiza una propiedad de recurso que requiere reemplazo, el recurso se volverá a crear durante la actualización de la pila. Si desea retener el recurso existente, puede utilizar la característica de importación de recursos para actualizarlo y resolver los resultados de desviación sin hacer que se reemplace el recurso.

La resolución de desviaciones de un recurso mediante una operación de importación consta de los siguientes pasos básicos:
+ [Agregue un atributo DeletionPolicy, establecido en Retener, al recurso](#resource-import-resolve-drift-console-step-01-update-stack). Esto garantiza que se retenga el recurso existente en lugar de eliminarlo cuando se quita de la pila.
+ [Elimine el recurso de la plantilla y ejecute una operación de actualización de la pila](#resource-import-resolve-drift-console-step-02-remove-drift). Esto quita el recurso de la pila, pero no lo elimina.
+ [Describa el estado real del recurso en la plantilla de la pila y, a continuación, importe el recurso existente de nuevo a la pila](#resource-import-resolve-drift-console-step-03-update-template). Esto agrega el recurso de nuevo en la pila y resuelve las diferencias de propiedad que estaban provocando los resultados de desviación.

Para obtener más información sobre la importación de recursos, consulte [Cómo importar recursos de AWS a una pila de CloudFormation de forma manual](import-resources-manually.md). Para obtener una lista de los recursos que admiten operaciones de importación, consulte [Tipo de recurso compatible](resource-import-supported-resources.md).

En este ejemplo, utilizamos la siguiente plantilla, denominada `templateToImport.json`.

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PROVISIONED",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 1
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

En este ejemplo, supongamos que un usuario ha cambiado un recurso fuera de CloudFormation. Después de ejecutar la detección de desviaciones, descubrimos que en `GamesTable` `BillingMode` se ha modificado por `PAY_PER_REQUEST`. Para obtener más información sobre la detección de desviaciones, consulte [Detectar cambios de configuración no administrados en pilas y recursos con detección de derivación](using-cfn-stack-drift.md).

![Los resultados de desviaciones muestran los resultados esperados y reales en la consola.](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/drift-results-gamestable.png)


Nuestra pila no está actualizada, nuestros recursos están activos, pero queremos preservar la configuración de recursos prevista. Podemos hacer esto resolviendo la desviación mediante una operación de importación, sin interrumpir los servicios.

## Resolver la desviación con una operación de importación mediante la consola de CloudFormation
<a name="resource-import-resolve-drift-console"></a>

### Paso 1. Actualizar pila con la política de eliminación Retener
<a name="resource-import-resolve-drift-console-step-01-update-stack"></a>

**Para actualizar la pila mediante un atributo `DeletionPolicy` con la opción `Retain`**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la página **Stacks (Pilas)**, elija la pila que se ha desviado.

1. Elija **Update (Actualizar)** y, a continuación, elija **Replace current template (Reemplazar plantilla actual)** del panel de detalles de la pila.

1. En la página **Specify template (Especificar plantilla)**, proporcione la plantilla actualizada que contiene el atributo `DeletionPolicy` con la opción `Retain` mediante uno de los siguientes métodos:
   + Seleccione **URL de Amazon S3**, y, a continuación, especifique la URL de la plantilla en el cuadro de texto.
   + Seleccione **Cargar un archivo de plantilla** y, a continuación, busque la plantilla.

   A continuación, elija **Siguiente**.

1. Revise la página **Specify stack details (Especificar detalles de la pila)** y elija **Next (Siguiente)**.

1. Revise la página **Configure stack options (Configurar opciones de la pila)** y elija **Next (Siguiente)**.

1. En la página **Review {{stack-name}}** (Revisar nombre de la pila), elija **Update stack** (Actualizar pila).

*Resultados*: en la página **Events (Eventos)** de la pila, el estado es `UPDATE_COMPLETE`.

Para resolver la desviación a través de una operación de importación, sin interrumpir los servicios, especifique una [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) `Retain` para los recursos que desea eliminar de la pila. En el siguiente ejemplo, hemos agregado un atributo [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html), establecido en `Retain`, al recurso `GamesTable`.

------
#### [ Example JSON ]

```
    "GamesTable": {
        "Type": "AWS::DynamoDB::Table",
        "DeletionPolicy": "Retain",
        "Properties": {
            "TableName": "Games",
```

------
#### [ Example YAML ]

```
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
```

------

### Paso 2. Eliminar recursos desviados, parámetros relacionados y salidas
<a name="resource-import-resolve-drift-console-step-02-remove-drift"></a>

**Para eliminar recursos desviados, parámetros relacionados y salidas**

1. Elija **Update (Actualizar)** y, a continuación, elija **Replace current template (Reemplazar plantilla actual)** del panel de detalles de la pila.

1. En la página **Specify template (Especificar plantilla)**, proporcione la plantilla actualizada con los recursos, parámetros relacionados y resultados eliminados de la plantilla de la pila mediante uno de los métodos siguientes:
   + Seleccione **URL de Amazon S3**, y, a continuación, especifique la URL de la plantilla en el cuadro de texto.
   + Seleccione **Cargar un archivo de plantilla** y, a continuación, busque la plantilla.

   A continuación, elija **Siguiente**.

1. Revise la página **Specify stack details (Especificar detalles de la pila)** y elija **Next (Siguiente)**.

1. Revise la página **Configure stack options (Configurar opciones de la pila)** y elija **Next (Siguiente)**.

1. En la página **Review {{stack-name}}** (Revisar nombre de la pila), elija **Update stack** (Actualizar pila).

*Resultados*: **Logical ID (ID lógico)** `GamesTable` tiene un estado de `DELETE_SKIPPED` en la página **Events (Eventos)** de la pila.

Espere hasta que CloudFormation finalice la operación de actualización de la pila. Una vez finalizada la operación de actualización de la pila, elimine el recurso, los parámetros relacionados y los resultados de la plantilla de la pila. A continuación, importe la plantilla actualizada. Después de completar estas acciones, la plantilla de ejemplo tiene el siguiente aspecto.

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
```

------

### Paso 3. Actualizar la plantilla para que coincida con el estado activo de los recursos
<a name="resource-import-resolve-drift-console-step-03-update-template"></a>

**Para actualizar la plantilla para que coincida con el estado activo de los recursos**

1. Para importar la plantilla actualizada, elija **Stack actions (Acciones de la pila)** y, a continuación, elija **Import resources into stack (Importar recursos en la pila)**.  
![La opción Importar recursos a la pila en la consola.](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/stack-actions-import.png)

1. Revise la página de **Import overview (Información general sobre importación)** para obtener una lista de los elementos que debe proporcionar durante esta operación y, a continuación, elija **Next (Siguiente)**.

1. En la página **Specify template (Especificar plantilla)**, proporcione la plantilla actualizada mediante uno de los métodos siguientes:
   + Seleccione **URL de Amazon S3**, y, a continuación, especifique la URL de la plantilla en el cuadro de texto.
   + Seleccione **Cargar un archivo de plantilla** y, a continuación, busque la plantilla.

   A continuación, elija **Siguiente**.

1. En la página **Identificar recursos**, identifique cada recurso de destino. Para obtener más información, consulte [Identificadores de recursos](import-resources-manually.md#resource-import-identifiers-unique-ids).

   1. En **Propiedad del identificador**, elija el tipo de identificador de recurso. Por ejemplo, la propiedad `TableName` identifica el recurso `AWS::DynamoDB::Table`.

   1. En **Identifier value (Valor del identificador)**, escriba el valor de la propiedad real. En la plantilla de ejemplo, `TableName` para el recurso `GamesTable` es `Games`.

   1. Elija **Siguiente**.

1. Revise la página **Specify stack details (Especificar detalles de pila)** y elija **Next (Siguiente)**.

1. En la página **Import overview (Información general sobre la importación)**, revise los recursos importados y, a continuación, elija **Import resources (Importar recursos)**. Esto importará el tipo de recurso `AWS::DynamoDB::Table` de nuevo a la pila.

*Resultados*: en este ejemplo, hemos resuelto la desviación de recursos mediante una operación de importación, sin interrumpir los servicios. Puede comprobar el progreso de una acción de importación en la consola de CloudFormation en la pestaña Eventos. Los recursos importados tendrán un estado de `IMPORT_COMPLETE` seguido de un estado de `CREATE_COMPLETE` con **Resource import complete (Importación de recursos completada)** como razón del estado.

Espere hasta que CloudFormation finalice la operación de actualización de la pila. Una vez finalizada la operación de actualización de la pila, la plantilla se actualiza para que coincida con el estado real desviado de los recursos. Por ejemplo, `BillingMode` se establecerá en `PAY_PER_REQUEST` y `ReadCapacityUnits` y `WriteCapacityUnits` se establecerán en `0`.

------
#### [ Example JSON ]

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
         "ServiceTable":{
           "Type":"AWS::DynamoDB::Table",
           "Properties":{
              "TableName":"Service",
              "AttributeDefinitions":[
                 {
                    "AttributeName":"key",
                    "AttributeType":"S"
                 }
              ],
              "KeySchema":[
                 {
                    "AttributeName":"key",
                    "KeyType":"HASH"
                 }
              ],
              "BillingMode": "PROVISIONED",
              "ProvisionedThroughput":{
                 "ReadCapacityUnits":5,
                 "WriteCapacityUnits":1
              }
           }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "DeletionPolicy": "Retain",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PAY_PER_REQUEST",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 0,
                    "WriteCapacityUnits": 0
                }
            }
        }
    }
}
```

------
#### [ Example YAML ]

```
AWSTemplateFormatVersion: 2010-09-09
Description: Import test
Resources:
  ServiceTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Service
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 1
  GamesTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: Games
      AttributeDefinitions:
        - AttributeName: key
          AttributeType: S
      KeySchema:
        - AttributeName: key
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
      ProvisionedThroughput:
        ReadCapacityUnits: 0
        WriteCapacityUnits: 0
```

------