

# Dividir um modelo em partes reutilizáveis usando pilhas aninhadas
<a name="using-cfn-nested-stacks"></a>

À medida que sua infraestrutura cresce, você poderá se encontrar criando repetidamente configurações de recursos idênticas em vários modelos. Para evitar essa redundância, é possível separar essas configurações comuns em modelos dedicados. Depois, use o recuso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) em seu modelo para fazer referência a esses modelos dedicados, criando pilhas aninhadas.

Por exemplo, suponha que você tem uma configuração de balanceador de carga para a maioria de suas pilhas. Em vez de copiar e colar as mesmas configurações em seus modelos, é possível criar um modelo dedicado para o load balancer. Em seguida, você poderá fazer referência a esse modelo a partir de outros modelos que exigem a mesma configuração do balanceador de carga.

As pilhas aninhadas podem conter outras pilhas aninhadas, o que resulta em uma hierarquia de pilhas, conforme mostrado no diagrama a seguir. A *pilha raiz* é a pilha de nível superior à qual todas as pilhas aninhadas pertencem. Cada pilha aninhada tem uma pilha pai imediata. Para o primeiro nível de pilhas aninhadas, a pilha raiz também é a pilha pai.
+ Pilha A é a pilha raiz de todas as outras pilhas, aninhadas, na hierarquia.
+ Para a pilha B, a pilha A é a pilha pai e a pilha raiz.
+ Para a pilha D, a pilha C é a pilha pai; e, ao mesmo tempo, para a pilha C, a pilha B é a pilha pai.

![\[As pilhas aninhadas, que são criadas como parte de outra pilha, têm uma pilha pai imediata, e a pilha raiz de nível superior.\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [Exemplo de antes e depois da divisão de um modelo](#create-nested-stack-template)
+ [Exemplo de uma arquitetura de pilha aninhada](#nested-stack-examples)
+ [Executar operações de pilha em pilhas aninhadas](#perform-stack-operations-on-nested-stacks)
+ [Informações relacionadas](#nested-stacks-related-information)

## Exemplo de antes e depois da divisão de um modelo
<a name="create-nested-stack-template"></a>

Este exemplo demonstra como é possível pegar um modelo único e grande do CloudFormation e reorganizá-lo em um design mais estruturado e reutilizável usando modelos aninhados. Inicialmente, o modelo “Antes de aninhar pilhas” mostra todos os recursos definidos em um arquivo. Isso pode se tornar confuso e difícil de gerenciar à medida que o número de recursos aumenta. O modelo "Depois de aninhar pilhas" divide os recursos em modelos menores e separados, chamados de pilhas aninhadas. Cada pilha aninhada manipula um conjunto específico de recursos relacionados, tornando a estrutura geral mais organizada e fácil de manter.


| Antes de aninhar pilhas | Depois de aninhar pilhas | 
| --- | --- | 
| <pre>AWSTemplateFormatVersion: 2010-09-09<br />Parameters:<br />  InstanceType:<br />    Type: String<br />    Default: t2.micro<br />    Description: The EC2 instance type<br />  <br />  Environment:<br />    Type: String<br />    Default: Production<br />    Description: The deployment environment<br /><br />Resources:<br />  MyEC2Instance:<br />    Type: AWS::EC2::Instance<br />    Properties:<br />      ImageId: ami-1234567890abcdef0<br />      InstanceType: !Ref InstanceType<br /><br />  MyS3Bucket:<br />    Type: AWS::S3::Bucket</pre> | <pre>AWSTemplateFormatVersion: 2010-09-09<br />Resources:<br />  MyFirstNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        InstanceType: t3.micro<br /><br />  MySecondNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        Environment: Testing<br />    DependsOn: MyFirstNestedStack</pre> | 

## Exemplo de uma arquitetura de pilha aninhada
<a name="nested-stack-examples"></a>

Esta seção demonstra uma arquitetura de pilha aninhada que consiste em uma pilha de nível superior que faz referência a uma pilha aninhada. A pilha aninhada implanta uma função do Lambda em Node.js, recebe um valor de parâmetro da pilha de nível superior e retorna uma saída que é exposta por meio da pilha de nível superior.

**Topics**
+ [Etapa 1: criar um modelo para a pilha aninhada em seu sistema local](#create-a-nested-stack-template)
+ [Etapa 2: criar um modelo para a pilha de nível superior em seu sistema local](#create-a-nested-stack-parent-template)
+ [Etapa 3: empacotar e implantar os modelos](#create-a-nested-stack-parent-template)

### Etapa 1: criar um modelo para a pilha aninhada em seu sistema local
<a name="create-a-nested-stack-template"></a>

O exemplo a seguir mostra o formato do modelo da pilha aninhada.

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### Etapa 2: criar um modelo para a pilha de nível superior em seu sistema local
<a name="create-a-nested-stack-parent-template"></a>

O exemplo a seguir mostra o formato do modelo de pilha de nível superior e o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) que faz referência à pilha que você criou na etapa anterior.

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### Etapa 3: empacotar e implantar os modelos
<a name="create-a-nested-stack-parent-template"></a>

**nota**  
Ao trabalhar com modelos localmente, o comando **package** da AWS CLI pode ajudar você a preparar modelos para implantação. Ele gerencia automaticamente o upload de artefatos locais para o Amazon S3 (incluindo `TemplateURL`) e gera um novo arquivo de modelo com referências atualizadas a esses locais do S3. Para obter mais informações, consulte [Fazer upload de artefatos locais em um bucket do S3 com a AWS CLI](using-cfn-cli-package.md). 

Em seguida, você pode usar o comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) para carregar o modelo aninhado em um bucket do Amazon S3.

```
aws cloudformation package \
  --s3-bucket amzn-s3-demo-bucket \
  --template /path_to_template/top-level-template.yaml \
  --output-template-file packaged-template.yaml \
  --output json
```

O comando gera um novo modelo no caminho especificado por `--output-template-file`. Ele substitui a referência `TemplateURL` pelo local do Amazon S3, conforme mostrado abaixo.

**Modelo resultante**

```
AWSTemplateFormatVersion: 2010-09-09
Description: Top-level stack template that deploys a nested stack
Resources:
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template
      Parameters:
        MemorySize: 256
Outputs:
  NestedStackLambdaArn:
    Description: ARN of the Lambda function from nested stack
    Value:
      Fn::GetAtt:
      - NestedStack
      - Outputs.LambdaArn
```

Depois de executar o comando **package**, você pode implantar o modelo processado usando o comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/). Para pilhas aninhadas que contêm recursos do IAM, é necessário reconhecer os recursos do IAM com a inclusão da opção `--capabilities`.

```
aws cloudformation deploy \
  --template-file packaged-template.yaml \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM
```

## Executar operações de pilha em pilhas aninhadas
<a name="perform-stack-operations-on-nested-stacks"></a>

Ao trabalhar com pilhas aninhadas, você deverá manuseá-las cuidadosamente durante as operações. Algumas operações de pilha, como atualizações de pilha, devem ser iniciadas na pilha raiz em vez de serem realizadas diretamente em pilhas aninhadas. Quando você atualiza uma pilha raiz, somente as pilhas aninhadas com alterações de modelo serão atualizadas. 

Além disso, a presença das pilhas aninhadas pode afetar as operações na pilha raiz. Por exemplo, se uma pilha aninhada ficar aprisionada no estado `UPDATE_ROLLBACK_IN_PROGRESS`, a pilha raiz aguardará até que a pilha aninhada conclua a reversão antes de continuar. Antes de prosseguir com as operações de atualização, certifique-se de ter as permissões do IAM necessárias para cancelar uma atualização da pilha caso ela seja revertida. Para obter mais informações, consulte [Controle o acesso ao CloudFormation com o AWS Identity and Access Management](control-access-with-iam.md).

Use os procedimentos a seguir para encontrar a pilha raiz e as pilhas aninhadas.

**Para visualizar a pilha raiz de uma pilha aninhada**

1. Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Na página **Pilhas**, escolha o nome da pilha aninhada da qual deseja exibir a pilha raiz.

   As pilhas aninhadas exibem **ANINHADA** ao lado do nome da pilha.

1. Na guia **Informações da pilha**, na seção **Visão geral**, selecione o nome da pilha listada como **Pilha raiz**.

**Para visualizar as pilhas aninhadas que pertencem a uma pilha raiz**

1. Escolha o nome da pilha raiz cujas pilhas aninhadas você deseja visualizar e, em seguida, escolha a guia **Recursos**.

1. Na coluna **Tipo**, procure recursos do tipo **AWS::CloudFormation::Stack**.

## Informações relacionadas
<a name="nested-stacks-related-information"></a>
+ [Aninhar uma pilha existente](resource-import-nested-stacks.md)
+ [Compreender atualização de comportamentos de recursos da pilha](using-cfn-updating-stacks-update-behaviors.md)
+ [Continue revertendo de atualizações de pilhas aninhadas que falharam](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [Falha na reversão de pilhas aninhadas](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)