Dividi un modello in pezzi riutilizzabili usando stack nidificati
Man mano che la tua infrastruttura cresce, potresti ritrovarti a creare ripetutamente configurazioni di risorse identiche su più modelli. Per evitare questa ridondanza, puoi separare queste configurazioni comuni in modelli dedicati. Poi, puoi utilizzare la risorsa AWS::CloudFormation::Stack negli altri modelli per fare riferimento a questi modelli dedicati, creando così degli stack nidificati.
Ad esempio, immagina di avere una configurazione del bilanciatore del carico che utilizzi per la maggior parte dei tuoi stack. Invece di copiare e incollare le stesse configurazioni nei modelli, puoi creare un modello dedicato per il sistema di load balancer. Così, puoi fare riferimento a questo modello dall’interno di altri modelli che richiedono la stessa configurazione del bilanciatore del carico.
Gli stack nidificati possono a loro volta contenere altri stack nidificati, generando una gerarchia di stack, come mostrato nel diagramma di seguito. Lo stack radice è lo stack di primo livello al quale sostanzialmente appartengono tutti gli stack nidificati. Ciascuno stack nidificato ha un proprio stack padre. Per il primo livello di stack nidificati, lo stack radice è anche lo stack padre.
-
Lo stack A è lo stack padre per tutti gli altri stack nidificati della gerarchia.
-
Per lo stack B, lo stack A è sia lo stack padre che lo stack radice.
-
Per lo stack D, lo stack C è lo stack padre; mentre per lo stack C, lo stack padre è lo stack B.
Argomenti
Esempio del prima e dopo della suddivisione di un modello
Questo esempio dimostra come puoi prendere un unico modello di CloudFormation di grandi dimensioni e riorganizzarlo in modo più strutturato e riutilizzabile utilizzando modelli nidificati. Inizialmente, il modello “Before nesting stacks” mostra tutte le risorse definite in un unico file. Questo può diventare complicato e difficile da gestire man mano che il numero di risorse aumenta. Il modello “After nesting stacks” suddivide le risorse in modelli più piccoli e separati. Ogni stack nidificato gestisce un insieme specifico di risorse correlate, rendendo la struttura generale più organizzata e facile da gestire.
Prima degli stack nidificati |
Dopo gli stack nidificati |
|---|---|
|
|
Esempio di architettura degli stack nidificati
Questa sezione dimostra un’architettura di stack nidificata costituita da uno stack di primo livello che fa riferimento a uno stack nidificato. Lo stack nidificato implementa una funzione Lambda Node.js, riceve il valore di un parametro dallo stack di primo livello e restituisce un output esposto attraverso lo stack di primo livello.
Argomenti
Passaggio 1: crea un modello per lo stack nidificato sul sistema locale
L’esempio seguente mostra il formato per il modello dello stack nidificato.
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
Passaggio 2: crea un modello per lo stack di primo livello sul sistema locale
L’esempio seguente mostra il formato del modello di stack di primo livello e la risorsa AWS::CloudFormation::Stack che fa riferimento allo stack creato nel passaggio precedente.
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
Passaggio 3: stack e implementazione dei modelli
Nota
Quando lavori con i modelli a livello locale, il comando AWS CLI package può aiutarti a preparare i modelli per l’implementazione. Infatti, gestisce automaticamente il caricamento di artefatti locali su Amazon S3 (TemplateURL incluso) e genera un nuovo file del modello con riferimenti aggiornati a queste posizioni S3. Per ulteriori informazioni, consulta Carica artefatti locali in un bucket S3 con la AWS CLI.
Successivamente, puoi utilizzare il comando package per caricare il modello nidificato su un bucket Amazon S3.
aws cloudformation package \ --s3-bucketamzn-s3-demo-bucket\ --template/path_to_template/top-level-template.yaml\ --output-template-filepackaged-template.yaml\ --output json
Il comando genera un nuovo modello nel percorso specificato da --output-template-file. Sostituisce il riferimento a TemplateURL con la posizione di Amazon S3, come di seguito.
Modello risultante
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
Dopo aver eseguito il comando package, puoi distribuire il modello elaborato utilizzando il comando deploy. Devi confermare le funzionalità di IAM per gli stack nidificati contenenti le risorse IAM includendo l’opzione --capabilities.
aws cloudformation deploy \ --template-filepackaged-template.yaml\ --stack-namestack-name\ --capabilities CAPABILITY_NAMED_IAM
Esecuzione di operazioni di stack su stack nidificati
Quando lavori con stack nidificati, devi gestirli con attenzione durante le operazioni. Alcune operazioni relative agli stack, ad esempio gli aggiornamenti, devono essere avviati dallo stack radice anziché effettuati direttamente sugli stack nidificati. Quando aggiorni uno stack radice, vengono aggiornati solo gli stack nidificati con modifiche al modello.
Inoltre, la presenza degli stack nidificati può influire sulle operazioni sullo stack radice. Ad esempio, se uno stack nidificato rimane bloccato nello stato UPDATE_ROLLBACK_IN_PROGRESS, lo stack radice aspetterà che lo stack nidificato completi il suo rollback prima di continuare. Prima di procedere con le operazioni di aggiornamento, assicurati di disporre delle autorizzazioni IAM per annullare un aggiornamento dello stack in caso di rollback. Per ulteriori informazioni, consulta Controlla l’accesso a CloudFormation con AWS Identity and Access Management.
Utilizza le seguenti procedure per trovare lo stack radice e gli stack nidificati.
Per visualizzare lo stack radice di uno stack nidificato
-
Accedere alla Console di gestione AWS e aprire la console di CloudFormation all'indirizzo https://console.aws.amazon.com/cloudformation
. -
Nella pagina Stack, seleziona il nome dello stack nidificato di cui desideri visualizzare lo stack radice.
Gli stack nidificati sono contrassegnati dalla dicitura NESTED accanto al nome.
-
Nel riquadro Informazioni stack, nella sezione Panoramica, seleziona il nome dello stack presente in elenco come Stack radice.
Per visualizzare gli stack nidificati che appartengono a uno stack radice
-
Dallo stack radice di cui desideri visualizzare gli stack nidificati, seleziona la scheda Risorse.
-
Nella colonna Tipo, cerca le risorse di tipo AWS::CloudFormation::Stack.