Aufteilung einer Vorlage in wiederverwendbare Teile mit verschachtelten Stapeln - AWS CloudFormation

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.

Verschachtelte Stacks, die als Teil eines anderen Stacks erstellt werden, besitzen einen unmittelbar übergeordneten Stack sowie den Root-Stack in der Hauptebene.

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

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

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.

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-bucket amzn-s3-demo-bucket \ --template /path_to_template/top-level-template.yaml \ --output-template-file packaged-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-file packaged-template.yaml \ --stack-name stack-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
  1. Melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie die CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation.

  2. 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.

  3. 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
  1. Wählen Sie im Stammstapel, dessen verschachtelte Stapel Sie anzeigen möchten, die Registerkarte Ressourcen .

  2. Suchen Sie in der Spalte Typ nach Ressourcen des Typs AWS::CloudFormation::Stack.