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.

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 Next (Siguiente).

    6. En la página Review stack_name (Revisar nombre_pila), 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 Import resources into stack (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, haga clic en Next.

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

      1. En Identifier property (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 Identifier value (Valor del identificador), escriba el valor de la propiedad real. Por ejemplo, GamesTables.

        
                        La página Identify resources (Identificar recursos) en la consola.
      3. Elija Next (Siguiente).

    5. En la página Specify stack details (Especificar detalles de pila) modifique los parámetros y, a continuación, elija Next (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 Review stack-name (Revisar nombre-pila), confirme que se está importando el recurso correcto y, a continuación, elija Import resources (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 Events (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 "source-stack-name"
  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 "source-stack-name"
  5. Cree un conjunto de cambios de tipo IMPORT con los siguientes parámetros. --resources-to-import no es compatible con YAML en línea.

    >aws cloudformation create-change-set --stack-name TargetStack --change-set-name ImportChangeSet --change-set-type IMPORT --resources-to-import "[{\"ResourceType\":\"AWS::DynamoDB::Table\",\"LogicalResourceId\":\"GamesTable\",\"ResourceIdentifier\":{\"TableName\":\"Games\"}}]" --template-body file://templateToImport.json

    La AWS CLI también admite archivos de texto como entrada para el parámetro resources-to-import, como se muestra en el ejemplo anterior.

    --resources-to-import file://resourcesToImport.txt

    En este tutorial, file://resourcesToImport.txt contiene lo siguiente.

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
  6. 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
  7. Ejecute el conjunto de cambios para importar el recurso a la pila de destino. 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.