Mover recursos entre pilas - AWS CloudFormation

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

  1. 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 } } } } }
  2. Abra la consola de AWS 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).

    2. En Prepare template (Preparar plantilla), elija Replace current template (Reemplazar la plantilla actual).

    3. 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.

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

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

    6. 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.

  3. 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 contiene GamesTable.

    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 } } } } }
  4. 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.

  5. 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.
    2. 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.

    3. 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.

    4. 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.

      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.

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

      3. Elija Siguiente.

    5. 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.

    6. 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.

    7. 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.
      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

  1. 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 } } } } }
  2. Actualice la pila de origen para aplicar la política de eliminación al recurso.

    $ aws cloudformation update-stack --stack-name SourceStackName
  3. 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 contiene GamesTable.

    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 } } } } }
  4. 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
  5. 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 archivo ResourcesToImport.txt que contenga la siguiente configuración.

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
  6. 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 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
  7. 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
  8. 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 principal después de esta operación de importación porque el recurso ya está administrado por AWS CloudFormation.