Read in English · Leer en español · Lire en français
Abschnitt 10.4 von 10.8 · Fortgeschritten · 24 Min. Lesezeit
Infrastructure as Code und Immutable Infrastructure
Videolektion
5 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Klicks durch eine Cloud-Konsole werden nicht geprüft, nicht festgehalten und lassen sich nicht wiederholen. In dieser Lektion sehen Sie, wie Infrastruktur zu Code wird: deklariert, geplant, geprüft, angewendet und ehrlich gehalten.
Stellen Sie sich vor, Sie richten ein Hotel mit zweihundert identischen Zimmern ein. Sie könnten jedem Dekorateur sagen, was zu tun ist, und hoffen, dass er es sich merkt. Oder Sie schreiben eine präzise Spezifikation für ein Zimmer, bewahren sie in einem Ordner auf und lassen jede Änderung schriftlich genehmigen. Dann lässt sich jedes Zimmer daran prüfen, ein beschädigtes exakt wiederherstellen und ein neuer Flügel in Tagen ausstatten. Infrastructure as Code ist diese Spezifikation für die Computer, Netzwerke und Datenbanken, auf denen ein System läuft.
Infrastructure as Code, kurz IaC, bedeutet, Netzwerke, Maschinen, Datenbanken und Berechtigungen in Dateien unter Versionsverwaltung zu definieren. Ein imperatives Skript listet die Schritte auf: ein Netzwerk erstellen, dann ein Subnetz, dann eine Datenbank. Führt man es zweimal aus, versucht es alles zweimal zu erstellen. Ein deklaratives Tool beschreibt stattdessen den Endzustand und ermittelt die Schritte, indem es diese Beschreibung mit dem Bestehenden vergleicht. Ein zweites Anwenden ändert also nichts mehr. Diese Eigenschaft, die Idempotenz, macht Infrastrukturcode sicher für wiederholte, automatisierte Ausführung. Terraform wurde zum meistgenutzten Multi-Cloud-Tool. 2023 stellte HashiCorp es von einer Open-Source-Lizenz auf die Business Source License um, und die Community forkte es als OpenTofu. Die Lehre: Lizenz und Governance eines Tools sind Teil seines Risikos.
So funktioniert ein Tool wie Terraform oder OpenTofu. Der Code, in Git abgelegt, sagt, was existieren soll. Das State-File ordnet jede Ressource im Code dem realen Objekt zu, das das Tool erstellt hat. Es muss remote, während Änderungen gesperrt, versioniert und als Secret behandelt werden, weil es oft Passwörter im Klartext enthält. Der Plan vergleicht den Code, den State und die reale Infrastruktur, gelesen über die API des Providers. Er zeigt, was sich ändern würde, bevor etwas passiert, und Reviewer lesen ihn im Pull Request. Erst nach dem Review wird er angewendet. Apply ändert die reale Infrastruktur und hält das Ergebnis im State fest. Ändert aber jemand etwas von Hand in der Konsole, entspricht die reale Infrastruktur nicht mehr dem Code. Das ist Drift, und der nächste Plan wird versuchen, sie rückgängig zu machen.
So sieht Drift in der Praxis aus. Während eines Incidents am Freitagabend öffnet ein Engineer über die Konsole die Firewall der Produktions-Bestelldatenbank für die IP-Adresse eines Dienstleisters. Niemand aktualisiert den Code. Am Samstag führt der nächtliche Drift-Job einen Plan für jeden Produktions-State aus. Er meldet eine Änderung für diese Firewall und postet sie an das Plattformteam. Der Plan zeigt die zusätzliche Adresse, und das Audit-Log der Cloud zeigt, wer sie wann und zu welchem Incident hinzugefügt hat. Der Zugriff war vorübergehend und der Incident ist vorbei, also ist der Code richtig und die Realität falsch. Das Anwenden des Plans entfernt die Regel. Wäre die Änderung dauerhaft nötig gewesen, käme sie über einen geprüften Pull Request in den Code. Danach wird Schreibzugriff in der Produktionskonsole zu einer Notfallrolle, die eine Begründung verlangt und einen Alarm auslöst. Die Faustregel: Jede Abweichung wird bis zum nächsten Arbeitstag in Code übernommen oder rückgängig gemacht.
Wiederverwendbare Module verbergen Provider-Details hinter einer kleinen Schnittstelle, etwa Name, Größe und Hochverfügbarkeit. Staging und Produktion nutzen dieselben versionierten Module mit unterschiedlichen Eingaben, nie kopierten Code, der binnen Monaten auseinanderläuft. Immutable Infrastructure bedeutet, einen laufenden Server nie zu ändern. Jede Änderung, selbst ein Betriebssystem-Patch, ist ein neues Image, das die alten Instanzen ersetzt. Es gibt keine Drift, und ein Rollback ist das erneute Deployment des vorherigen Images. Und Policy as Code macht Regeln wie „keine öffentlichen Storage-Buckets“ und „verschlüsselte Datenbanken“ zu automatischen Prüfungen bei jedem Plan, erklärt im Pull Request.
GitOps wendet den Reconciliation Loop aus Abschnitt zehn Punkt zwei auf ganze Umgebungen an. Ein Entwickler pusht Code, und die Pipeline testet ihn, baut ein Image und pusht es in eine Registry. Dann committet die Pipeline den neuen Image-Digest in ein Konfigurations-Repository, das den gewünschten Zustand enthält. Änderungen daran werden wie jeder Code geprüft. Im Cluster ruft ein Agent wie Argo CD oder Flux dieses Repository ab, wendet es an und korrigiert fortlaufend Drift. Eine manuelle Änderung hält nur bis zur nächsten Synchronisierung. Weil der Agent abruft, braucht die Pipeline keine Zugangsdaten für die Produktion. Git wird zum Audit-Log, und ein Rollback ist ein geprüfter Revert.
Der vollständige Abschnitt vergleicht die Tools, zeigt, wie man Infrastrukturcode testet, und endet mit einer Checkliste für die Produktion. Als Nächstes verfolgen wir in Abschnitt zehn Punkt fünf eine Änderung vom Commit bis in die Produktion. Bis gleich.
Was Sie wissen müssen
- Infrastructure as Code definiert Infrastruktur in versionierten Dateien, die von Tools angewendet werden, und macht Umgebungen reproduzierbar, überprüfbar, auditierbar und schnell erstellbar.
- Deklarative Tools beschreiben den gewünschten Endzustand und berechnen die Schritte, wodurch wiederholte Läufe idempotent werden; imperative Skripte listen Schritte auf und lassen sich nur schwer sicher erneut ausführen.
- HashiCorp stellte Terraform im August 2023 auf die Business Source License um; der Fork OpenTofu folgte unter der Linux Foundation (stabil seit Januar 2024, seit 2025 ein CNCF-Sandbox-Projekt); CloudFormation, Bicep, Pulumi und Crossplane sind die wichtigsten Alternativen.
- Der State ordnet Code realen Ressourcen zu; er muss remote, gesperrt, versioniert und zugriffsbeschränkt sein und aufgeteilt werden, um den Blast Radius zu begrenzen, und Drift muss durch geplante Plan-Läufe erkannt und dann in Code übernommen oder rückgängig gemacht werden.
- Versionierte Module mit kleinen Schnittstellen, über Umgebungen hinweg mit unterschiedlichen Eingaben wiederverwendet, verhindern, dass per Copy-and-paste erstellte Umgebungen auseinanderlaufen.
- Immutable Infrastructure ersetzt Server und Container aus neuen Images, statt sie an Ort und Stelle zu ändern; Konfigurationsmanagement bleibt nützlich für langlebige Landschaften und zum Bauen von Images.
- GitOps hält den gewünschten Zustand in Git und lässt Agenten im Cluster (Argo CD, Flux) ihn abrufen und fortlaufend abgleichen; Policy as Code und mehrstufige Tests machen Änderungen sicher.
Was Infrastructure as Code ist
Infrastructure as Code (IaC) bedeutet, Netzwerke, virtuelle Maschinen, Cluster, Datenbanken, Queues, DNS-Einträge, Berechtigungen und jedes andere Stück Infrastruktur in Textdateien unter Versionsverwaltung zu definieren und Tools die realen Ressourcen aus diesen Dateien erstellen und ändern zu lassen. Statt dass sich jemand durch eine Cloud-Konsole klickt, ist eine Änderung ein Commit: in einem Pull Request geprüft, in einer Pipeline getestet, automatisch angewendet und für immer festgehalten.
Die Idee ist älter als die Public Cloud. Mark Burgess’ CFEngine (1993) verwaltete Unix-Maschinen anhand deklarativer Richtlinien; Puppet (2005), Chef (2009) und Ansible (2012) brachten das Konfigurationsmanagement in den Mainstream. Die Cloud machte es unverzichtbar, weil die Infrastruktur selbst über APIs verfügbar wurde: AWS CloudFormation (2011) und HashiCorps Terraform (2014) beschreiben ganze Umgebungen, nicht nur die Software auf Servern. Kief Morris’ Buch Infrastructure as Code, inzwischen in der dritten Auflage (2025), ist die Standarddarstellung der Praxis und ihrer Prinzipien.
Die Vorteile sind die des Software-Engineerings, angewandt auf Infrastruktur. Umgebungen werden reproduzierbar: Staging lässt sich aus denselben Definitionen bauen wie die Produktion, und eine Region lässt sich nach einer Katastrophe aus Code statt aus dem Gedächtnis neu aufbauen. Änderungen werden überprüfbar und auditierbar, was Aufsichtsbehörden und Sicherheitsteams schätzen. Wissen steckt nicht mehr nur im Kopf eines einzelnen Engineers. Und das Tempo steigt, weil das Erstellen einer Umgebung für einen neuen Service der Essenslieferplattform zu einem Pull Request wird statt zu einem Ticket, das zwei Wochen wartet.
Deklarativ oder imperativ
Ein imperativer Ansatz listet die Schritte auf: ein Netzwerk erstellen, dann ein Subnetz, dann eine Datenbank, dann diesen Port öffnen. Wer das Skript zweimal ausführt, versucht alles zweimal zu erstellen. Ein deklarativer Ansatz beschreibt den Endzustand, den gewünschten Zustand aus Abschnitt 10.2: ein Netzwerk mit diesen Subnetzen, eine Datenbank dieser Größe, eine Firewall, die diesen Port erlaubt. Das Tool vergleicht die Beschreibung mit dem, was existiert, und ermittelt die Schritte, sodass ein zweites Anwenden nichts mehr ändert. Diese Eigenschaft, die Idempotenz, macht Infrastrukturcode sicher für wiederholte und automatisierte Ausführung.
Die meisten ausgereiften Tools sind im Kern deklarativ, unterscheiden sich aber in der Sprache, in der die Deklaration geschrieben wird, und darin, wer festhält, was existiert. Die Tabelle fasst die wichtigsten Familien zusammen.
Ansätze für Infrastrukturcode
| Ansatz | Sie schreiben | Beispiele | Stärken | Schwächen |
|---|---|---|---|---|
| Imperative Skripte | Folgen von CLI- oder SDK-Aufrufen | Shell-Skripte, die Cloud-CLIs aufrufen, SDK-Programme | Vertraut, flexibel, schnell für einmalige Aufgaben | Ohne große Sorgfalt nicht idempotent; kein Nachweis, was existiert; schwer sicher zu ändern |
| Deklarativ, domänenspezifische Sprache | Ressourcen und ihre Beziehungen in einer Konfigurationssprache | Terraform und OpenTofu (HCL), AWS CloudFormation (YAML oder JSON), Azure Bicep, Kubernetes-Manifeste | Lesbare, überprüfbare Pläne; idempotent; große Provider-Ökosysteme | Schleifen, Bedingungen und Abstraktion können umständlich sein; eine Sprache zum Lernen |
| Deklaratives Modell, Universalsprache | Code in TypeScript, Python, Go, C# oder Java, der ein deklaratives Modell aufbaut | Pulumi, AWS Cloud Development Kit (CDK) | Echte Abstraktionen, Testwerkzeuge und Editoren; Entwicklern vertraut | Leicht, cleveren, schwer zu prüfenden Infrastrukturcode zu schreiben; der Plan ist im Code weniger sichtbar |
| Kontinuierlicher Abgleich | Ressourcen im Kubernetes-Stil, die Cloud-Infrastruktur beschreiben | Crossplane, Kubernetes-Controller der Cloud-Anbieter | Derselbe Reconciliation Loop und dieselben Tools wie für Anwendungen; Drift wird fortlaufend korrigiert | Braucht eine Kubernetes-Control-Plane; die Fehlersuche erstreckt sich über zwei Systeme |
| Konfigurationsmanagement | Gewünschte Konfiguration von Software auf bestehenden Servern | Ansible, Chef, Puppet | Verwaltet langlebige Maschinen, Netzwerkgeräte und On-Premises-Landschaften | Server sammeln Historie und Drift an; langsamer und weniger vorhersehbar als ihr Ersetzen |
Die Tools und der Fork OpenTofu
Terraform wurde zum meistgenutzten Multi-Cloud-Tool, weil eine Sprache und ein Workflow Tausende von Providern abdecken: AWS, Azure, Google Cloud, Cloudflare, Kubernetes, GitHub, Monitoring-Dienste und mehr. Am 10. August 2023 stellte HashiCorp Terraform von der Open-Source-Lizenz Mozilla Public License 2.0 auf die Business Source License 1.1 um, die interne und kommerzielle Nutzung erlaubt, aber verbietet, es in Produkten anzubieten, die mit HashiCorps eigenen konkurrieren. Version 1.5.7 war das letzte Release unter der alten Lizenz.
Die Antwort der Community war ein Fork. Innerhalb weniger Tage erschien ein Manifest, das eine Rückkehr zu Open Source forderte; im September 2023 nahm die Linux Foundation den Fork als OpenTofu auf; sein erstes stabiles Release, 1.6.0, folgte im Januar 2024; und 2025 wurde es als Sandbox-Projekt in die CNCF aufgenommen. IBM schloss die Übernahme von HashiCorp im Februar 2025 ab. Die beiden Tools bleiben in Sprache und Providern weitgehend kompatibel, entwickeln sich aber bei den Funktionen auseinander: OpenTofu hat zum Beispiel eine clientseitige Verschlüsselung des State ergänzt, während Terraforms kommerzielle Plattform eigene Fähigkeiten hinzugefügt hat. Für Architektinnen und Architekten erinnert die Episode daran, dass Lizenz und Governance eines Tools Teil seines Risikoprofils sind und dass offene Standards und eine glaubwürdige Alternative dieses Risiko beherrschbar halten.
Unter den Tools für eine einzelne Cloud werden AWS CloudFormation (2011) und Microsofts Bicep (2020 eingeführt, kompiliert zu Azure-Resource-Manager-Templates) vom Anbieter betrieben, der festhält, was existiert, sodass kein State-File zu verwalten ist, um den Preis der Bindung an eine Cloud. Pulumi (2018) und das AWS CDK lassen Entwickler Infrastruktur in Universalsprachen schreiben; Crossplane erweitert Kubernetes, um Cloud-Ressourcen per Abgleich zu verwalten. Die richtige Wahl hängt davon ab, welche Clouds Sie nutzen, von den Fähigkeiten Ihres Teams, der Reife der benötigten Provider, der Lizenzpolitik und dem, was der Rest der Organisation bereits einsetzt; Einheitlichkeit über Teams hinweg ist meist mehr wert als die Vorzüge eines einzelnen Tools im Detail.
terraform {
required_version = ">= 1.6"
backend "gcs" { # remote state; this backend locks natively
bucket = "fd-infra-state"
prefix = "orders/prod"
}
}
variable "environment" { type = string }
module "orders_db" {
source = "git::https://git.example.com/modules/postgres.git?ref=v3.2.0"
name = "orders-${var.environment}"
size = var.environment == "prod" ? "large" : "small"
high_avail = var.environment == "prod" # standby in a second zone
backup_days = 14
}
output "orders_db_host" {
value = module.orders_db.host
}Das Ausführen von tofu plan (oder terraform plan) zeigt, was sich ändern würde, bevor irgendetwas passiert. Der Plan ist das wichtigste Artefakt im Workflow: Reviewer lesen ihn im Pull Request neben dem Code, und genau er wird angewendet.
# module.orders_db.google_sql_database_instance.this will be updated in-place
~ resource "google_sql_database_instance" "this" {
~ settings {
~ tier = "db-custom-2-8192" -> "db-custom-4-16384"
}
}
Plan: 0 to add, 1 to change, 0 to destroy.State, Locking und Drift
Deklarative Tools müssen wissen, welche realen Ressourcen zu welchen Definitionen gehören. Terraform und OpenTofu halten das im State fest: einer Datei, die jede Ressource im Code der Kennung des realen Objekts zuordnet, mit ihren zuletzt bekannten Attributen. Die Planung vergleicht drei Dinge: den Code (was existieren soll), den State (was das Tool erstellt hat) und die reale Infrastruktur, gelesen über die API des Providers (was tatsächlich existiert).
Plan, Apply, State und Drift
Der State braucht Sorgfalt, weil er kritisch und sensibel ist. Er muss remote gespeichert werden (in Object Storage oder einem verwalteten Dienst), nicht auf einem Laptop, damit das ganze Team und die Pipeline dieselbe Version teilen. Er muss während Änderungen gesperrt sein, damit sich zwei Applies nicht überlagern und ihn beschädigen. Er muss gesichert und versioniert werden, weil ein verlorenes State-File das Tool ohne Kenntnis der Ressourcen lässt, die es erstellt hat. Und er ist ein Secret: Der State enthält oft Datenbankpasswörter und Schlüssel im Klartext, also muss der Zugriff darauf beschränkt und er im Ruhezustand verschlüsselt sein (OpenTofu kann ihn auch clientseitig verschlüsseln).
Drift ist jede Abweichung zwischen Code und Realität, meist durch hastige manuelle Änderungen, durch ein anderes Tool, das dieselbe Ressource anfasst, oder durch einen teilweisen Fehlschlag beim Apply. Drift ist gefährlich, weil der nächste Apply stillschweigend eine Änderung zurücknehmen kann, auf die sich jemand verlassen hat, oder in der Produktion an einer Abweichung scheitert, von der niemand wusste. Teams erkennen sie, indem sie regelmäßig (zum Beispiel nächtlich) einen Plan ausführen und bei jeder vorgeschlagenen Änderung alarmieren, und verhindern sie, indem sie Schreibzugriff in der Konsole auf ein protokolliertes Break-Glass-Verfahren beschränken.
Der State bestimmt auch den Blast Radius. Ein riesiger State für ein ganzes Unternehmen bedeutet, dass jeder Plan langsam ist, jeder Apply alles riskiert und ein einziger Lock jedes Team blockiert. Den State nach Komponente und Umgebung aufzuteilen (Netzwerk, gemeinsamer Cluster, die Ressourcen jedes Service; Produktion getrennt von Staging) hält Pläne schnell und Ausfälle begrenzt, um den Preis, Ausgaben wie Netzwerkkennungen zwischen States weiterzugeben. Refactoring wird unterstützt: moved-Blöcke benennen Ressourcen um, ohne sie zu zerstören, und import übernimmt bestehende, von Hand erstellte Ressourcen in die Verwaltung.
Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: eine abgedriftete Firewall-Regel
Während eines Incidents am Freitagabend öffnet ein Engineer über die Cloud-Konsole die Firewall der Bestelldatenbank in der Produktion für die IP-Adresse eines externen Dienstleisters, damit dieser bei der Diagnose einer langsamen Abfrage helfen kann. Niemand aktualisiert den Code.
| Erkennung | Der nächtliche Drift-Job führt tofu plan für jeden Produktions-State aus. Am Samstag meldet er 1 to change für die Firewall der Bestelldatenbank und postet den Plan in den Kanal des Plattformteams. |
|---|---|
| Diagnose | Der Plan zeigt eine zusätzliche erlaubte Quelladresse. Das Audit-Log der Cloud zeigt, wer sie hinzugefügt hat, wann und zu welchem Incident. |
| Entscheidung | Der Zugriff war vorübergehend, und der Incident ist abgeschlossen, also ist der Code richtig und die Realität falsch. Das Anwenden des Plans entfernt die Regel. Wäre die Änderung dauerhaft nötig gewesen, hätte die Korrektur darin bestanden, sie stattdessen über einen geprüften Pull Request in den Code aufzunehmen. |
| Vorbeugung | Schreibzugriff in der Produktionskonsole wird durch eine Break-Glass-Rolle ersetzt, die eine Begründung verlangt und bei Nutzung alarmiert. Eine Policy-Regel (siehe unten) lehnt jede Firewall-Regel für Datenbanken ab, die für das gesamte Internet offen ist. |
| Was es zeigt | Drift ist nicht nur ein Ordnungsproblem: Ein undokumentiertes Loch in einer Firewall ist ein Sicherheitsrisiko, und ohne Erkennung hätte der nächste, unabhängige Apply es entfernt, ohne dass jemand wusste, warum der Dienstleister den Zugang verlor. |
Die Faustregel: Die Realität darf in einem Notfall für Minuten vom Code abweichen, aber die Abweichung muss bis zum nächsten Arbeitstag entweder in Code übernommen oder rückgängig gemacht sein.
Module und Umgebungen
Ein Modul ist eine wiederverwendbare Einheit von Infrastrukturcode mit Eingaben und Ausgaben: eine PostgreSQL-Datenbank mit Backups und Monitoring, das Netzwerk und der Load Balancer eines Service, ein Standard-Namespace in Kubernetes mit seinen Quotas und Policies. Ein gutes Modul wendet das Information Hiding aus Kapitel 3 an: eine kleine Schnittstelle (Name, Größe, Hochverfügbarkeit ja oder nein) vor den vielen providerspezifischen Details, die ein Service-Team nicht kennen müssen sollte. Module werden wie Bibliotheken versioniert und veröffentlicht, und Umgebungen verweisen auf eine bestimmte Version, wie das ref=v3.2.0 im Beispiel, sodass eine Moduländerung die Produktion erst erreicht, wenn jemand bewusst aktualisiert.
Umgebungen sollten aus denselben Modulen mit unterschiedlichen Eingaben gebaut werden, nicht aus kopiertem Code. Ein gängiger Aufbau ist ein Verzeichnis (oder Repository) pro Umgebung und Komponente, jeweils mit eigenem State, das gemeinsame, versionierte Module aufruft; eine Änderung wird befördert, indem man Modulversion oder Eingaben zuerst im Staging, dann in der Produktion aktualisiert. Per Copy-and-paste erstellte Umgebungen laufen innerhalb von Monaten auseinander, bis Staging nichts mehr über die Produktion aussagt. Workspaces, die einer Konfiguration mehrere States geben, eignen sich besser für kurzlebige Kopien wie Testumgebungen pro Branch als für langlebige Produktions- und Staging-Umgebungen.
Hüten Sie sich vor Überabstraktion. Ein Modul mit vierzig booleschen Eingaben, das jedem Team dienen will, ist so schwer zu ändern wie der Code, den es ersetzt hat. Besser sind wenige meinungsstarke Module, die die Standards der Organisation abbilden; genau das bietet ein Plattformteam in Abschnitt 10.7 als Golden Path an.
Immutable Infrastructure oder Konfigurationsmanagement
Tools für Konfigurationsmanagement halten langlebige Server in einem beschriebenen Zustand: Ansible verbindet sich per SSH und pusht Änderungen ohne Agent; Chef und Puppet betreiben Agenten, die ihre Konfiguration abrufen und regelmäßig darauf konvergieren. Das funktioniert, aber jeder Server sammelt Historie an: Pakete, die während eines Incidents installiert wurden, von Hand bearbeitete Dateien, halb angewendete Updates. Martin Fowler nannte das Ergebnis einen Snowflake Server, einzigartig und nicht reproduzierbar, und schlug als Heilmittel den Phoenix Server vor, der regelmäßig niedergebrannt und von Grund auf neu aufgebaut wird.
Immutable Infrastructure, ein Begriff, den Chad Fowler 2013 bekannt machte, führt das Heilmittel zu Ende: einen laufenden Server nie ändern. Jede Änderung, ob ein Anwendungsrelease oder ein Betriebssystem-Patch, erfolgt durch den Bau eines neuen Images (eines Container-Images oder eines Maschinen-Images mit einem Tool wie Packer), seinen Test und das Ersetzen der alten Instanzen, typischerweise per Rolling- oder Blue-Green-Deployment. Container auf Kubernetes sind standardmäßig unveränderlich. Die Vorteile sind keine Drift, identische Instanzen, mühelos wiederholbare Umgebungen und Rollback durch erneutes Deployment des vorherigen Images; die Kosten sind eine Image-Pipeline, der Bedarf an entsorgbaren, zustandslosen Prozessen (Abschnitt 10.3) und eine längere Durchlaufzeit für eine einzelne dringende Änderung.
Konfigurationsmanagement ist nicht verschwunden. Es bleibt das richtige Werkzeug für Landschaften, die sich nicht als Ganzes ersetzen lassen: On-Premises-Server, Netzwerkausrüstung, Datenbanken auf dedizierter Hardware und die Basis-Images selbst, die oft gebaut werden, indem Ansible innerhalb des Image-Builds läuft. Die architektonische Regel lautet, Veränderlichkeit so weit nach unten und so früh wie möglich zu verlagern: beim Bau der Images konfigurieren und dann das Laufende als schreibgeschützt behandeln.
GitOps
GitOps wendet den Reconciliation Loop aus Abschnitt 10.2 auf ganze Umgebungen an. Den Begriff prägte 2017 Alexis Richardson von Weaveworks, dem Unternehmen hinter dem Tool Flux. Das Projekt OpenGitOps, eine Arbeitsgruppe der CNCF, definiert vier Prinzipien: Der gewünschte Zustand ist deklarativ; er ist versioniert und unveränderlich, mit vollständiger Historie; er wird von Software-Agenten automatisch abgerufen; und er wird fortlaufend abgeglichen, wobei Agenten den tatsächlichen Zustand beobachten und den gewünschten anwenden. Die beiden führenden Agenten, Argo CD und Flux, sind graduierte CNCF-Projekte; Flux wurde nach der Schließung von Weaveworks 2024 als Community-Projekt fortgeführt.
Ein GitOps-Auslieferungsablauf
Das Pull-Modell hat einen Sicherheitsvorteil gegenüber einer Pipeline, die Änderungen in den Cluster pusht: Das CI-System braucht keine Zugangsdaten für die Produktion, weil der Agent im Cluster selbst abruft, was er ausführen soll. Git wird zum Audit-Log und zur Schnittstelle für Änderungen, auch im Betrieb: Einen Service zu skalieren oder zurückzurollen ist ein geprüfter Commit oder ein Revert. Drift wird automatisch korrigiert, sodass ein manuelles kubectl edit nur bis zur nächsten Synchronisierung hält.
GitOps bringt eigene Entwurfsfragen mit. Secrets dürfen nicht im Klartext in Git liegen; Teams verschlüsseln sie (SOPS, Sealed Secrets) oder speichern Referenzen, die der External Secrets Operator aus einem Secrets Manager auflöst. Die Beförderung zwischen Umgebungen braucht eine Konvention, etwa ein Verzeichnis pro Umgebung mit Pull Requests, die einen neuen Image-Digest von Staging in die Produktion kopieren. Die automatische Drift-Korrektur muss in manchen Notfällen bewusst pausiert werden, und die Struktur des Repositorys muss die Zuständigkeiten abbilden, damit Teams ihre eigenen Services ändern können, ohne die anderer anzufassen. GitOps ist für Kubernetes am natürlichsten, aber dieselben Prinzipien gelten für Cloud-Infrastruktur über Crossplane oder über Pipelines, die Infrastrukturcode aus gemergten Commits planen und anwenden.
Policy as Code
Policy as Code drückt Regeln über Infrastruktur als maschinell prüfbaren Code aus statt als Wiki-Seite: Storage-Buckets dürfen nicht öffentlich sein, Datenbanken müssen verschlüsselt und gesichert sein, jede Ressource muss ein Tag für Verantwortliche und Kostenstelle tragen, nur zugelassene Regionen dürfen genutzt werden, Container dürfen nicht als Root laufen, Produktions-Images müssen aus der Registry des Unternehmens stammen. Die Prüfungen laufen an mehreren Stellen: auf dem Plan im Pull Request (Open Policy Agent mit Conftest, Checkov, HashiCorp Sentinel in seinen kommerziellen Produkten), bei der Zulassung in einen Kubernetes-Cluster (OPA Gatekeeper, Kyverno) und fortlaufend gegen laufende Ressourcen (Policy-Dienste der Cloud-Anbieter).
Policy as Code macht Governance von einem Review-Meeting zu einer schnellen, einheitlichen Leitplanke, die sich im Pull Request selbst erklärt. Sie funktioniert am besten, wenn Policies wenige, klar begründet, versioniert und wie jeder Code getestet sind, wenn sie im Warnmodus beginnen, bevor sie blockieren, und wenn es ein protokolliertes Ausnahmeverfahren gibt. Kapitel 11 behandelt, wie solche automatisierten Prüfungen in die Architektur-Governance passen (Architektur-Governance in agilen Organisationen).
Infrastrukturcode testen, von schnell bis langsam
- Statische Prüfungen bei jedem CommitFormatierung,
validate, Linting (zum Beispiel TFLint) und Sicherheitsscanner finden Syntaxfehler, veraltete Argumente und offensichtliche Fehlkonfigurationen in Sekunden. - Policy-Prüfungen auf dem PlanDen Plan als JSON ausgeben und gegen die Policies der Organisation auswerten; Reviewer sehen Verstöße im Pull Request.
- Modultests
terraform testundtofu testführen Assertions gegen ein Modul aus, mit gemockten Providern für schnelle Tests im Stil von Unit-Tests oder mit echten für Integrationstests. - Integrationstests in kurzlebigen UmgebungenDas Modul oder die Umgebung auf ein Wegwerfkonto anwenden, prüfen, ob es funktioniert (eine Datenbank nimmt Verbindungen an, ein Service antwortet), und es dann zerstören. Tools wie Terratest automatisieren das; es ist langsam und kostet Geld, also reservieren Sie es für gemeinsame Module.
- Plan-Review und gestufter RolloutZuerst auf Staging anwenden, dann auf die Produktion, aus denselben Versionen; ein Mensch liest jeden Produktionsplan, besonders Zerstörungen und Ersetzungen.
- Drift-Erkennung und WiederherstellungsübungenGeplante Plan-Läufe finden Drift; eine Umgebung regelmäßig aus Code neu aufzubauen beweist, dass der Code und nicht das Gedächtnis die Quelle der Wahrheit ist.
Checkliste: Infrastrukturcode bereit für die Produktion
Verwenden Sie sie, wenn Sie das Infrastruktur-Repository eines Teams oder ein neues Plattformmodul prüfen.
- Alles ist CodeKeine Produktionsressource existiert nur, weil jemand geklickt hat; bestehende, von Hand erstellte Ressourcen wurden importiert.
- Remote, gesperrter, verschlüsselter StateGemeinsames Backend mit Locking, Versionierung und eingeschränktem Zugriff; State nach Komponente und Umgebung aufgeteilt, um den Blast Radius zu begrenzen.
- Geprüfte PläneJede Änderung ist ein Pull Request, der den Plan zeigt; Zerstörungen und Ersetzungen zustandsbehafteter Ressourcen erfordern eine ausdrückliche Genehmigung.
- Versionierte ModuleUmgebungen pinnen Modulversionen; Staging und Produktion nutzen dieselben Module mit unterschiedlichen Eingaben, keine Kopien.
- Automatisch durchgesetzte PoliciesRegeln zu Verschlüsselung, Netzwerkfreigabe, Tagging und Regionen werden bei jedem Plan und bei der Zulassung in den Cluster geprüft.
- Secrets außerhalb von Code und GitZugangsdaten kommen aus einem Secrets Manager oder über Workload Identity; Zugriff auf den State wird wie Zugriff auf Secrets behandelt.
- Tests in der PipelineStatische und Policy-Prüfungen bei jeder Änderung; Modultests für gemeinsame Module; Integrationstests für kritische.
- Drift erkannt und behandeltGeplante Plan-Läufe alarmieren bei Abweichungen; Schreibzugriff in der Konsole ist ein protokolliertes Break-Glass-Verfahren.
- Wo möglich unveränderlichServer und Container werden aus Images ersetzt statt an Ort und Stelle gepatcht; Konfiguration geschieht beim Bau der Images.
- Wiederherstellung geübtEine Umgebung wurde innerhalb der vereinbarten Wiederherstellungszeit aus Code neu aufgebaut, einschließlich Datenwiederherstellung (siehe Abschnitt 10.6).
Prüfen Sie Ihr Verständnis
Warum ist Idempotenz für Infrastrukturcode wichtig?
Weil Automatisierung Code oft erneut ausführt. Ein deklaratives, idempotentes Tool ändert nichts, wenn die Realität bereits dem Code entspricht, also ist ein erneuter Lauf sicher; ein nicht idempotentes Skript versucht womöglich, alles noch einmal zu erstellen.
Nennen Sie drei Dinge, die ein Plan vergleicht, und was jedes darstellt.
Den Code (was existieren soll), den State (was das Tool erstellt hat und nachverfolgt) und die reale Infrastruktur, gelesen über die API des Providers (was tatsächlich existiert).
Warum sollte der State nicht als eine Datei für eine ganze Organisation geführt werden?
Ein einziger State bedeutet langsame Pläne, einen Lock, der jedes Team blockiert, und einen Blast Radius, der alles umfasst; die Aufteilung nach Komponente und Umgebung hält Änderungen schnell und Ausfälle begrenzt.
Welchen Sicherheitsvorteil hat das Pull-Modell von GitOps gegenüber einer Pipeline, die in den Cluster pusht?
Das CI-System braucht keine Zugangsdaten für die Produktion, weil ein Agent im Cluster den gewünschten Zustand aus Git abruft und anwendet.
Wann ist Konfigurationsmanagement noch eine gute Wahl?
Für langlebige Maschinen, die sich nicht einfach ersetzen lassen, etwa On-Premises-Server und Netzwerkgeräte, und zum Konfigurieren von Basis-Images während des Image-Builds.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Wie sollten wir unseren Terraform- oder OpenTofu-State für die Essenslieferplattform aufteilen, und wie verhindern wir, dass Leute Änderungen in der Konsole vornehmen?“