

# División de una plantilla en piezas reutilizables utilizando pilas anidadas
<a name="using-cfn-nested-stacks"></a>

A medida que su infraestructura crezca, es posible que se encuentre creando repetidamente configuraciones de recursos idénticas en varias plantillas. Para evitar esta redundancia, puede separar estas configuraciones comunes en plantillas dedicadas. Después, puede utilizar el 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) en otras plantillas para hacer referencia a otras plantillas dedicadas, y así crear pilas anidadas.

Por ejemplo, imagine que tiene una configuración de equilibrador de carga que utiliza para la mayoría de sus pilas. En lugar de copiar y pegar las mismas configuraciones en las plantillas, puede crear una plantilla exclusiva para el balanceador de carga. Luego, puede hacer referencia a esta plantilla desde otras plantillas que requieran la misma configuración de equilibrador de carga.

Las pilas anidadas pueden a su vez contener otras pilas anidadas, lo que se traduce en una jerarquía de pilas, como se muestra en el diagrama que aparece a continuación. La *pila raíz* es la pila de nivel superior a la que pertenecen todas las demás pilas anidadas. Cada pila anidada dispone de una pila primaria inmediata. En el caso del primer nivel de pilas anidadas, la pila raíz es a su vez la primaria.
+ La pila A es la raíz de todas las demás pilas anidadas de la jerarquía.
+ En el caso de la pila B, la pila A es tanto su pila primaria como la pila raíz.
+ Para la pila D, la C es su pila primaria, del mismo modo que para la pila C, la B es su pila primaria.

![\[Las pilas anidadas, que se crean como parte de otra pila, disponen de una pila primaria inmediata y de una pila raíz de nivel superior.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [Ejemplo de antes y después de dividir una plantilla](#create-nested-stack-template)
+ [Ejemplo de una arquitectura de pila anidada](#nested-stack-examples)
+ [Operaciones de apilamiento en pilas anidadas](#perform-stack-operations-on-nested-stacks)
+ [Información relacionada](#nested-stacks-related-information)

## Ejemplo de antes y después de dividir una plantilla
<a name="create-nested-stack-template"></a>

En este ejemplo, se muestra cómo puede tomar una plantilla grande y única de CloudFormation y reorganizarla en un diseño más estructurado y reutilizable mediante plantillas anidadas. Inicialmente, la plantilla “Antes de anidar las pilas” muestra todos los recursos definidos en un archivo. Esto puede resultar complicado y difícil de administrar a medida que aumenta la cantidad de recursos. La plantilla «Después de anidar las pilas» divide los recursos en plantillas más pequeñas e independientes. Cada pila anidada gestiona un conjunto específico de recursos relacionados, lo que hace que la estructura general esté más organizada y sea más fácil de mantener.


| Antes de anidar las pilas | Después de anidar las pilas | 
| --- | --- | 
| <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> | 

## Ejemplo de una arquitectura de pila anidada
<a name="nested-stack-examples"></a>

Esta sección muestra una arquitectura de pila anidada que consiste en una pila de nivel superior que hace referencia a una pila anidada. La pila anidada implementa una función de Lambda de Node.js, recibe un valor de parámetro de la pila de nivel superior y devuelve una salida que se expone a través de la pila de nivel superior.

**Topics**
+ [Paso 1: cree una plantilla para la pila anidada en su sistema local.](#create-a-nested-stack-template)
+ [Paso 2: cree una plantilla para la pila de nivel superior en su sistema local.](#create-a-nested-stack-parent-template)
+ [Paso 3: empaquetar e implementar las plantillas.](#create-a-nested-stack-parent-template)

### Paso 1: cree una plantilla para la pila anidada en su sistema local.
<a name="create-a-nested-stack-template"></a>

En el siguiente ejemplo, se muestra el formato de la plantilla para la pila anidada.

#### 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
```

### Paso 2: cree una plantilla para la pila de nivel superior en su sistema local.
<a name="create-a-nested-stack-parent-template"></a>

El siguiente ejemplo muestra el formato de la plantilla de pila de nivel superior y el 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 hace referencia a la pila que creó en el paso 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
```

### Paso 3: empaquetar e implementar las plantillas.
<a name="create-a-nested-stack-parent-template"></a>

**nota**  
Al trabajar con plantillas de forma local, el comando **package** de la AWS CLI puede ayudarlo a preparar las plantillas para su implementación. Gestiona automáticamente la carga de artefactos locales en Amazon S3 (incluidas `TemplateURL`) y genera un nuevo archivo de plantilla con referencias actualizadas a estas ubicaciones de S3. Para obtener más información, consulte [Carga de artefactos locales en un bucket de S3 con la AWS CLI](using-cfn-cli-package.md). 

A continuación, puede utilizar el comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) para cargar la plantilla anidada a un bucket de 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
```

El comando genera una nueva plantilla en la ruta especificada por `--output-template-file`. Reemplaza la referencia `TemplateURL` con la ubicación de Amazon S3, tal y como se muestra a continuación.

**Plantilla 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
```

Después de que ejecute el comando **package**, puede implementar la plantilla procesada mediante el comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/). Para las pilas anidadas que contienen recursos de IAM, debe confirmar las capacidades de IAM al incluir la opción `--capabilities`.

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

## Operaciones de apilamiento en pilas anidadas
<a name="perform-stack-operations-on-nested-stacks"></a>

Al trabajar con pilas anidadas, debe gestionarlas con cuidado durante las operaciones. Determinadas operaciones de las pilas, como las actualizaciones de pilas, deben iniciarse en la pila raíz en lugar de realizarse directamente en las pilas anidadas. Al actualizar una pila raíz, solo se actualizarán las pilas anidadas con cambios de plantilla. 

Además, la presencia de las pilas anidadas puede afectar a las operaciones en la pila raíz. Por ejemplo, si una pila anidada se queda atascada en el estado `UPDATE_ROLLBACK_IN_PROGRESS`, la pila raíz esperará hasta que esa pila anidada complete su proceso de reversión antes de continuar. Antes de continuar con las operaciones de actualización, asegúrese de tener permisos de IAM para cancelar una actualización de la pila en caso de que se revierta. Para obtener más información, consulte [Control del acceso a CloudFormation con AWS Identity and Access Management](control-access-with-iam.md).

Use los siguientes procedimientos para buscar la pila raíz y las pilas anidadas.

**Para ver la pila raíz de una pila anidada**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la página **Pilas**, seleccione el nombre de la pila anidada de la que desea ver la pila raíz.

   Las pilas anidadas tienen la palabra **ANIDADA** sobre su nombre.

1. En la pestaña **Información de la pila**, en la sección **Información general**, seleccione el nombre de la pila mostrada como **Pila raíz**.

**Para ver las pilas anidadas que pertenecen a una pila raíz**

1. Desde la pila raíz cuyas pilas anidadas desea ver, seleccione la pestaña **Recursos**.

1. En la columna **Tipo**, busque recursos del tipo **AWS::CloudFormation::Stack**.

## Información relacionada
<a name="nested-stacks-related-information"></a>
+ [Anidamiento de una pila existente](resource-import-nested-stacks.md)
+ [Comprensión de los comportamientos de actualización de los recursos de la pila](using-cfn-updating-stacks-update-behaviors.md)
+ [Continúe con la reversión de las actualizaciones con fallas de la pila anidada](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [Fallo de reversión de pilas anidadas](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)