Anidamiento de una pila existente - AWS CloudFormation

Anidamiento de una pila existente

Utilice la función resource import para anidar una pila existente dentro de otra pila existente. Las pilas anidadas son componentes comunes a los que se declara y hace referencia desde otras plantillas. De esta forma, puede evitar copiar y pegar las mismas configuraciones en sus plantillas y simplificar las actualizaciones de pilas. Si tiene una plantilla para un componente común, puede utilizar el recurso AWS::CloudFormation::Stack para hacer referencia a esta plantilla desde otra plantilla. Para obtener más información sobre las pilas anidadas, consulte Uso de pilas anidadas.

AWS CloudFormation solo admite un nivel de uso de anidamiento utilizando resource import. Esto significa que no puede importar una pila a una pila secundaria ni importar una pila que tenga secundarias.

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.

Validación de importación de pila anidada

Durante una operación de importación de pila anidada, AWS CloudFormation realiza las siguientes validaciones.

  • La definición anidada AWS::CloudFormation::Stack en la plantilla de pila principal coincide con la plantilla de la pila anidada real.

  • Las etiquetas de la definición anidada AWS::CloudFormation::Stack en la plantilla de pila principal coinciden con las etiquetas del recurso de pila anidado real.

Anidar una pila existente mediante la AWS Management Console

  1. Agregue el recurso AWS::CloudFormation::Stack a la plantilla de pila principal con una Retain DeletionPolicy. En el siguiente plantilla de pila principal de ejemplo, MyNestedStack es el destino de la importación.

    JSON

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "ServiceTable":{ "Type":"AWS::DynamoDB::Table", "Properties":{ "TableName":"Service", "AttributeDefinitions":[ { "AttributeName":"key", "AttributeType":"S" } ], "KeySchema":[ { "AttributeName":"key", "KeyType":"HASH" } ], "ProvisionedThroughput":{ "ReadCapacityUnits":5, "WriteCapacityUnits":1 } } }, "MyNestedStack" : { "Type" : "AWS::CloudFormation::Stack", "DeletionPolicy": "Retain", "Properties" : { "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template", "Parameters" : { "InstanceType" : "t1.micro", "KeyName" : "mykey" } } } } }

    YAML

    AWSTemplateFormatVersion: 2010-09-09 Resources: ServiceTable: Type: 'AWS::DynamoDB::Table' Properties: TableName: Service AttributeDefinitions: - AttributeName: key AttributeType: S KeySchema: - AttributeName: key KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 1 MyNestedStack: Type: 'AWS::CloudFormation::Stack' DeletionPolicy: Retain Properties: TemplateURL: >- https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template Parameters: InstanceType: t1.micro KeyName: mykey
  2. Abra la consola de AWS CloudFormation.

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

  5. En la página Specify template (Especificar plantilla), proporcione la plantilla principal actualizada mediante uno de los métodos siguientes y, a continuación, elija Next (Siguiente).

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

  6. En la página Identify resources (Identificar recursos), identifique el recurso AWS::CloudFormation::Stack.

    1. En Propiedad del identificador, elija el tipo de identificador de recurso. Por ejemplo, un recurso AWS::CloudFormation::Stack se puede identificar mediante la propiedad StackId.

    2. En Valor del identificador, escriba el ARN de la pila que va a importar. Por ejemplo, arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10.

      La página Identificar recursos en la consola.
    3. Elija Siguiente.

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

  8. En la página Revisar MyParentStack, confirme que se está importando el recurso correcto y, a continuación, elija Importar recursos. Esto ejecuta 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.

  9. 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 estaba administrado por AWS CloudFormation.

Anidar una pila existente mediante la AWS CLI

  1. Agregue el recurso AWS::CloudFormation::Stack a la plantilla de pila principal con una Retain DeletionPolicy. En el siguiente ejemplo, la plantilla principal MyNestedStack es el destino de la importación.

    JSON

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "ServiceTable":{ "Type":"AWS::DynamoDB::Table", "Properties":{ "TableName":"Service", "AttributeDefinitions":[ { "AttributeName":"key", "AttributeType":"S" } ], "KeySchema":[ { "AttributeName":"key", "KeyType":"HASH" } ], "ProvisionedThroughput":{ "ReadCapacityUnits":5, "WriteCapacityUnits":1 } } }, "MyNestedStack" : { "Type" : "AWS::CloudFormation::Stack", "DeletionPolicy": "Retain", "Properties" : { "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template", "Parameters" : { "InstanceType" : "t1.micro", "KeyName" : "mykey" } } } } }

    YAML

    AWSTemplateFormatVersion: 2010-09-09 Resources: ServiceTable: Type: 'AWS::DynamoDB::Table' Properties: TableName: Service AttributeDefinitions: - AttributeName: key AttributeType: S KeySchema: - AttributeName: key KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 1 MyNestedStack: Type: 'AWS::CloudFormation::Stack' DeletionPolicy: Retain Properties: TemplateURL: >- https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template Parameters: InstanceType: t1.micro KeyName: mykey
  2. Componga una cadena JSON tal como se muestra en el siguiente ejemplo, con estas modificaciones:

    • Sustituya MyNestedStack por el ID lógico del recurso de destino tal como se especifica en la plantilla.

    • Sustituya arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10 por el ARN de la pila que desee importar.

    [{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-east-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]

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

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

    JSON

    [ { "ResourceType":"AWS::CloudFormation::Stack", "LogicalResourceId":"MyNestedStack", "ResourceIdentifier": { "StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10" } } ]

    YAML

    ResourceType: 'AWS::CloudFormation::Stack' LogicalResourceId: MyNestedStack ResourceIdentifier: StackId: >- arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10
  3. 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 MyParentStack --change-set-name ImportChangeSet \ --change-set-type IMPORT \ --template-body file://TemplateToImport.json \ --resources-to-import '[{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]'
    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

    Si se ejecuta correctamente, este comando devuelve la siguiente salida de muestra.

    { "Id": "arn:aws:cloudformation:us-west-2:12345678910:changeSet/ImportChangeSet/8ad75b3f-665f-46f6-a200-0b4727a9442e", "StackId": "arn:aws:cloudformation:us-west-2:12345678910:stack/MyParentStack/4e345b70-1281-11ef-b027-027366d8e82b" }
  4. Revise el conjunto de cambios para asegurarse de que se está importando la pila correcta.

    $ aws cloudformation describe-change-set --change-set-name ImportChangeSet
  5. Para iniciar el conjunto de cambios e importar la pila a la pila principal de origen, 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 completada correctamente la operación de importación (IMPORT_COMPLETE), la pila se anidará correctamente.

    $ aws cloudformation execute-change-set --change-set-name ImportChangeSet
    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.