Zurück zu den Artikeln
📄
infrastructure as codeIaCTerraformidempotencydeclarativeimperativecloud automation

Was steckt hinter dem Schlagwort „Infrastructure as Code“ und warum ist das wichtig?

Infrastructure as Code ersetzt fehleranfälliges Click-Ops in Cloud-Konsolen durch versionierten, auditierbaren und reproduzierbaren Code. Warum Deklarativität, Idempotenz und diszipliniertes State-Management das Fundament robuster Cloud-Infrastrukturen bilden.

Was steckt hinter dem Schlagwort „Infrastructure as Code“ und warum ist das wichtig?

Alle paar Jahre tauchen in der Softwarebranche Ideen auf, die im Rückblick erst als logisch erscheinen. „Infrastructure as Code“ – die Behandlung von Servern, Netzwerken und Cloud‑Ressourcen wie Anwendungscode – ist genau ein solches Konzept. Doch der Begriff hat den Status eines Buzzwords erreicht und wird sowohl überstrapaziert als auch zu wenig erklärt. Dieser Artikel soll den Nebel lichten und zeigen, worauf es wirklich ankommt.

Welches Problem IaC löst

Ohne IaC sieht die Infrastrukturverwaltung oft so aus:

  1. Jemand meldet sich in der AWS‑Konsole an.
  2. Klickt durch die Oberfläche, um Ressourcen zu erstellen.
  3. Notiert möglicherweise, was er getan hat, in einer Wiki‑Seite.
  4. Nach sechs Monaten braucht jemand eine ähnliche Umgebung neu aufzusetzen.
  5. Der Klickprozess wird erneut durchgeführt, diesmal leicht anders.
  6. Die Umgebungen unterscheiden sich nun, und niemand weiß den Grund.

Dieser klick‑orientierte Ansatz ist langsam, fehleranfällig und schwer zu überprüfen. Jeder manuelle Klick birgt das Risiko, dass ein kleiner Unterschied übersehen wird, und das Wiederholen des Vorgangs dauert unverhältnismäßig lange. Bei einem Ausfall einer Produktionsumgebung in der Nacht möchte man nicht durch eine Benutzeroberfläche klicken, während die Kunden Fehlermeldungen sehen – jede zusätzliche Sekunde erhöht den Schaden und lässt das Vertrauen der Nutzer schwinden.

Infrastructure as Code ersetzt den manuellen Prozess durch Code, der den gewünschten Zustand der Infrastruktur beschreibt. Der Code fungiert dabei als formale, maschinenlesbare Spezifikation, die exakt wiederholt werden kann. Er liegt in der Versionsverwaltung, Änderungen werden geprüft und Deployments sind automatisiert. So lässt sich jede Änderung nachvollziehen, rückgängig machen und in einem Review‑Prozess validieren. Das Ergebnis ist wiederholbar, überprüfbar und dokumentiert.

Was „Code“ tatsächlich bedeutet

Ein wesentliches Merkmal ist Idempotenz: Mehrfaches Ausführen sollte denselben Zielzustand erzeugen. Das bedeutet, dass das Ergebnis unverändert bleibt, egal wie oft das Skript gestartet wird. Wenn der Code fordert, dass es drei Web‑Server gibt, werden beim ersten Lauf drei Server erstellt. Beim nächsten Lauf werden die drei bereits bestehenden Server nicht mehr angelegt, sondern die Anwendung erkennt ihre Existenz und macht nichts weiter.

Dies ist wichtig, da die reale Infrastruktur mit der Zeit verändert wird – Server werden gepatcht, skaliert oder stillgelegt. Ohne Idempotenz würden neue Ausführungen ständig zusätzliche Ressourcen erzeugen. Der Code muss sich dem gewünschten Zustand annähern, nicht dauerhaft doppelte Ressourcen anhäufen.

Deklarativ vs Imperativ

Es gibt zwei Ansätze für IaC:

Deklarativ: Der gewünschte Endzustand wird beschrieben, und das Tool ermittelt den Weg dorthin.

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = { Name = "production-vpc" }
}

Imperativ: Eine Abfolge von Befehlen wird festgelegt, und das Tool führt sie in der angegebenen Reihenfolge aus.

- name: Erstelle VPC
  community.aws.ec2_vpc_net:
    name: production-vpc
    cidr_block: 10.0.0.0/16
    state: present

Terraform ist eines der am häufigsten eingesetzten deklarativen Werkzeuge. Ansible arbeitet imperativ, erreicht aber ebenfalls Idempotenz durch seine Module. Beide Modelle können das Ziel erreichen – die Wahl hängt von den Team‑Präferenzen und der Komplexität der Aufgabe ab.

Wichtige Werkzeuge

Terraform

HashiCorp Terraform [1] ist eines der am häufigsten eingesetzten IaC‑Werkzeuge für Cloud‑Infrastruktur. Seine Stärke liegt in der Provider‑Abdeckung: Terraform kann AWS, Azure, GCP und Hunderte weiterer Dienste über eine einheitliche Schnittstelle verwalten.

resource "aws_instance" "web" {
  ami           = "ami-12345678"
  instance_type = "t3.micro"
  vpc_security_group_ids = [aws_security_group.web.id]
  user_data = file("init.sh")
}

resource "aws_security_group" "web" {
  name = "web-sg"
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Terraform führt eine State‑Datei ein, die den bekannten Zustand der verwalteten Ressourcen dokumentiert. Diese Datei dient als verbindendes Bindeglied zwischen dem deklarativen Code und der tatsächlich existierenden Infrastruktur. Die korrekte Verwaltung dieses States – über Remote‑Backends, Sperren und Trennung der Umgebungen – ist daher zentral.

Stärken

  • Multi‑Cloud‑Konzept, das dieselbe Arbeitsweise über verschiedene Provider hinweg ermöglicht.
  • Großes Ökosystem von Providern und wiederverwendbaren Modulen, das die Einführung beschleunigt.
  • plan‑Phase zeigt Änderungen, bevor sie angewendet werden, und bietet damit ein Sicherheitsnetz.

Herausforderungen

  • Komplexität der State‑Verwaltung; Remote‑Speicherung und Locking sind unverzichtbar.
  • Lernkurve für HCL (HashiCorp Configuration Language), das keine allgemeine Programmiersprache ist.

Ansible

Red Hats Ansible [2] nimmt einen anderen Ansatz: Statt den gewünschten Zustand zu beschreiben, konfiguriert es vorhandene Systeme mittels idempotenter Aufgaben.

- name: Installiere und konfiguriere Nginx
  hosts: webservers
  become: yes
  tasks:
    - name: Installiere Nginx
      ansible.builtin.apt:
        name: nginx
        state: present
        update_cache: yes
    - name: Sorge dafür, dass Nginx läuft
      ansible.builtin.service:
        name: nginx
        state: started

Ansible ist agentenlos und verbindet sich meist über SSH. Das erleichtert den Einsatz in heterogenen Umgebungen, weil keine zusätzlichen Daemons installiert werden müssen.

Stärken

  • Keine Agenten erforderlich, sodass jedes erreichbare Hostsystem sofort ansprechen kann.
  • Lesbare YAML‑Syntax, die den Einstieg für neue Teammitglieder erleichtert.
  • Umfangreiche Modulbibliothek, die alles von Netzwerk bis Cloud‑Service abdeckt.

Herausforderungen

  • Impliziter Zustand (keine plan‑Phase); man muss darauf vertrauen, dass die Playbook‑Logik keine unbeabsichtigten Änderungen erzeugt.
  • Bei großen Provisionierungsaufgaben kann die sequentielle Ausführung über SSH langsamer sein als bei Terraform.
  • Umfangreiche Playbooks können durch die YAML‑Verbosity unübersichtlich werden.

Pulumi

Pulumi [3] verfolgt einen radikalen Ansatz: Infrastruktur wird in allgemeinen Programmiersprachen wie Python, TypeScript, Go, C# oder Java geschrieben.

import * as aws from "@pulumi/aws";

const vpc = new aws.ec2.Vpc("production", {
  cidrBlock: "10.0.0.0/16",
  tags: { Name: "production-vpc" },
});

Der Vorteil liegt in den vollen Features einer Programmiersprache – Schleifen, Funktionen, Bedingungen – sodass Logik elegant abstrahiert und wiederverwendet werden kann. Gleichzeitig können Entwickler, die bereits in diesen Sprachen arbeiten, sofort produktiv werden, weil keine neue DSL erlernt werden muss.

Stärken

  • Nutzung von echten Programmiersprachen, wodurch komplexe Abläufe sauber modellierbar sind.
  • Möglichkeit, Infrastruktur‑ und Anwendungscode zu teilen, was Doppelarbeit reduziert und Konsistenz erhöht.

Herausforderungen

  • Steilere Einstiegshürde für Operations‑Teams, die gewohnt deklarative DSLs verwenden.
  • Die State‑Verwaltung ist noch jünger als bei Terraform; das Ökosystem und die Best‑Practice‑Guidelines entwickeln sich noch.

Der IaC‑Workflow

Tag 0: Definieren

git clone git@github.com:myorg/infrastructure.git
cd infrastructure/production
terraform init

Tag 1: Bereitstellen

terraform plan   # Vorschau der Änderungen
terraform apply  # Infrastruktur anlegen

Der plan‑Schritt gibt dem Benutzer die Möglichkeit, unbeabsichtigte Änderungen zu entdecken, bevor sie ausgeführt werden. Manche Plattformen bieten ähnliche Vorschauen, doch nur Terraform liefert einen Review‑fähigen, provider‑unabhängigen Workflow.

Ab Tag 2: Pflegen

# Ein neues Subnetz hinzufügen
resource "aws_subnet" "private" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.2.0/24"
  tags       = { Name = "production-private" }
}

Jede Änderung wird erneut durch plan geprüft, sodass nur die notwendigen Anpassungen vorgenommen werden. Terraform vergleicht die Konfiguration mit dem bekannten Zustand und wendet ausschließlich die Differenz an – das verhindert unnötigen Churn und hält die Umgebung stabil.

Drift erkennen

Drift Detection findet Abweichungen zwischen Code und realer Infrastruktur.

terraform plan
# ± aws_subnet.private
#   tags.Name: "production-private" => "manual-tag-from-console"

Wenn jemand manuell einen Tag in der AWS‑Konsole ändert, zeigt Terraform die Abweichung, sodass entweder der Code angepasst oder die manuelle Änderung rückgängig gemacht werden kann. So bleibt die „Single Source of Truth“ erhalten.

Warum das für Organisationen zählt

Reproduzierbarkeit

Der gleiche Code kann Produktion, Staging und Entwicklung beschreiben; nur die Variablen ändern sich. Dadurch entstehen konsistente Umgebungen und das klassische „works on my machine“ verschwindet.

Geschwindigkeit

Eine Ressource, die in der UI zwanzig Minuten beansprucht, lässt sich per Code in Sekunden bereitstellen. Für ein komplettes System spart das Minuten bis Stunden und verkürzt die Release‑Zyklen erheblich.

Nachvollziehbarkeit

Jede Änderung erscheint in der Git‑Historie. Code‑Reviews, automatisierte Tests und Freigabe‑Workflows gelten für die Infrastruktur genauso wie für den Anwendungscode – das schafft Transparenz und reduziert das Risiko von Überraschungen im Live‑Betrieb.

Notfallwiederherstellung

Sollte eine primäre Region ausfallen, kann man mit demselben Code eine neue Umgebung in einer anderen Region aufbauen. Die eigentliche Wiederherstellung hängt natürlich von aktuellem State, Daten‑Backups, Provider‑Limits und gut geübten Verfahren ab, doch IaC macht den Prozess automatisierbar und reproduzierbar.

Sicherheit und Compliance

Policy‑as‑Code‑Tools wie Open Policy Agent oder Sentinel prüfen Sicherheits‑ und Compliance‑Regeln, bevor Änderungen angewendet werden.

package terraform.analysis

deny[msg] {
  resource := input.resource_changes[_]
  resource.type == "aws_s3_bucket"
  resource.change.after.acl == "public-read-write"
  msg := sprintf("S3 bucket %v must not be public", [resource.name])
}

Häufige Fehler

State‑Dateien

State-Dateien sind das zentrale Artefakt jeder Infrastructure as Code (IaC)-Konfiguration, weil sie den aktuellen Zustand aller Ressourcen im Team dokumentieren. Speichern Sie sie in sicheren Remote‑Backends wie S3 mit DynamoDB‑Locking oder Terraform Cloud und vermeiden Sie das Commiten in das Repository – so bleiben sensible IDs sicher und verhindern unnötige Inkonsistenzen.

Geheimnisse

Passwörter und API‑Tokens dürfen nicht im IaC‑Code stehen. Stattdessen nutze geheime Werte über Secret‑Manager (AWS Secrets Manager, HashiCorp Vault) oder injiziere Werte zur Laufzeit. So können Geheimnisse rotieren, ohne den Code zu ändern.

# Schlecht: Geheimnis im Code
database_password = "super-secret-password"

# Besser: Referenz zu einem Secret‑Manager
database_password = data.aws_secretsmanager_secret.db_password.value

Module ohne Verständnis wiederverwenden

Ein fehlerhaftes Modul würde sonst Schwachstellen in sämtliche Deployments einschleusen.

Das größere Bild

Infrastructure as Code stellt einen philosophischen Wandel dar: Infrastruktur wird zum Produkt, nicht zu einem einmaligen Projekt. Sie lässt sich versionieren, testen, prüfen und kontinuierlich verbessern – genau wie Anwendungscode. Die manuelle Verwaltung führt leicht zu „Snowflake‑Servern“, zu Drift zwischen Umgebungen und zu Wissen, das nur in den Köpfen einzelner Ingenieure steckt. IaC eliminiert diese Silos, macht die Komplexität für das gesamte Team greifbar und ermöglicht, dass jede:r im Team die Infrastruktur verstehen, reviewen und weiterentwickeln kann.

Quellen & Referenzen

  1. [1]
  2. [2]
  3. [3]
  4. [4]
  5. [5]
  6. [6]

Comments (0)

Loading comments...
Was steckt hinter dem Schlagwort „Infrastructure as Code“ und warum ist das wichtig? | Arne's Blog