

# Mover recursos entre pilas
<a name="refactor-stacks"></a>

Con la característica `resource import`, puede mover recursos entre pilas o *refactorizar* pilas. En primer lugar, debe agregar una política de eliminación `Retain` al recurso que desea mover para asegurarse de que el recurso se conserva al eliminarlo de la pila de origen e importarlo a la pila de destino.

Si es nuevo en la importación, le recomendamos que primero revise la información introductoria del tema [Cómo importar recursos de AWS a una pila de CloudFormation](import-resources.md).

**importante**  
No todos los recursos admiten operaciones de importación. Consulte [Recursos que admiten operaciones de importación](resource-import-supported-resources.md) antes de eliminar un recurso de la pila. Si elimina un recurso que no admite operaciones de importación de su pila, no puede importar el recurso a otra pila ni devolverlo a la pila de origen.

## Refactorización de una pila mediante la Consola de administración de AWS
<a name="refactor-stacks-console"></a>

1. En la plantilla de origen, especifique una `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) para el recurso que desea mover.

   En la siguiente plantilla de origen de ejemplo, `Games` es el destino de esta refactorización.  
**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"
                    }
                 ],
                 "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"
                       }
                   ],
                   "ProvisionedThroughput": {
                       "ReadCapacityUnits": 5,
                       "WriteCapacityUnits": 1
                   }
               }
           }
       }
   }
   ```

1. Abra la consola de CloudFormation para realizar una actualización de la pila y aplicar la política de eliminación.

   1. En la página **Stacks (Pilas)** con la pila seleccionada, elija **Update (Actualizar)**.

   1. En **Preparar plantilla**, elija **Reemplazar la plantilla actual**.

   1. En **Specify template (Especificar plantilla)**, proporcione la plantilla de origen actualizada con el atributo `DeletionPolicy` en `GamesTable` y, a continuación, elija **Next (Siguiente)**.
      + Elija **Amazon S3 URL (URL de Amazon S3)** y, a continuación, especifique la URL de la plantilla de origen actualizada en el cuadro de texto.
      + Elija **Upload a template file (Cargar un archivo de plantilla)** y, a continuación, busque el archivo de la plantilla de origen actualizada.

   1. En la página **Specify stack details (Especificar detalles de pila)** no se requieren cambios. Elija **Next** (Siguiente).

   1. La página **Configure stack options (Configurar opciones de pila)**, no precisa cambios. Elija **Siguiente**.

   1. En la página **Revisar *SourceStackName***, revise los cambios. Si la plantilla contiene recursos de IAM, seleccione **I acknowledge that this template may create IAM resources (Confirmo que esta plantilla pueda crear recursos de IAM)** para especificar que desea utilizar recursos de IAM en la plantilla. Para obtener más información sobre recursos de IAM en plantillas, consulte [Control del acceso a CloudFormation con AWS Identity and Access Management](control-access-with-iam.md). A continuación, actualice la pila de origen mediante la creación de un conjunto de cambios o actualice la pila de origen directamente.

1. Elimine el recurso, los parámetros relacionados y las salidas de la plantilla de origen y, a continuación, agréguelos a la plantilla de destino.

   La plantilla de origen ahora 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"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           }
       }
   }
   ```

   La siguiente plantilla de destino de ejemplo tiene actualmente el recurso `PlayersTable` y ahora también contiene `GamesTable`.  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "PlayersTable": {
               "Type": "AWS::DynamoDB::Table",
               "Properties": {
                   "TableName": "Players",
                   "AttributeDefinitions": [
                       {
                           "AttributeName": "key",
                           "AttributeType": "S"
                       }
                   ],
                   "KeySchema": [
                       {
                           "AttributeName": "key",
                           "KeyType": "HASH"
                       }
                   ],
                   "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"
                       }
                   ],
                   "ProvisionedThroughput": {
                       "ReadCapacityUnits": 5,
                       "WriteCapacityUnits": 1
                   }
               }
           }
       }
   }
   ```

1. Repita los pasos 2 y 3 para actualizar la pila de origen de nuevo, esta vez con el fin de eliminar el recurso de destino de la pila.

1. Realice una operación de importación para agregar `GamesTable` a la pila de destino.

   1. En la página **Stacks (Pilas)**, con la pila principal seleccionada, elija **Stack actions (Acciones de pila)** y, a continuación, elija **Import resources into stack (Importar recursos a 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. Lea la página de **información general sobre la importación** para obtener una lista de los elementos que debe proporcionar durante esta operación. A continuación, elija **Siguiente**.

   1. En la página **Specify template** (Especificar plantilla) haga una de las siguientes acciones y, a continuación, elija **Next** (Siguiente).
      + Elija **Amazon S3 URL (URL de Amazon S3)** y, a continuación, especifique la URL en el cuadro de texto.
      + Elija **Upload a template file (Cargar un archivo de plantilla)** y, a continuación, busque el archivo que se va a cargar.

   1. En la página **Identify resources (Identificar recursos)**, identifique el recurso que va a mover (en este ejemplo, `GamesTable`). 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, un recurso `AWS::DynamoDB::Table` se puede identificar mediante la propiedad `TableName`.

      1. En **Valor del identificador**, escriba el valor de la propiedad real. Por ejemplo, `GamesTables`. 

      1. Elija **Siguiente**.

   1. En la página **Especificar detalles de pila** modifique los parámetros y, a continuación, elija **Siguiente**. Esto crea automáticamente un conjunto de cambios.
**importante**  
La operación de importación produce un error si modifica parámetros que inician una operación de creación, actualización o eliminación.

   1. En la página **Revisar *TargetStackName***, confirme que se está importando el recurso correcto y, a continuación, elija **Importar recursos**. Esto inicia automáticamente el conjunto de cambios creado en el último paso. En este momento, se aplican todas las [etiquetas de nivel de pila](cfn-console-create-stack.md#configure-stack-options) a los recursos importados.

   1. Se muestra el panel **Events (Eventos)** de la página **Stack details (Detalles de la pila)** de la pila principal.  
![\[La pestaña Eventos de la consola.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/import-events.png)
**nota**  
No es necesario ejecutar la detección de desviación en la pila principal después de esta operación de importación porque el recurso `AWS::CloudFormation::Stack` ya está administrado por CloudFormation.

## Refactorización de una pila mediante la AWS CLI
<a name="refactor-stacks-cli"></a>

1. En la plantilla de origen, especifique una `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) para el recurso que desea mover.

   En la siguiente plantilla de origen de ejemplo, `GamesTable` es el destino de esta refactorización.  
**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"
                    }
                 ],
                 "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"
                       }
                   ],
                   "ProvisionedThroughput": {
                       "ReadCapacityUnits": 5,
                       "WriteCapacityUnits": 1
                   }
               }
           }
       }
   }
   ```

1. Actualice la pila de origen para aplicar la política de eliminación al recurso.

   ```
   aws cloudformation update-stack --stack-name SourceStackName
   ```

1. Elimine el recurso, los parámetros relacionados y las salidas de la plantilla de origen y, a continuación, agréguelos a la plantilla de destino.

   La plantilla de origen ahora 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"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           }
       }
   }
   ```

   La siguiente plantilla de destino de ejemplo tiene actualmente el recurso `PlayersTable` y ahora también contiene `GamesTable`.  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "PlayersTable": {
               "Type": "AWS::DynamoDB::Table",
               "Properties": {
                   "TableName": "Players",
                   "AttributeDefinitions": [
                       {
                           "AttributeName": "key",
                           "AttributeType": "S"
                       }
                   ],
                   "KeySchema": [
                       {
                           "AttributeName": "key",
                           "KeyType": "HASH"
                       }
                   ],
                   "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"
                       }
                   ],
                   "ProvisionedThroughput": {
                       "ReadCapacityUnits": 5,
                       "WriteCapacityUnits": 1
                   }
               }
           }
       }
   }
   ```

1. Actualice la pila de origen para eliminar el recurso (`GamesTable`) y sus parámetros y salidas relacionados de la pila.

   ```
   aws cloudformation update-stack --stack-name SourceStackName
   ```

1. Redacte una lista de recursos reales para importar y sus identificadores únicos en el siguiente formato de cadena JSON. Para obtener más información, consulte [Identificadores de recursos](import-resources-manually.md#resource-import-identifiers-unique-ids).

   ```
   [{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]
   ```

   Si lo desea, también puede especificar los parámetros con formato JSON en un archivo de configuración. 

   Por ejemplo, para importar `GamesTable`, puede crear un archivo *ResourcesToImport.txt* que contenga la siguiente configuración.

   ```
   [
     {
         "ResourceType":"AWS::DynamoDB::Table",
         "LogicalResourceId":"GamesTable",
         "ResourceIdentifier": {
           "TableName":"Games"
         }
     }
   ]
   ```

1. Para crear un conjunto de cambios, utilice el siguiente comando **create-change-set** y sustituya el texto del marcador de posición. Para la opción `--change-set-type`, especifique un valor de **IMPORT**. Para la opción `--resources-to-import`, reemplace la cadena JSON de muestra por la cadena JSON real que acaba de crear.

   ```
   aws cloudformation create-change-set \
       --stack-name TargetStackName --change-set-name ImportChangeSet \
       --change-set-type IMPORT \
       --template-body file://TemplateToImport.json \
       --resources-to-import "'[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]'"
   ```
**nota**  
`--resources-to-import` no es compatible con YAML insertado. Los requisitos para escapar las comillas en la cadena JSON varían dependiendo de su terminal. Para obtener más información, consulte [Using quotation marks inside strings](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-quoting-strings.html#cli-usage-parameters-quoting-strings-containing) en la *Guía del usuario de la AWS Command Line Interface*.

   Como alternativa, también puede usar la URL de un archivo como entrada para la opción `--resources-to-import`, tal como se muestra en el siguiente ejemplo.

   ```
   --resources-to-import file://ResourcesToImport.txt
   ```

1. Revise el conjunto de cambios para asegurarse de que se está importando el recurso correcto a la pila de destino.

   ```
   aws cloudformation describe-change-set \
       --change-set-name ImportChangeSet
   ```

1. Para iniciar el conjunto de cambios e importar el recurso, utilice el siguiente comando **execute-change-set** y sustituya el texto del marcador de posición. En este momento, se aplican todas las etiquetas de nivel de pila a los recursos importados. Una vez finalizada debidamente la operación `(IMPORT_COMPLETE)`, el recurso se importa correctamente.

   ```
   aws cloudformation execute-change-set \
       --change-set-name ImportChangeSet --stack-name TargetStackName
   ```
**nota**  
No es necesario ejecutar la detección de desviación en la pila de destino después de esta operación de importación porque el recurso ya está administrado por CloudFormation.