

# Detectar cambios de configuración no administrados en pilas y recursos con detección de derivación
<a name="using-cfn-stack-drift"></a>

Incluso aunque administre sus recursos a través de CloudFormation, los usuarios pueden cambiar esos recursos desde fuera de CloudFormation. Los usuarios pueden editar los recursos directamente usando el servicio subyacente que ha creado el recurso. Por ejemplo, puede utilizar la consola de Amazon EC2 para actualizar una instancia de servidor que se creó como parte de una pila de CloudFormation. Algunos cambios pueden ser accidentales, mientras que otros pueden realizarse a propósito para dar respuesta a eventos operativos en los que el tiempo es crucial. Sea cual sea el motivo, los cambios realizados fuera de CloudFormation pueden complicar las operaciones de actualización de la pila o de eliminación. Puede utilizar la detección de desviaciones para identificar los recursos de pila en los que se han introducido cambios de configuración fuera de la administración de CloudFormation. Después podrá adoptar las medidas correctivas adecuadas para que los recursos de la pila vuelvan a estar sincronizados con sus definiciones en la plantilla de pila; por ejemplo, puede actualizar los recursos con desviaciones directamente para que concuerden con su definición en la plantilla. Solucionar las desviaciones ayuda a garantizar la coherencia de la configuración y la correcta ejecución de las operaciones de pila.

**Topics**
+ [¿Qué es una desviación?](#what-is-drift)
+ [Códigos de estado de detección de desviaciones](#drift-status-codes)
+ [Consideraciones a tener en cuenta cuando se detectan desviaciones](#drift-considerations)
+ [Detección de desviaciones en una pila de CloudFormation completa](detect-drift-stack.md)
+ [Detección de desviaciones en recursos de la pila individuales](detect-drift-resource.md)
+ [Resolver desviaciones con una operación de importación](resource-import-resolve-drift.md)

## ¿Qué es una desviación?
<a name="what-is-drift"></a>

La detección de desviaciones le permite detectar si la configuración real de la pila es diferente o se ha *desviado* de su configuración esperada. CloudFormation se utiliza para detectar las desviaciones en una pila completa o en recursos individuales dentro de la pila. Se considera que un recurso se ha desviado si alguno de sus valores de propiedad reales son diferentes de los valores de propiedad esperados. Esto incluye la eliminación de la propiedad o el recurso. Se considera que una pila se ha desviado si uno o varios de sus recursos se han desviado.

Con el fin de determinar si un recurso se ha desviado, CloudFormation determina los valores de propiedades de recursos esperados, tal y como están definidos en la plantilla de la pila y los valores especificados como los parámetros de la plantilla. A continuación, CloudFormation compara los valores esperados con los valores reales de esas propiedades de recursos, tal y como son actualmente en la pila. Se considera que un recurso se ha desviado si una o varias de sus propiedades se han eliminado o si el valor de las propiedades ha cambiado.

CloudFormation genera información detallada sobre cada recurso de la pila que se ha desviado.

CloudFormation detecta las desviaciones en los recursos de AWS que admiten la detección de desviaciones. A los recursos que no admiten dicha detección se les asigna un estado de desviación NOT\$1CHECKED. Para obtener una lista de AWS los recursos que admiten la detección de desviaciones, consulte [Tipo de recurso compatible](resource-import-supported-resources.md).

Además, CloudFormation admite detección de desviaciones en tipos de recursos privados que son *provisionables*; es decir, cuyo tipo de aprovisionamiento es `FULLY_MUTABLE` o `IMMUTABLE`. Para realizar la detección de desviaciones en un recurso de tipo privado, la versión predeterminada del tipo de recurso que ha registrado en la cuenta debe ser provisionable. Para obtener más información sobre tipos de aprovisionamiento de recursos, consulte el parámetro `ProvisioningType` de la acción [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html) en la *Referencia API de AWS CloudFormation * y del comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html) en la *Referencia del comando AWS CLI*. Para obtener más información acerca de los recursos privados, consulte [Administración de extensiones a través del registro de CloudFormation](registry.md).

Puede ejecutar la detección de desviaciones en pilas que tengan los siguientes estados: `CREATE_COMPLETE`, `UPDATE_COMPLETE`, `UPDATE_ROLLBACK_COMPLETE` y `UPDATE_ROLLBACK_FAILED`.

Cuando detecta desviaciones en una pila, CloudFormation no detecta desviaciones en ninguna de las pilas anidadas que pertenecen a dicha pila. Para obtener más información, consulte [División de una plantilla en piezas reutilizables utilizando pilas anidadas](using-cfn-nested-stacks.md). En su lugar, puede iniciar una operación de detección de desviaciones directamente en la pila anidada.

**nota**  
CloudFormation determina únicamente las desviaciones de los valores de propiedades que se establecen explícitamente, ya sea a través de la plantilla de pila o especificando los parámetros de plantilla. No se incluyen los valores predeterminados de las propiedades de los recursos. Para que CloudFormation realice el seguimiento de una propiedad de recurso para determinar la desviación, defina de forma explícita el valor de la propiedad, aunque lo configure en el valor predeterminado.

## Códigos de estado de detección de desviaciones
<a name="drift-status-codes"></a>

En las tablas de esta sección se describen los distintos tipos de estado que se utilizan para la detección de desviaciones:
+ En **Estado de operación de detección de desviación** se describe el estado actual de la operación de desviación.
+ **Estado de desviación** 

  Para los conjuntos de pila, esto describe el estado de desviación del conjunto de pila en su totalidad, en función del estado de desviación de las instancias de pila que le pertenecen.

  Para las instancias de pila, esto describe el estado de desviación de la instancia de pila, en función del estado de desviación de su pila asociada.

  Para las pilas, esto describe el estado de desviación de la pila en su conjunto, en función del estado de desviación de sus recursos.
+ En **Estado de desviación del recurso** se describe el estado de desviación de un recurso individual.

En la siguiente tabla se enumeran los códigos de estado que CloudFormation asigna a las operaciones de detección de desviaciones de pila.


| Estado de la operación de detección de desviaciones | Descripción | 
| --- | --- | 
|  `DETECTION_COMPLETE`  |  La operación de detección de desviaciones de la pila se ha realizado con éxito para todos los recursos de la pila que admiten la detección de desviaciones.  | 
|  `DETECTION_FAILED`  |  La operación de detección de desviaciones de la pila ha generado un error para un recurso de la pila como mínimo. Los resultados estarán disponibles para los recursos en los que CloudFormation ha completado correctamente la detección de desviaciones.  | 
|  `DETECTION_IN_PROGRESS`  |  La operación de detección de desviaciones de la pila está en curso actualmente.  | 

En la siguiente tabla se enumeran los códigos de estado de desviación que CloudFormation asigna a las pilas.


| Estado de desviación | Descripción | 
| --- | --- | 
|  `DRIFTED`  |  Para pilas: la pila difiere o se ha *desviado* de su configuración de plantilla prevista. Se considera que una pila se ha desviado si uno o varios de sus recursos se han desviado. Para instancias de pila: se considera que una instancia de pila se ha desviado si la pila asociada con ella se ha desviado. Para conjuntos de pila: se considera que un conjunto de pila se ha desviado si una o más instancias de pila se han desviado.  | 
|  `NOT_CHECKED`  |  CloudFormation no ha comprobado si la pila, el conjunto de pila o la instancia de pila difiere de su configuración de plantilla esperada.  | 
|  `IN_SYNC`  |  La configuración actual de cada recurso admitido coincide con su configuración de plantilla prevista. Una pila, un conjunto de pila o una instancia de pila sin recursos que admitan la detección de desviación también tendrá un estado de IN\$1SYNC.  | 

En la siguiente tabla se enumeran los códigos de estado de desviación que CloudFormation asigna a los recursos de pila.


| Estado de desviación de recursos | Descripción | 
| --- | --- | 
|  `DELETED`  |  El recurso difiere de la configuración de plantilla prevista ya que se ha eliminado el recurso.  | 
|  `MODIFIED`  |  El recurso difiere de su configuración de plantilla prevista.  | 
|  `NOT_CHECKED`  |  CloudFormation no ha comprobado si el recurso difiere de su configuración de plantilla prevista.  | 
|  `IN_SYNC`  |  La configuración actual del recurso coincide con su configuración de plantilla prevista.  | 

En la tabla siguiente se muestran los códigos de estado del tipo diferencia que CloudFormation asigna a las propiedades de los recursos que difieren de su configuración de plantilla prevista.


| Tipos de diferencia de propiedad | Descripción | 
| --- | --- | 
|  `ADD`  |  Se ha agregado un valor a una propiedad de recurso que es un tipo de datos lista o matriz.   | 
|  `REMOVE`  |  La propiedad se ha eliminado de la configuración de recursos actual.  | 
|  `NOT_EQUAL`  |  El valor de propiedad actual difiere de su valor esperado tal y como se define en la plantilla de pila.  | 

## Consideraciones a tener en cuenta cuando se detectan desviaciones
<a name="drift-considerations"></a>

Con el fin de realizar correctamente una detección de desviaciones en una pila, el usuario debe tener los siguientes permisos:
+ Permiso de lectura para cada recurso que admite la detección de desviaciones incluida en la pila. Por ejemplo, si la pila incluye un recurso `AWS::EC2::Instance`, debe disponer de permiso `ec2:DescribeInstances` para realizar una detección de desviaciones en la pila.
+ `cloudformation:DetectStackDrift`
+ `cloudformation:DetectStackResourceDrift`
+ `cloudformation:BatchDescribeTypeConfigurations`

Para más información acerca de cómo establecer permisos en CloudFormation, consulte [Control del acceso a CloudFormation con AWS Identity and Access Management](control-access-with-iam.md).

En algunos casos de borde, es posible que CloudFormation no pueda devolver siempre resultados de desviaciones precisos. Debe tener en cuenta estos casos de límite para interpretar correctamente sus resultados de detección de desviaciones.
+ En algunos casos los objetos contenidos en matrices de propiedades se indican como desviaciones, cuando en realidad son valores predeterminados suministrados a la propiedad desde el servicio subyacente responsable del recurso.
+ Algunos recursos tienen relaciones de asociación con recursos relacionados, de forma que un recurso en realidad pueda asociar o eliminar valores de otro recurso que esté definido en la misma plantilla o en otra. Por ejemplo, los recursos `AWS::EC2::SecurityGroupIngress` y `AWS::EC2::SecurityGroupEgress` se pueden utilizar para asociar y eliminar valores de recursos `AWS::EC2::SecurityGroup`. En estos casos CloudFormation analiza la plantilla de la pila para detectar asociaciones antes de realizar la comparación de desviación. Sin embargo, CloudFormation no puede realizar este análisis en varias pilas, por lo que es posible que no devuelva resultados precisos de desviaciones cuando los recursos asociados residan en diferentes pilas.

  Los recursos que admiten detección de desviaciones y permiten o requieren asociaciones de otros recursos son:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)
+ CloudFormation no realiza una detección de desviaciones en la propiedad `KMSKeyId` de los recursos. Dado que varios alias pueden hacer referencia a las claves de AWS KMS, CloudFormation no puede garantizar resultados de desviaciones precisos coherentes para esta propiedad.
+ Existen algunas propiedades de recursos que puede especificar en su plantilla de pila y que, debido a su propia naturaleza, CloudFormation no puede comparar con las propiedades de los recursos de pila obtenidos. Por lo tanto, estas propiedades no se pueden incluir en los resultados de detección de las desviaciones. Dichas propiedades se dividen en dos amplias categorías:
  + Valores de propiedades que CloudFormation no puede asignar de nuevo a su valor inicial de propiedad de recurso en la plantilla de la pila.

    Por ejemplo, CloudFormation no puede volver a asignar un código fuente de una función de Lambda al tipo de propiedad [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html) del recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) y, por lo tanto, CloudFormation no puede incluirlo en los resultados de detección de desviaciones. 
  + Los valores de propiedades que el servicio responsable del recurso no devuelve.

    Existen determinados valores de propiedades que, por diseño, el servicio al que pertenece el recurso nunca devuelve. Se trata de valores que tienden a contener información confidencial, como contraseñas u otro tipo de información confidencial, que no debe estar expuesta. Por ejemplo, el servicio IAM nunca devuelve el valor de la propiedad `Password` del tipo de propiedad [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) de usuario de IAM y, por lo tanto, CloudFormation no puede incluirlo en los resultados de detección de desviaciones.
  + Es posible que los objetos de una matriz sean en realidad valores predeterminados del servicio y no desviaciones agregadas manualmente.
+ Si encuentra algún falso positivo, envíenos sus comentarios mediante el enlace de comentarios de la consola de CloudFormation o póngase en contacto con nosotros a través de [AWS re:Post](https://repost.aws/).
+ Algunas propiedades pueden tener valores de entrada iguales, pero no idénticos. Para evitar falsos positivos, debe asegurarse de que la configuración esperada coincida con la configuración real.
  + Por ejemplo, la configuración esperada de la propiedad de recurso puede ser de 1024 MB y la configuración real de la misma propiedad de recurso puede ser de 1 GB. 1024 MB y 1 GB son iguales, pero no idénticos.

    Cuando se ejecuta la detección de desviaciones en esta propiedad de recurso, indicará los resultados de las desviaciones.

    Para evitar este falso positivo, cambie la configuración esperada de la propiedad del recurso a 1024 MB y, a continuación, ejecute la detección de desviaciones.

# Detección de desviaciones en una pila de CloudFormation completa
<a name="detect-drift-stack"></a>

La realización de una operación de detección de desviaciones en una pila determina si la pila se ha desviado de su configuración de plantilla prevista y permite devolver información detallada sobre el estado de la desviación de cada recurso de la pila que admite la detección de desviaciones.

**Para detectar desviaciones en una pila completa con la Consola de administración de AWS**

1. Abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la lista de pilas, seleccione la pila en la que desea detectar desviaciones. En el panel de detalles de la pila, elija **Stack actions (Acciones de pila)** y, a continuación, seleccione **Detect drift (Detectar desviación)**.  
![\[El comando de detección de desviaciones para la pila actual seleccionado en el menú Actions (Acciones) de la pila seleccionada.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/console-stacks-actions-detect-drift-1.png)

   CloudFormation muestra una barra de información que indica que se ha iniciado la detección de desviaciones en la pila seleccionada.

1. Espere hasta que CloudFormation complete la operación de detección de desviaciones. Cuando la operación de detección de desviaciones finaliza, CloudFormation actualiza **Drift status (Estado de desviaciones)** y **Last drift check time (Último momento de comprobación de desviaciones)** para la pila. Estos campos se enumeran en la sección **Overview (Información general)** del panel **Stack info (Información de pila)** de la página de detalles de pila.

   La operación de detección de desviaciones puede tardar varios minutos, según la cantidad de recursos que contiene la pila. Solo puede ejecutar una única operación de detección de desviaciones en una pila determinada al mismo tiempo. CloudFormation continúa con la operación de detección de desviaciones incluso después de cerrar la barra de información.

1. Revise los resultados de la detección de desviaciones de la pila y sus recursos. Con la pila seleccionada, desde el menú desviaciones de acciones **Stack actions (Acciones de pila)**, seleccione **View drift results (Ver resultados de desviaciones)**.

   CloudFormation muestra el estado de las desviaciones en general de la pila, además de la última vez en que se inició la detección de desviaciones en la pila o en cualquiera de sus recursos individuales. Se considera que una pila se ha desviado si uno o varios de sus recursos se han desviado.  
![\[La página Drift (Desviaciones) de la pila seleccionada, en la que se muestra el estado de desviación de la pila en general, el estado de la detección de desviaciones y la última vez en que se inició la detección de desviaciones en la pila o cualquiera de sus recursos individuales.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-overview-1.png)

   En la sección **Resource drift details (Detalles de las desviaciones de recursos)**, CloudFormation genera una lista de cada recurso de pila, su estado de desviación y la última vez que se inició la detección de desviaciones en ese recurso. El ID lógico y el ID físico de cada recurso se muestra para ayudarle a identificarlos. Además, en el caso de los recursos con el estado **MODIFIED**, CloudFormation muestra los detalles de la desviación del recurso.

   Puede ordenar los recursos en función de su estado mediante la columna **Drift status (Estado de desviación )**.

   1. Para ver los detalles en un recurso modificado.

     1. Con el recurso modificado seleccionado, elija **View drift details (Ver detalles de desviación)**.

       CloudFormation muestra la página de detalles de desviación de ese recurso. La página muestra los valores de propiedades actuales y previstos del recurso, así como las diferencias entre los dos.

       Para resaltar una diferencia, en la sección **Differences (Diferencias)**, seleccione el nombre de la propiedad.
       + Las propiedades agregadas se resaltan en verde en la columna **Current (Actual)** de la sección **Details (Detalles)**.
       + Las propiedades eliminadas están marcadas en rojo en la columna **Expected (Previsto)** de la sección **Details (Detalles)**.
       + Las propiedades cuyo valor ha cambiado aparecen resaltadas en amarillo en las columnas **Previsto** y **Current (Actual)**.  
![\[La sección Estado de desviación de los recursos de la página Detalles de desviación, que contiene información sobre la desviación de cada recurso de la pila que admite la detección de desviaciones. Los detalles incluyen el estado de las desviaciones y los valores de propiedades actuales y previstos.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-drift-details-differences-1.png)

**Para detectar desviaciones en una pila completa con la AWS CLI**
**importante**  
Revise la **Hora de la última verificación de desviación** de la pila y confirme que sea anterior a la marca de tiempo que aparece en los resultados de desviación del recurso, para evitar el uso de datos obsoletos.

Para detectar desviaciones en una pila completa a través de la AWS CLI, utilice los siguientes comandos de AWS CLI:
+ **detect-stack-drift** para iniciar una operación de detección de desviaciones en una pila.
+ **describe-stack-drift-detection-status** para monitorizar el estado de operación de detección de desviaciones de la pila.
+ **describe-stack-resource-drifts** para revisar los detalles de la operación de detección de desviaciones de la pila.

1. Use la **detect-stack-drift** para detectar desviaciones en una pila completa. Especifique el nombre de pila o ARN. También puede especificar los ID lógicos de los recursos específicos que desee utilizar como filtros para esta operación de detección de desviaciones de filtros.

   ```
   aws cloudformation detect-stack-drift --stack-name my-stack-with-resource-drift
   ```

   Salida:

   ```
   {
       "StackDriftDetectionId": "624af370-311a-11e8-b6b7-500cexample"
   }
   ```

1. Debido a que las operaciones de detección de desviaciones de pila pueden mantenerse durante mucho tiempo, utilice **describe-stack-drift-detection-status** para monitorizar el estado de operación de desviaciones. Este comando toma el ID de detección de desviaciones de la pila que el comando **detect-stack-drift** devuelve.

   En el ejemplo siguiente hemos tomado el ID de detección de desviaciones de la pila devuelto por el ejemplo de **detect-stack-drift** anterior y lo hemos transferido a **describe-stack-drift-detection-status**. El parámetro devuelve detalles de operación que muestran que la operación de detección de desviaciones se ha completado, un solo recurso de la pila se ha desviado y que, por tanto, se considera que toda la pila se ha desviado.

   ```
   aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
   ```

   Salida:

   ```
   {
       "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
       "StackDriftDetectionId": "624af370-311a-11e8-b6b7-500cexample", 
       "StackDriftStatus": "DRIFTED", 
       "Timestamp": "2018-03-26T17:23:22.279Z", 
       "DetectionStatus": "DETECTION_COMPLETE", 
       "DriftedStackResourceCount": 1
   }
   ```

1. Cuando la operación de detección de desviaciones de la pila se haya completado, utilice el comando **describe-stack-resource-drifts** para revisar los resultados, incluidos los valores de propiedades reales y previstos para los recursos que se han desviado.

   En el ejemplo siguiente se utiliza la opción `--stack-resource-drift-status-filters` para pedir información sobre las desviaciones de la pila para los recursos que se han modificado o se han eliminado. La solicitud devuelve información sobre el recurso que se ha modificado, como los detalles sobre dos de sus propiedades cuyos valores se han cambiado. No se ha eliminado ningún recurso.

   ```
   aws cloudformation describe-stack-resource-drifts --stack-name my-stack-with-resource-drift --stack-resource-drift-status-filters MODIFIED DELETED
   ```

   Salida:

   ```
   {
       "StackResourceDrifts": [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
               "ActualProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":120,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":12},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
               "ResourceType": "AWS::SQS::Queue", 
               "Timestamp": "2018-03-26T17:23:34.489Z", 
               "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/099908667365/my-stack-with-resource-drift-Queue-494PBHCO76H4", 
               "StackResourceDriftStatus": "MODIFIED", 
               "ExpectedProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":10},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
               "PropertyDifferences": [
                   {
                       "PropertyPath": "/DelaySeconds", 
                       "ActualValue": "120", 
                       "ExpectedValue": "20", 
                       "DifferenceType": "NOT_EQUAL"
                   }, 
                   {
                       "PropertyPath": "/RedrivePolicy/maxReceiveCount", 
                       "ActualValue": "12", 
                       "ExpectedValue": "10", 
                       "DifferenceType": "NOT_EQUAL"
                   }
               ], 
               "LogicalResourceId": "Queue"
           }
       ]
   }
   ```

# Detección de desviaciones en recursos de la pila individuales
<a name="detect-drift-resource"></a>

Puede detectar desviaciones en recursos específicos de una pila, en lugar de toda la pila. Esto resulta especialmente útil cuando solo necesita determinar si ahora recursos específicos vuelven a coincidir con sus configuraciones de plantilla previstas.

Al realizar la detección de desviaciones en un recurso, CloudFormation también actualiza el estado de las desviaciones de la pila en general y la **última hora de comprobación de las desviaciones**, si es aplicable. Por ejemplo, supongamos que una pila tiene un estado de desviación de `IN_SYNC`. Hace que CloudFormation detecte desviaciones en uno o varios recursos contenidos en dicha pila y CloudFormation detecta que uno o varios de esos recursos se han desviado. CloudFormation actualiza el estado de desviación de la pila a `DRIFTED`. Por el contrario, supongamos que tiene una pila con un estado de desviaciones `DRIFTED`debido a un único recurso desviado. Si vuelve a establecer dicho recurso en sus valores de propiedades previstos y después vuelve a detectar desviaciones en dicho recurso, CloudFormation actualizará el estado de desviación de recurso y el estado de desviación de pila a `IN_SYNC` sin que sea preciso detectar la desviación en toda la pila de nuevo.

**Para detectar desviaciones en un recurso individual con la Consola de administración de AWS**

1. Abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la lista de pilas, seleccione la pila que contiene el recurso. CloudFormation muestra los detalles de la pila.

1. En el panel de navegación izquierdo, en **Pilas**, elija **Acciones de pila** y, a continuación, elija **Detectar desviación**.

1. En **Resource drift status (Estado de desviación de recurso)**, elija el recurso y, a continuación, seleccione **Detect drift for resource (Detectar desviación de recurso)**.

   CloudFormation realiza la detección de desviaciones en el recurso seleccionado. Si se ejecuta correctamente, CloudFormation actualiza el estado de la desviación del recurso y el estado de la desviación de la pila en general, si es necesario. CloudFormation también actualiza la marca temporal de la última vez que se ejecutó una detección de desviaciones en el recurso y la pila en su conjunto. Si el recurso se ha modificado, CloudFormation muestra información detallada de la desviación de los valores de propiedades actuales y previstos del recurso.

1. Revise los resultados de la detección de desviaciones del recurso.

   1. Para ver los detalles en un recurso modificado.

     1. Con el recurso modificado seleccionado, elija **View drift details (Ver detalles de desviación)**.

       CloudFormation muestra los detalles de desviación del recurso, incluidos los valores de las propiedades actuales y previstas del recurso y las diferencias entre los dos.

       Para resaltar una diferencia, en la sección **Differences (Diferencias)**, seleccione el nombre de la propiedad.
       + Las propiedades agregadas se resaltan en verde en la columna **Current (Actual)** de la sección **Details (Detalles)**.
       + Las propiedades eliminadas están marcadas en rojo en la columna **Expected (Previsto)** de la sección **Details (Detalles)**.
       + Las propiedades cuyo valor ha cambiado aparecen resaltadas en amarillo en las columnas **Previsto** y **Current (Actual)**.  
![\[La sección Estado de desviación de los recursos de la página Detalles de desviación, que contiene información sobre la desviación de cada recurso de la pila que admite la detección de desviaciones. Los detalles incluyen el estado de las desviaciones y los valores de propiedades actuales y previstos.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/console-stacks-drifts-drift-details-differences-1.png)

**Para detectar desviaciones en un recurso individual con la AWS CLI**
+ 
**importante**  
Revise la **Hora de la última verificación de desviación** del recurso de pila y confirme que sea anterior a la marca de tiempo que aparece en los resultados de desviación del recurso, para evitar el uso de datos obsoletos.

  Para detectar desviaciones en un recurso individual con la AWS CLI, ejecute el comando **detect-stack-resource-drift**. Especifique el ID lógico del recurso, así como la pila en la que se encuentra.

  En el siguiente ejemplo se ejecuta una operación de detección de desviaciones en recursos específicos de una pila, `my-drifted-resource`. La respuesta devuelve información que confirma que el recurso se ha modificado, como los detalles sobre dos de sus propiedades cuyos valores se han cambiado.

  ```
  aws cloudformation detect-stack-resource-drift \
      --stack-name my-stack-with-resource-drift \
      --logical-resource-id my-drifted-resource
  ```

  Salida:

  ```
  {
      "StackResourceDrift": {
          "StackId": "arn:aws:cloudformation:us-east-1:099908667365:stack/my-stack-with-resource-drift/489e5570-df85-11e7-a7d9-50example", 
          "ActualProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":120,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":12},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
          "ResourceType": "AWS::SQS::Queue", 
          "Timestamp": "2018-03-26T18:54:28.462Z", 
          "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/099908667365/my-stack-with-resource-drift-Queue-494PBHCO76H4", 
          "StackResourceDriftStatus": "MODIFIED", 
          "ExpectedProperties": "{\"ReceiveMessageWaitTimeSeconds\":0,\"DelaySeconds\":20,\"RedrivePolicy\":{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:099908667365:my-stack-with-resource-drift-DLQ-1BCY7HHD5QIM3\",\"maxReceiveCount\":10},\"MessageRetentionPeriod\":345600,\"MaximumMessageSize\":262144,\"VisibilityTimeout\":60,\"QueueName\":\"my-stack-with-resource-drift-Queue-494PBHCO76H4\"}", 
          "PropertyDifferences": [
              {
                  "PropertyPath": "/DelaySeconds", 
                  "ActualValue": "120", 
                  "ExpectedValue": "20", 
                  "DifferenceType": "NOT_EQUAL"
              }, 
              {
                  "PropertyPath": "/RedrivePolicy/maxReceiveCount", 
                  "ActualValue": "12", 
                  "ExpectedValue": "10", 
                  "DifferenceType": "NOT_EQUAL"
              }
          ], 
          "LogicalResourceId": "my-drifted-resource"
      }
  }
  ```

# 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
```

------