Aufteilung einer Vorlage in wiederverwendbare Teile mit verschachtelten Stapeln
Wenn Ihre Infrastruktur wächst, müssen Sie möglicherweise immer wieder identische Ressourcenkonfigurationen für mehrere Vorlagen erstellen. Um diese Redundanz zu vermeiden, können Sie diese gemeinsamen Konfigurationen in spezielle Vorlagen aufteilen. Dann können Sie die Ressource AWS::CloudFormation::Stack in anderen Vorlagen verwenden, um auf diese speziellen Vorlagen zu verweisen und so verschachtelte Stapel zu erstellen.
Nehmen wir zum Beispiel an, Sie haben eine Load Balancer-Konfiguration, die Sie für die meisten Ihrer Stacks verwenden. Anstatt dieselbe Konfigurationen zu kopieren und in Ihre Vorlagen einzufügen, können Sie eine dedizierte Vorlage für den Load Balancer erstellen. Dann können Sie diese Vorlage in anderen Vorlagen referenzieren, die dieselbe Load Balancer-Konfiguration benötigen.
Verschachtelte Stapel können ihrerseits weitere verschachtelte Stapel enthalten, so dass eine Hierarchie von Stapeln entsteht, wie in der folgenden Abbildung dargestellt. Der-Wurzelstapel ist der oberste Stapel, zu dem letztlich alle verschachtelten Stapel gehören. Jeder verschachtelte Stapel hat einen unmittelbaren übergeordneten Stapel. Für die erste Ebene von verschachtelten Stapeln ist der Stammstapel auch der übergeordnete Stapel.
-
Stack A ist der Root-Stack für alle anderen – verschachtelten – Stacks in der Hierarchie.
-
Für Stack B ist Stack A sowohl der übergeordnete Stack als auch der Root-Stack.
-
Für Stack D ist Stack C der übergeordnete Stack, während Stack B der übergeordnete Stack für Stack C ist.
Themen
Vorher-Nachher-Beispiel für die Aufteilung einer Vorlage
Dieses Beispiel zeigt, wie Sie eine einzelne, große CloudFormation-Vorlage mit Hilfe von verschachtelten Vorlagen in ein strukturierteres und wiederverwendbares Design umstrukturieren können. Die Vorlage "Vor der Verschachtelung von Stapeln" zeigt zunächst alle in einer Datei definierten Ressourcen an. Das kann unübersichtlich und schwer zu verwalten werden, wenn die Anzahl der Ressourcen wächst. Die Vorlage "Nach Verschachtelung der Stapel" teilt die Ressourcen in kleinere, separate Vorlagen auf. Jeder verschachtelte Stapel verwaltet einen bestimmten Satz zusammengehöriger Ressourcen, wodurch die Gesamtstruktur übersichtlicher und leichter zu pflegen ist.
Vor der Verschachtelung von Stapeln |
Nach der Verschachtelung von Stapeln |
|---|---|
|
|
Beispiel für eine verschachtelte Stack-Architektur
Dieser Abschnitt demonstriert eine verschachtelte Stack-Architektur, die aus einem Top-Level-Stack besteht, der auf einen verschachtelten Stack verweist. Der verschachtelte Stack setzt eine Node.js Lambda-Funktion ein, erhält einen Parameterwert vom Stack der obersten Ebene und gibt eine Ausgabe zurück, die über den Stack der obersten Ebene exponiert wird.
Themen
Schritt 1: Erstellen Sie eine Vorlage für den verschachtelten Stack auf Ihrem lokalen System
Das folgende Beispiel zeigt das Format der verschachtelten Stapelvorlage.
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
Schritt 2: Erstellen Sie eine Vorlage für den Top-Level-Stack auf Ihrem lokalen System
Das folgende Beispiel zeigt das Format der Stack-Vorlage der obersten Ebene und der Ressource AWS::CloudFormation::Stack, die auf den Stack verweist, den Sie im vorherigen Schritt erstellt haben.
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
Schritt 3: Paketieren und verteilen Sie die Vorlagen
Anmerkung
Wenn Sie lokal mit Vorlagen arbeiten, können Sie mit dem Befehl AWS CLI package Vorlagen für die Bereitstellung vorbereiten. Es verarbeitet automatisch den Upload lokaler Artefakte zu Amazon S3 (einschließlich TemplateURL) und erzeugt eine neue Vorlagendatei mit aktualisierten Verweisen auf diese S3-Speicherorte. Weitere Informationen finden Sie unter Lokale Artefakte in einen S3-Bucket mit der Bezeichnung AWS CLIhochladen.
Als nächstes können Sie den Befehl package verwenden, um die verschachtelte Vorlage in einen Amazon S3-Bucket hochzuladen.
aws cloudformation package \ --s3-bucketamzn-s3-demo-bucket\ --template/path_to_template/top-level-template.yaml\ --output-template-filepackaged-template.yaml\ --output json
Der Befehl erzeugt eine neue Vorlage unter dem durch --output-template-fileangegebenen Pfad. Es ersetzt die Referenz TemplateURL durch den Amazon S3-Speicherort, wie unten gezeigt.
Resultierende Vorlage
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
Nachdem Sie den Befehl package ausgeführt haben, können Sie die verarbeitete Vorlage mit dem Befehl deploy bereitstellen. Bei verschachtelten Stapeln, die IAM-Ressourcen enthalten, müssen Sie die IAM-Fähigkeiten bestätigen, indem Sie die Option --capabilities einfügen.
aws cloudformation deploy \ --template-filepackaged-template.yaml\ --stack-namestack-name\ --capabilities CAPABILITY_NAMED_IAM
Ausführen von Stapeloperationen auf verschachtelten Stapeln
Wenn Sie mit verschachtelten Stapeln arbeiten, müssen Sie diese bei Operationen sorgfältig behandeln. Bestimmte Stack-Operationen, wie beispielsweise Stack-Aktualisierungen, sollten vom Root-Stack aus initiiert werden und nicht direkt auf den verschachtelten Stacks ausgeführt werden. Wenn Sie einen Stammstapel aktualisieren, werden nur verschachtelte Stapel mit Vorlagenänderungen aktualisiert.
Außerdem kann das Vorhandensein von verschachtelten Stapeln die Operationen auf dem Stammstapel beeinflussen. Wenn zum Beispiel ein verschachtelter Stack im Zustand UPDATE_ROLLBACK_IN_PROGRESS stecken bleibt, wartet der Root-Stack, bis dieser verschachtelte Stack sein Rollback beendet hat, bevor er fortfährt. Bevor Sie mit den Aktualisierungsvorgängen fortfahren, vergewissern Sie sich, dass Sie über IAM-Berechtigungen verfügen, um eine Stack-Aktualisierung abzubrechen, falls diese zurückgesetzt wird. Weitere Informationen finden Sie unter Steuern Sie den Zugriff auf CloudFormation mit AWS Identity and Access Management..
Verwenden Sie die folgenden Verfahren, um den Stammstapel und die verschachtelten Stapel zu finden.
So zeigen Sie den Root-Stack eines verschachtelten Stacks an
-
Melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie die CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation
. -
Wählen Sie auf der Seite Stapel den Namen des verschachtelten Stapels, dessen Stammstapel Sie sehen möchten.
Verschachtelte Stapel zeigen NESTED über ihrem Stapelnamen an.
-
Wählen Sie auf der Registerkarte Stackinfo im Abschnitt Übersicht den Stacknamen aus, der als Wurzelstackaufgeführt ist.
So zeigen Sie die verschachtelten Stacks eines Root-Stacks an
-
Wählen Sie im Stammstapel, dessen verschachtelte Stapel Sie anzeigen möchten, die Registerkarte Ressourcen .
-
Suchen Sie in der Spalte Typ nach Ressourcen des Typs AWS::CloudFormation::Stack.