Mover recursos entre pilas
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 Incorporación de los recursos existentes a la administración de CloudFormation.
importante
No todos los recursos admiten operaciones de importación. Consulte Recursos que admiten operaciones de importación 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 AWS Management Console
-
En la plantilla de origen, especifique una
Retain
DeletionPolicy para el recurso que desea mover.En la siguiente plantilla de origen de ejemplo,
Games
es el destino de esta refactorización.ejemplo 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 } } } } }
-
Abra la consola de AWS CloudFormation para realizar una actualización de la pila y aplicar la política de eliminación.
-
En la página Stacks (Pilas) con la pila seleccionada, elija Update (Actualizar).
-
En Prepare template (Preparar plantilla), elija Replace current template (Reemplazar la plantilla actual).
-
En Specify template (Especificar plantilla), proporcione la plantilla de origen actualizada con el atributo
DeletionPolicy
enGamesTable
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.
-
-
En la página Specify stack details (Especificar detalles de pila) no se requieren cambios. Elija Next (Siguiente).
-
La página Configure stack options (Configurar opciones de pila), no precisa cambios. Elija Siguiente.
-
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 con AWS Identity and Access Management. A continuación, actualice la pila de origen mediante la creación de un conjunto de cambios o actualice la pila de origen directamente.
-
-
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.
ejemplo 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 contieneGamesTable
.ejemplo 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 } } } } }
-
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.
-
Realice una operación de importación para agregar
GamesTable
a la pila de destino.-
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).
-
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.
-
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.
-
-
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.-
En Propiedad del identificador, elija el tipo de identificador de recurso. Por ejemplo, un recurso
AWS::DynamoDB::Table
se puede identificar mediante la propiedadTableName
. -
En Valor del identificador, escriba el valor de la propiedad real. Por ejemplo,
.GamesTables
-
Elija Siguiente.
-
-
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.
-
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 a los recursos importados. -
Se muestra el panel Events (Eventos) de la página Stack details (Detalles de la pila) de la pila principal.
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 AWS CloudFormation.
-
Refactorización de una pila mediante la AWS CLI
-
En la plantilla de origen, especifique una
Retain
DeletionPolicy para el recurso que desea mover.En la siguiente plantilla de origen de ejemplo,
GamesTable
es el destino de esta refactorización.ejemplo 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 } } } } }
-
Actualice la pila de origen para aplicar la política de eliminación al recurso.
$
aws cloudformation update-stack --stack-nameSourceStackName
-
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.
ejemplo 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 contieneGamesTable
.ejemplo 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 } } } } }
-
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-nameSourceStackName
-
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.
[{"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 archivoResourcesToImport.txt
que contenga la siguiente configuración.[ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
-
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 deIMPORT
. 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-nameTargetStackName
--change-set-nameImportChangeSet
\ --change-set-typeIMPORT
\ --template-bodyfile://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 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
-
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-nameImportChangeSet
-
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-nameImportChangeSet
--stack-nameTargetStackName
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 ya está administrado por AWS CloudFormation.