División de una plantilla en piezas reutilizables utilizando pilas anidadas
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 AWS::CloudFormation::Stack 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.

Temas
Ejemplo de antes y después de dividir una plantilla
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 |
---|---|
|
|
Ejemplo de una arquitectura de pila anidada
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.
Temas
Paso 1: cree una plantilla para la pila anidada en su sistema local.
En el siguiente ejemplo, se muestra el formato de la plantilla para la pila anidada.
YAML
AWSTemplateFormatVersion: 2010-09-09 Description: Nested stack template for Lambda function deployment Parameters: MemorySize: Type: Number Default: 128 MinValue: 128 MaxValue: 10240 Description: Lambda function memory allocation (128-10240 MB) Resources: LambdaFunction: Type: AWS::Lambda::Function Properties: FunctionName: !Sub "${AWS::StackName}-Function" Runtime: nodejs18.x Handler: index.handler Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: | exports.handler = async (event) => { return { statusCode: 200, body: JSON.stringify('Hello from Lambda!') }; }; MemorySize: !Ref MemorySize LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' Outputs: LambdaArn: Description: ARN of the created Lambda function Value: !GetAtt LambdaFunction.Arn
Paso 2: cree una plantilla para la pila de nivel superior en su sistema local.
El siguiente ejemplo muestra el formato de la plantilla de pila de nivel superior y el recurso AWS::CloudFormation::Stack que hace referencia a la pila que creó en el paso anterior.
YAML
AWSTemplateFormatVersion: 2010-09-09 Description: Top-level stack template that deploys a nested stack Resources: NestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: /path_to_template/nested-template.yaml Parameters: MemorySize: 256 Outputs: NestedStackLambdaArn: Description: ARN of the Lambda function from nested stack Value: !GetAtt NestedStack.Outputs.LambdaArn
Paso 3: empaquetar e implementar las plantillas.
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.
A continuación, puede utilizar el comando package 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-filepackaged-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 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-namestack-name
\ --capabilities CAPABILITY_NAMED_IAM
Operaciones de apilamiento en pilas anidadas
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.
Use los siguientes procedimientos para buscar la pila raíz y las pilas anidadas.
Para ver la pila raíz de una pila anidada
-
Inicie sesión en la AWS Management Console y abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation
. -
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.
-
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
-
Desde la pila raíz cuyas pilas anidadas desea ver, seleccione la pestaña Recursos.
-
En la columna Tipo, busque recursos del tipo AWS::CloudFormation::Stack.