Aninhar uma pilha existente - AWS CloudFormation

Aninhar uma pilha existente

Use o recurso resource import para aninhar uma pilha existente em outra pilha existente. As pilhas aninhadas são componentes comuns que você declara e às quais faz referência a partir de outros modelos. Dessa forma, você pode evitar copiar e colar as mesmas configurações nos modelos e simplificar as atualizações de pilha. Se tiver um modelo para um componente comum, você poderá usar o recurso AWS::CloudFormation::Stack para fazer referência a este modelo a partir de outro modelo. Para saber mais sobre pilhas aninhadas, consulte Incorporar pilhas em outras pilhas usando pilhas aninhadas.

O AWS CloudFormation oferece suporte a apenas um nível de aninhamento usando resource import. Isso significa que você não pode importar uma pilha em uma pilha filho ou importar uma pilha com filhos.

Se você não tiver familiaridade com a importação, recomendamos que primeiro revise as informações introdutórias no tópico Importe recursos da AWS para uma pilha do CloudFormation com uma importação de recursos.

Validação da importação da pilha aninhada

Durante uma operação de importação de pilha aninhada, o AWS CloudFormation realiza as validações a seguir.

  • A definição aninhada de AWS::CloudFormation::Stack no modelo de pilha pai corresponde ao modelo da pilha real aninhada.

  • As tags da definição aninhada de AWS::CloudFormation::Stack no modelo de pilha pai correspondem às tags do recurso de pilha real aninhada.

Aninhar uma pilha existente usando o AWS Management Console.

  1. Adicione o recurso AWS::CloudFormation::Stack ao modelo de pilha pai com uma DeletionPolicy Retain. No modelo de exemplo de pilha principal, apresentado a seguir, MyNestedStack corresponde ao destino da importação.

    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 o console do AWS CloudFormation.

  3. Na página Stacks (Pilhas), com a pilha pai selecionada, escolha Stack actions (Ações da pilha) e Import resources into stack (Importar recursos para a pilha).

    A opção Importar recursos para a pilha no console.
  4. Leia a página Import overview (Visão geral da importação) para obter uma lista de itens que você deve fornecer durante esta operação. Em seguida, escolha Próximo.

  5. Na página Specify template (Especificar modelo), forneça o modelo pai atualizado usando um dos métodos a seguir e escolha Next (Próximo).

    • Escolha Amazon S3 URL (URL do Amazon S3) e especifique o URL do modelo na caixa de texto.

    • Escolha Upload a template file (Fazer upload de um arquivo de modelo) e procure o arquivo de modelo.

  6. Na página Identify resources (Identificar recursos), identifique o recurso AWS::CloudFormation::Stack.

    1. Em Identifier property (Propriedade do identificador), escolha o tipo de identificador do recurso. Por exemplo, um recurso AWS::CloudFormation::Stack pode ser identificado usando a propriedade StackId.

    2. Em Valor do identificador, digite o ARN da pilha que você está importando. Por exemplo, arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10.

      A página Identificar recursos no console.
    3. Escolha Próximo.

  7. Na página Specify stack details (Especificar detalhes da pilha), modifique os parâmetros e escolha Next (Próximo). Isso cria automaticamente um conjunto de alterações.

    Importante

    A operação de importação falhará se você modificar os parâmetros existentes que iniciam uma operação de criação, atualização ou exclusão.

  8. Na página Analisar MyParentStack, confirme se o recurso correto está sendo importado e, em seguida, escolha Importar recursos. Isso executa automaticamente o conjunto de alterações criado na última etapa. As tags no nível da pilha são aplicadas aos recursos importados no momento.

  9. O painel Events (Eventos) da página Stack details (Detalhes da pilha) de sua pilha pai será exibido.

    A guia Eventos no console.
    nota

    Não é necessário executar a detecção de desvios na pilha pai após a operação de importação porque o recurso AWS::CloudFormation::Stack já foi gerenciado pelo AWS CloudFormation.

Aninhar uma pilha existente usando o AWS CLI.

  1. Adicione o recurso AWS::CloudFormation::Stack ao modelo de pilha pai com uma DeletionPolicy Retain. No modelo pai do exemplo a seguir, MyNestedStack é o destino da importação.

    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. Componha uma string JSON, conforme mostrado no exemplo a seguir, com estas modificações:

    • Substitua MyNestedStack pelo ID lógico do recurso de destino, conforme especificado no modelo.

    • Substitua arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10 pelo ARN da pilha que você deseja importar.

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

    Como alternativa, é possível especificar os parâmetros em um arquivo de configuração.

    Por exemplo, para importar MyNestedStack, é possível criar um arquivo ResourcesToImport.txt que contenha a configuração apresentada a seguir.

    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 criar um conjunto de alterações, use o comando create-change-set, apresentado a seguir, e substitua o texto do espaço reservado. Para a opção,--change-set-type especifique um valor de IMPORT. Para a opção --resources-to-import, substitua a string JSON de exemplo pela string JSON real que você acabou de criar.

    $ 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

    A opção --resources-to-import não oferece suporte para a linguagem YAML incorporada. Os requisitos para usar sequências de escape de aspas em uma string JSON variam de acordo com o terminal utilizado. Para obter mais informações, consulte Using quotation marks inside strings no Guia do usuário da AWS Command Line Interface.

    Como alternativa, é possível usar um URL de arquivo como entrada para a opção --resources-to-import, conforme mostrado no exemplo a seguir.

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

    Se a detecção ocorrer com êxito, esse comando retornará o exemplo de saída apresentado a seguir.

    { "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 o conjunto de alterações para garantir que a pilha correta está sendo importada.

    $ aws cloudformation describe-change-set --change-set-name ImportChangeSet
  5. Para iniciar o conjunto de alterações e importar a pilha para a pilha principal de origem, use o comando execute-change-set, apresentado a seguir, e substitua o texto do espaço reservado. As tags no nível da pilha são aplicadas aos recursos importados no momento. Após concluir a operação de importação (IMPORT_COMPLETE), a pilha será aninhada com êxito.

    $ aws cloudformation execute-change-set --change-set-name ImportChangeSet
    nota

    Não é necessário executar a detecção de desvio na pilha pai após essa operação de importação, pois o recurso AWS::CloudFormation::Stack já é gerenciado pelo AWS CloudFormation.