Einführung
AWS CloudFormation ist ein Service, mit dem wir AWS- und Drittanbieter-Ressourcen bereitstellen können, indem wir die Infrastruktur als Code behandeln. Er ermöglicht uns konsistente und versionskontrollierte Bereitstellungen. Während es andere beliebte Tools für IaC wie Terraform und Pulumi gibt, wurde CloudFormation speziell für AWS-Ressourcen und -Services entwickelt. Es verwendet YAML- oder JSON-basierte Vorlagen, mit denen die meisten Benutzer bereits vertraut sind. Da es sich um den AWS-Service für Infrastruktur als Code handelt, gibt es mehr offizielle Schnellstarts, die von AWS bereitgestellt werden, und der AWS-Support ist besser in der Lage, zu helfen, wenn Hilfe benötigt wird.
Einer der Vorteile der Verwendung von CloudFormation ist, dass es keine Zustandsdatei gibt, die wir verwalten müssen. Die Bereitstellungen werden innerhalb des CloudFormation-Dienstes als "Stack" dargestellt. Stack Events zeigen die Bereitstellungsergebnisse der Ressourcen, die auf der Grundlage der bereitgestellten Vorlage erstellt/aktualisiert/gelöscht wurden.
In diesem Beitrag befassen wir uns mit den Grundlagen von CloudFormation, einschließlich Vorlagen, Stacks, Change Sets und verschachtelten Stacks, und untersuchen, wie diese Funktionen die Infrastrukturverwaltung vereinfachen und uns gleichzeitig mehr Kontrolle und Transparenz über unsere Bereitstellungen geben können.
Wichtige Konzepte in CloudFormation
Vorlage-Datei
Bei den Vorlagendateien haben wir die Wahl zwischen den Formaten JSON und YAML. YAML ist übersichtlicher und einfacher zu handhaben, weshalb es oft bevorzugt wird. Die Grundstruktur einer YAML-Vorlagendatei sieht wie folgt aus:
---
AWSTemplateFormatVersion: version date
Description:
String
Metadata:
template metadata
Parameters:
set of parameters
Rules:
set of rules
Mappings:
set of mappings
Conditions:
set of conditions
Transform:
set of transforms
Resources:
set of resources
Outputs:
set of outputs
Schauen wir uns einige der am häufigsten verwendeten Abschnitte an.
Im Abschnitt Ressourcen können wir die AWS-Ressourcen angeben, die wir bereitstellen möchten. Er hat die folgende Struktur:
Resources:
LogicalResourceName1:
Type: AWS::ServiceName::ResourceType
Properties:
PropertyName1: PropertyValue1
...
LogicalResourceName2:
Type: AWS::ServiceName::ResourceType
Properties:
PropertyName1: PropertyValue1
...
Bei der Erstellung von Ressourcen ist die folgende AWS-Dokumentation sehr hilfreich, da sie Informationen über alle Ressourcentypen und ihre Eigenschaften enthält: AWS CloudFormation-Vorlagen-Referenzhandbuch
Im Abschnitt Parameter können wir benutzerdefinierte Werte für unsere Parameter zur Laufzeit angeben, wenn wir den Stack bereitstellen. Wenn wir ihn über die CloudFormation-Konsole bereitstellen, haben wir ein Dropdown-Feld oder ein leeres Feld, in dem wir den gewünschten Wert auswählen oder eingeben können. Das einzige erforderliche Attribut ist Type.
Parameters:
ParameterLogicalID:
Description: Information about the parameter
Type: DataType
Default: value
AllowedValues:
- value1
- value2
Wenn Sie mehrere Stacks in demselben AWS-Konto und derselben Region haben, möchten Sie möglicherweise Informationen zwischen ihnen austauschen. Dies ist nützlich, wenn ein Stack die von einem anderen Stack erstellten Ressourcen nutzen muss.
Um Informationen zwischen Stapeln auszutauschen, müssen wir Ausgabewerte aus einem Stapel exportieren und in einen anderen Stapel importieren. Das Verfahren ist das folgende:
- In der Vorlage des ersten Stapels legen wir bestimmte Werte für den Export fest, indem wir das Feld Export im Abschnitt Outputs verwenden.
Outputs:
OutputLogicalID:
Description: Information about the value
Value: Value to return
Export:
Name: Name of resource to export
- Dann müssen wir diesen Stack erstellen/aktualisieren, damit der Ausgabewert exportiert und für andere Stacks verfügbar wird. (In der CloudFormation-Konsole können wir die Ausgabewerte für einen bestimmten Stack auf der Registerkarte "Outputs" sehen).
- In der Vorlage des anderen Stapels können wir dann die Funktion Fn::ImportValue verwenden, um die exportierten Werte aus dem ersten Stapel zu importieren.
- Wenn wir den zweiten Stapel erstellen/aktualisieren, wird der exportierte Wert automatisch abgerufen.
Eine genauere Erläuterung der einzelnen Abschnitte finden Sie in der AWS-Dokumentation:
Abschnitte der AWS CloudFormation-Vorlage
Stapel
Die CloudFormation-Stacks sind logische Gruppierungen von AWS-Ressourcen, die zu einem Projekt gehören sollen. Wenn Sie Ressourcen in dieser Ressourcengruppe hinzufügen, aktualisieren oder löschen möchten, können Sie dies durch Ändern des Stacks tun.
Erstellen eines Stacks - dies beinhaltet die Bereitstellung einer CloudFormation-Vorlage, die der Struktur und der Syntax folgt, die wir oben gezeigt haben. CloudFormation stellt dann die in der Vorlage beschriebenen Ressourcen bereit und konfiguriert sie.
Aktualisieren eines Stacks - dabei werden Änderungen an der Vorlage oder den Parametern vorgenommen. CloudFormation vergleicht das, was Sie übermitteln, mit dem aktuellen Zustand des Stacks und aktualisiert nur die geänderten Ressourcen. Es gibt zwei Methoden zur Aktualisierung von Stacks - mit Change Sets (wenn Sie eine Vorschau der Änderungen vor der Bereitstellung wünschen) oder über eine direkte Aktualisierung. Direkte Aktualisierung bedeutet, dass CloudFormation die Änderungen sofort bereitstellt.
Auf die Änderungssätze gehen wir später in diesem Beitrag noch genauer ein.
Löschen eines Stapels - damit werden alle mit dem Stapel verbundenen Ressourcen gelöscht.
Stapel Status Codes
Wenn Sie mit Stapeln arbeiten, müssen Sie den Statuscode Ihres Stapels verfolgen, um seinen Zustand zu kennen. Er sagt Ihnen, ob die Änderung erfolgreich war, ob sie fehlgeschlagen ist und zurückgenommen wurde, ob die Rücknahme erfolgreich war usw.
Um weitere Informationen darüber zu erhalten, was erstellt, aktualisiert oder gelöscht wurde und ob Fehler aufgetreten sind, sollten Sie Ihren Stapel auswählen und zur Registerkarte Ereignisse gehen. Dort sehen Sie die wahrscheinliche Ursache für den Fehler, wenn die Aktualisierung nicht erfolgreich war.
Im Folgenden finden Sie einige gängige Statuscodes und ihre Bedeutung:
- CREATE_IN_PROGRESS - Laufende Erstellung von einem oder mehreren Stapeln.
- CREATE_COMPLETE - Erfolgreiche Erstellung von einem oder mehreren Stapeln.
- CREATE_FAILED - Fehlgeschlagene Erstellung eines oder mehrerer Stapel. Der Grund für den Fehler wird auf der Registerkarte Ereignisse angezeigt.
- DELETE_IN_PROGRESS - Laufende Entfernung von einem oder mehreren Stapeln.
- DELETE_COMPLETE - Erfolgreiche Löschung von einem oder mehreren Stapeln. Gelöschte Stapel werden aufbewahrt und sind 90 Tage lang einsehbar.
- DELETE_FAILED - Fehlgeschlagenes Löschen eines oder mehrerer Stapel. Einige der Ressourcen konnten nicht gelöscht werden. Auf der Registerkarte Ereignisse können Sie sehen, warum. Sie müssen sie manuell löschen. (Ein möglicher Grund kann sein, dass die Ressource einen Abbruchschutz aktiviert hat).
- UPDATE_IN_PROGRESS - Laufende Aktualisierung von einem oder mehreren Stapeln.
- UPDATE_COMPLETE - Erfolgreiche Aktualisierung von einem oder mehreren Stapeln.
- UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - Laufende Entfernung alter Ressourcen für einen oder mehrere Stacks nach einer erfolgreichen Stack-Aktualisierung. Bei Stack-Aktualisierungen, bei denen Ressourcen ersetzt werden müssen, erstellt CloudFormation zunächst die neuen Ressourcen und löscht dann die alten Ressourcen, um Unterbrechungen Ihres Stacks zu vermeiden. In diesem Zustand wurde der Stack aktualisiert und ist nutzbar, aber CloudFormation löscht noch die alten Ressourcen.
- UPDATE_ROLLBACK_IN_PROGRESS - Laufende Rückkehr eines oder mehrerer Stapel in den vorherigen Arbeitszustand nach einer fehlgeschlagenen Stapelaktualisierung. In diesem Zustand können Sie den Stapel nicht aktualisieren.
- UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS - Laufende Entfernung neuer Ressourcen für einen oder mehrere Stacks nach einer fehlgeschlagenen Stack-Aktualisierung. In diesem Zustand wurde der Stack in seinen vorherigen Arbeitszustand zurückgerollt und ist nutzbar, aber CloudFormation löscht weiterhin alle neuen Ressourcen, die während der Stack-Aktualisierung erstellt wurden.
- UPDATE_ROLLBACK_COMPLETE - Erfolgreiche Rückkehr eines oder mehrerer Stapel in einen vorherigen Arbeitszustand nach einer fehlgeschlagenen Stapelaktualisierung.
- UPDATE_ROLLBACK_FAILED - Fehlgeschlagene Rückkehr eines oder mehrerer Stapel in einen früheren Arbeitszustand nach einer fehlgeschlagenen Stapelaktualisierung. In diesem Zustand können Sie den Stapel nicht aktualisieren. Sie haben die Möglichkeit, den Stack zu löschen oder den Rollback fortzusetzen. Um das Rollback fortzusetzen, müssen Sie zu Ihrem Stack gehen, auf Stack-Aktionen klicken und Rollback fortsetzen wählen. Im Abschnitt Zusatzinformationen sehen Sie, welche Ressourcen problematisch sind, und Sie können sie zum Überspringen markieren. Dann wird das Rollback erfolgreich abgeschlossen, und Sie müssen die fehlerhafte Ressource manuell reparieren. Wenn Sie keine dieser Maßnahmen durchführen möchten, können Sie sich an den Support wenden, um den Stack wieder in einen brauchbaren Zustand zu versetzen.
Informationen zu allen Stack-Statuscodes finden Sie in der folgenden AWS-Dokumentation:
CloudFormation-Stack-Ereignisse anzeigen
Sets ändern
Anhand der Änderungssätze können Sie sehen, was genau aktualisiert wird, nachdem Sie eine bestimmte Änderung vorgenommen haben. Sie zeigen Ihnen den Ausführungsplan.
Nachdem Sie eine Änderung an Ihrer Vorlage vorgenommen haben, können Sie zur CloudFormation-Konsole gehen, auf Ihren Stack klicken, zur Registerkarte Änderungssätze gehen und einen Änderungssatz erstellen. Sie werden aufgefordert, eine Vorlage entweder von Ihrem lokalen Dateisystem oder von S3 bereitzustellen.

Dann werden Sie, ähnlich wie bei der Erstellung eines Stacks, aufgefordert, einen Wert für die Parameter und eine IAM-Rolle anzugeben, die der Stack zur Erstellung oder Aktualisierung der Ressourcen verwenden soll.


Nachdem Sie den Änderungssatz erstellt haben, können Sie die Unterschiede zwischen Ihrer aktuellen Vorlage und der neuen Vorlage sehen und sicherstellen, dass sie genau dem entspricht, was Sie ändern möchten, bevor Sie den Änderungssatz ausführen. Sie erhalten auch Informationen darüber, ob die Ressource ersetzt wird oder nicht.


Wenn Sie bereit sind, den Änderungssatz auszuführen, können Sie auf die Schaltfläche Änderungssatz ausführen klicken, woraufhin Sie um folgende Angaben gebeten werden:
- Wie sollte sich der Stapel im Falle eines Fehlers verhalten?
- Alle Stack-Ressourcen auf den letzten bekannten stabilen Zustand zurücksetzen
- Bewahren Sie den Status erfolgreich bereitgestellter Ressourcen, während Sie fehlgeschlagene Ressourcen auf den letzten bekannten stabilen Status zurücksetzen. Ressourcen ohne letzten bekannten stabilen Zustand werden bei der nächsten Stapeloperation gelöscht.
- Was soll der Stack mit den neu erstellten Ressourcen während eines Rollbacks tun?
- Behalten oder löschen Sie erstellte Ressourcen gemäß der ihnen beigefügten Löschungsrichtlinie.
- Löschen Sie erstellte Ressourcen während eines Rollbacks unabhängig von der ihnen zugeordneten Löschrichtlinie.

Verschachtelte Stapel
Wenn Sie wiederholt identische Ressourcenkonfigurationen in mehreren Vorlagen erstellen, können Sie verschachtelte Stapel verwenden. Sie sind eine Möglichkeit, die gemeinsamen Konfigurationen in dedizierten Vorlagen zu trennen. Sie können einen verschachtelten Stack innerhalb eines übergeordneten Stacks erstellen, indem Sie die Ressource AWS::CloudFormation::Stack verwenden.
Hier ist ein Beispiel für einen übergeordneten Stapel mit zwei verschachtelten Stapeln - einer für eine Sicherheitsgruppe und ein weiterer für eine EC2-Instanz.
Die übergeordnete Vorlage:
AWSTemplateFormatVersion: "2010-09-09"
Description: Parent template with nested stacks for Security Group and EC2 Instance
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to SSH into the instance
Type: AWS::EC2::KeyPair::KeyName
Resources:
SecurityGroupStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: <https://s3.amazonaws.com/demo-bucket/s3-nested-stack.yaml>
EC2InstanceStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: <https://s3.amazonaws.com/demo-bucket/ec2-nested-stack.yaml>
Parameters:
KeyName: !Ref KeyName
SecurityGroupId: !GetAtt SecurityGroupStack.Outputs.SecurityGroupId
Outputs:
InstanceId:
Description: The EC2 Instance ID
Value: !GetAtt EC2InstanceStack.Outputs.InstanceId
Die verschachtelte Stapelvorlage der Sicherheitsgruppe:
AWSTemplateFormatVersion: "2010-09-09"
Description: Security Group for EC2 instance
Resources:
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 100.200.100.200/32
Outputs:
SecurityGroupId:
Description: The Security Group ID
Value: !Ref InstanceSecurityGroup
Die EC2-Instanz verschachtelte Stapelvorlage:
AWSTemplateFormatVersion: "2010-09-09"
Description: EC2 instance
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair
Type: AWS::EC2::KeyPair::KeyName
SecurityGroupId:
Description: Security Group ID
Type: String
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
KeyName: !Ref KeyName
ImageId: ami-08c40ec9ead489470
SecurityGroupIds:
- !Ref SecurityGroupId
Outputs:
InstanceId:
Description: The Instance id
Value: !Ref EC2Instance
In der CloudFormation-Konsole werden die verschachtelten Stapel mit dem Label NESTED versehen.


Jeder verschachtelte Stapel kann weitere verschachtelte Stapel enthalten. Der Wurzelstapel ist der oberste Stapel, zu dem letztlich alle verschachtelten Stapel gehören. Wenn ein Stapel NESTED ist, bedeutet dies, dass er einen unmittelbaren Elternstapel hat. Für die erste Ebene der verschachtelten Stapel ist der Wurzelstapel auch der übergeordnete Stapel.
Drift-Erkennung
CloudFormation verfügt über eine Option zur Erkennung von Abweichungen, die regelmäßig ausgeführt werden kann, um zu prüfen, ob die Konfiguration einer Ressource von der vorgesehenen Konfiguration abgewichen ist.
Im obigen Beispiel habe ich die eingehende Regel der Sicherheitsgruppe manuell geändert. Dann ging ich zu dem verschachtelten Stapel, der sie bereitstellte, und klickte auf Stapelaktionen > Drift erkennen. Ein Prozess zur Erkennung von Drifts wurde gestartet. Nachdem er abgeschlossen war, ging ich zu Stack-Aktionen > Driftergebnisse anzeigen. Dies zeigte mir, dass die Sicherheitsgruppe geändert worden war.

Wenn Sie die geänderte Ressource auf der Seite "Drifts" auswählen, können Sie auf " Driftdetails anzeigen " klicken und genau sehen, welche Eigenschaft geändert wurde. Wenn Sie dann zur AWS-Konsole gehen, die Änderung manuell rückgängig machen und Detect drift erneut ausführen, wird die Ressource, die zuvor den Status MODIFIED hatte, nun IN_SYNC angezeigt.
Eine andere Möglichkeit, die Synchronisierung zu beheben, besteht darin, die Ressource aus der Vorlage zu entfernen und den Stack-Aktualisierungsvorgang auszuführen. Nachdem die Ressource nicht mehr vom Stack verwaltet wird, sollten Sie sie wieder hinzufügen und den Stack erneut bereitstellen.
Stapel-Sets
Wenn Sie mehrere Konten in einer AWS-Organisation verwalten und in der Lage sein müssen, dieselben Ressourcen automatisch für mehr als ein Konto und mehr als eine Region bereitzustellen, sollten Sie die Verwendung von CloudFormation Stack Sets in Betracht ziehen.
Ein Stack-Set kann als normale CloudFormation-Ressource mit dem Typ AWS::CloudFormation::StackSet bereitgestellt werden. In dieser Ressource können Sie Ziele angeben - das sind die Konten, für die Sie bereitstellen möchten. Wenn Sie die Stamm-ID Ihrer Organisation als Ziel festlegen, werden die beschriebenen Ressourcen im StackSet auf alle Konten angewendet, und wenn ein neues Konto hinzugefügt wird, können Sie sie automatisch darauf bereitstellen, indem Sie das StackSet erneut bereitstellen. Sie können auch alle Regionen angeben, für die Sie die benötigten Ressourcen bereitstellen möchten. Auf die Besonderheiten der Stack-Sets werden wir in einem anderen Beitrag näher eingehen.
Schlussfolgerung
CloudFormation bietet eine leistungsstarke Möglichkeit, die AWS-Infrastruktur mithilfe von Code zu definieren und bereitzustellen. Sie können Ihre Umgebung auf konsistente und reproduzierbare Weise beschreiben, indem Sie Vorlagen schreiben. Stacks und verschachtelte Stacks helfen Ihnen bei der effizienten Organisation und Verwaltung von Ressourcen, während Änderungssätze Ihnen Einblick in die Änderungen geben, bevor sie angewendet werden, wodurch das Fehlerrisiko minimiert wird.
Über die Grundlagen hinaus bietet CloudFormation Funktionen wie:
- Rollback und automatische Ressourcenlöschung zum Schutz der Umwelt;
- Ausführungspläne über Änderungssets, die Ihnen Einblick in die Änderungen geben, bevor sie angewendet werden, wodurch das Fehlerrisiko minimiert wird;
- Option Drifterkennung;
- Regions- und kontoübergreifende Bereitstellung für komplexe Setups über Stacksets.
Mit CloudFormation können wir die Infrastrukturverwaltung automatisieren, die Zuverlässigkeit verbessern und einen klaren, überprüfbaren Lebenszyklus der Infrastruktur aufrechterhalten.
Entdecken Sie die Dienstleistungen von ITGix und erfahren Sie mehr über unser Know-how.

