Terraform: Infrastruktur als Code für Cloud-Ressourcen verwalten

Server manuell in einer Web-Oberfläche anlegen, Firewall-Regeln per Klick konfigurieren, DNS-Einträge von Hand nachtragen – das war gestern. Mit Infrastructure as Code (IaC) wird die gesamte Serverinfrastruktur in Textdateien beschrieben, versioniert und reproduzierbar bereitgestellt. Terraform von HashiCorp ist dabei zum Quasi-Standard geworden: cloud-agnostisch, deklarativ und mit einer riesigen Provider-Bibliothek ausgestattet.

Was ist Terraform und warum IaC?

Terraform ermöglicht es, Cloud-Ressourcen – Server, Datenbanken, Netzwerke, DNS-Einträge – in der HashiCorp Configuration Language (HCL) zu beschreiben. Statt imperative Schritte auszuführen ("erstelle einen Server, dann konfiguriere die Firewall"), definiert man den gewünschten Zustand ("es soll ein Server mit diesen Eigenschaften existieren"). Terraform berechnet den Unterschied zum aktuellen Zustand und führt nur die nötigen Änderungen durch.

Der größte Vorteil: Infrastruktur liegt im Git-Repository, ist nachvollziehbar, überprüfbar und von jedem Teammitglied reproduzierbar. Environments wie Staging und Produktion können aus denselben Modulen mit unterschiedlichen Variablen aufgebaut werden.

HCL-Syntax: Die wichtigsten Blöcke

Eine Terraform-Konfiguration besteht aus mehreren Blocktypen. Der provider-Block definiert, welcher Cloud-Anbieter genutzt wird und wie die Authentifizierung erfolgt. resource-Blöcke beschreiben konkrete Ressourcen, variable-Blöcke machen Konfigurationen wiederverwendbar und output-Blöcke geben Werte nach dem Apply aus:

terraform {
  required_providers {
    hcloud = {
      source  = "hetznercloud/hcloud"
      version = "~> 1.45"
    }
  }
}

provider "hcloud" {
  token = var.hcloud_token
}

variable "hcloud_token" {
  description = "Hetzner Cloud API Token"
  type        = string
  sensitive   = true
}

resource "hcloud_server" "web" {
  name        = "web-server-01"
  image       = "ubuntu-24.04"
  server_type = "cx22"
  location    = "nbg1"
  ssh_keys    = [hcloud_ssh_key.default.id]
}

resource "hcloud_ssh_key" "default" {
  name       = "my-ssh-key"
  public_key = file("~/.ssh/id_ed25519.pub")
}

output "server_ip" {
  value = hcloud_server.web.ipv4_address
}
Tipp: Sensible Werte wie API-Tokens niemals direkt in .tf-Dateien schreiben. Nutzen Sie Umgebungsvariablen (TF_VAR_hcloud_token) oder einen Secret-Manager wie HashiCorp Vault.

Der Terraform-Workflow: init, plan, apply, destroy

Die vier Kernbefehle bilden den vollständigen Lifecycle einer Infrastruktur:

Das State-Konzept

Terraform speichert den aktuellen Zustand der verwalteten Infrastruktur in einer terraform.tfstate-Datei. Diese Datei ist das Gedächtnis von Terraform und enthält alle Ressourcen-IDs und Attribute. Lokale State-Dateien sind für Einzelpersonen praktisch, für Teams jedoch problematisch: Zwei Personen dürfen nie gleichzeitig einen Apply durchführen, und die State-Datei kann sensible Daten enthalten.

Die Lösung ist ein Remote Backend. Terraform Cloud bietet kostenloses Remote State Management mit State Locking, verschlüsselter Speicherung und einer Web-Oberfläche für Team-Workflows. Alternativ funktioniert ein S3-Bucket oder ein Azure Blob Storage als Backend.

Achtung: Die terraform.tfstate enthält oft Passwörter und private Schlüssel im Klartext. Niemals in Git committen! Fügen Sie *.tfstate und *.tfstate.backup zur .gitignore hinzu.

Praxisbeispiel: Hetzner Cloud Server

Das obige Beispiel provisioniert einen Hetzner-Cloud-Server der Größe cx22 (2 vCPUs, 4 GB RAM) in Nürnberg mit Ubuntu 24.04. Nach terraform apply gibt der Output-Block die öffentliche IP-Adresse aus. Mit der Hetzner-Cloud-Konsole vergleichen: Der Server existiert exakt so, wie er beschrieben wurde – und lässt sich jederzeit durch eine Änderung im Code aktualisieren. Die Dokumentation des Hetzner Cloud Providers listet alle verfügbaren Ressourcentypen.

Terraform vs. Pulumi vs. Ansible vs. AWS CloudFormation

Merkmal Terraform Pulumi Ansible CloudFormation
Sprache HCL Python, TypeScript, Go u.a. YAML JSON / YAML
Cloud-agnostisch Ja Ja Ja Nein (nur AWS)
State Management Eigene State-Datei Pulumi Cloud / selbst gehostet Kein internes State AWS intern
Konfigurationsmanagement Nein Nein Ja (Hauptstärke) Nein
Lernkurve Mittel Gering (bekannte Sprache) Gering Hoch
Community/Ökosystem Sehr groß Wachsend Sehr groß Mittel

Weiterführende Ressourcen

Die offizielle Terraform-Dokumentation ist umfassend und enthält interaktive Tutorials für alle gängigen Cloud-Provider. Das Terraform Registry bietet Tausende von offiziellen und Community-Providern sowie wiederverwendbare Module.

Häufige Fragen zu Terraform

Was ist der Unterschied zwischen Terraform und Ansible?
Terraform ist für die Provisionierung von Infrastruktur zuständig (Server erstellen, Netzwerke anlegen), Ansible für die Konfiguration bereits laufender Systeme (Pakete installieren, Dienste konfigurieren). In der Praxis werden beide oft kombiniert: Terraform erstellt die Ressourcen, Ansible konfiguriert sie anschließend.
Kann Terraform auch bestehende Infrastruktur importieren?
Ja, mit dem Befehl terraform import können bereits existierende Ressourcen in die State-Datei aufgenommen werden. Ab Terraform 1.5 gibt es zusätzlich Import-Blöcke direkt in der Konfiguration für einen deklarativen Import-Workflow.
Was passiert, wenn jemand eine Ressource manuell in der Cloud-Konsole ändert?
Terraform erkennt beim nächsten plan die Abweichung zwischen State-Datei und tatsächlichem Zustand und plant, den beschriebenen Zustand wiederherzustellen. Manuelle Änderungen werden also beim nächsten Apply überschrieben – ein wichtiges Argument für konsequente IaC-Disziplin.
Ist Terraform OpenSource nach der Lizenzänderung noch kostenlos nutzbar?
HashiCorp wechselte 2023 zur BUSL-Lizenz. Für die meisten kommerziellen Anwendungen ist Terraform weiterhin kostenlos nutzbar. Wer eine vollständig Open-Source-Alternative bevorzugt, kann auf OpenTofu zurückgreifen, den von der Linux Foundation betreuten Fork unter MPL-2.0-Lizenz.