# Terraform — Infrastruktur deklarativ als Code verwalten

> Praxis-Guide zu Terraform: Infrastructure as Code mit HCL, Provider-Ökosystem, State-Verwaltung und plan/apply-Workflow für Cloud-Ressourcen.

Source: https://www.jpkc.com/db/cheatsheets/cloud-iac/terraform/

<!-- PROSE:intro -->
Terraform von HashiCorp ist das De-facto-Standardwerkzeug für Infrastructure as Code: Statt Ressourcen per Klick anzulegen, beschreibst du sie deklarativ in der Konfigurationssprache HCL und überlässt Terraform den Abgleich mit dem Ist-Zustand. Über ein riesiges Provider-Ökosystem steuerst du AWS, Azure, Google Cloud und Hunderte weiterer Plattformen mit denselben Befehlen. Den Kern bildet der `plan`/`apply`-Workflow – erst zeigt dir Terraform, was sich ändern würde, dann setzt es die Änderungen um – während die State-Datei festhält, welche reale Ressource zu welchem Code-Block gehört. Dieser Guide führt dich durch die wichtigsten Kommandos vom Init bis zum Workspace-Handling.
<!-- PROSE:intro:end -->

## Initialisieren & Planen

`terraform init` — Initialisiert ein Arbeitsverzeichnis (lädt Provider und Module herunter).

```bash
terraform init
```

`terraform init -upgrade` — Initialisiert neu und aktualisiert die Provider-Plugins.

```bash
terraform init -upgrade
```

`terraform plan` — Zeigt die anstehenden Änderungen an, ohne sie anzuwenden.

```bash
terraform plan
```

`terraform plan -out=<file>` — Speichert den Plan in einer Datei für ein späteres Apply.

```bash
terraform plan -out=tfplan
```

`terraform plan -var '<key>=<value>'` — Plant mit einer überschriebenen Variable.

```bash
terraform plan -var 'region=eu-west-1'
```

`terraform plan -var-file=<file>` — Plant mit Variablen aus einer Datei.

```bash
terraform plan -var-file=prod.tfvars
```

`terraform plan -target=<resource>` — Plant Änderungen nur für eine bestimmte Ressource (mit Vorsicht einsetzen).

```bash
terraform plan -target=aws_instance.web
```

## Anwenden & Zerstören

`terraform apply` — Wendet die Änderungen an, um den Soll-Zustand zu erreichen.

```bash
terraform apply
```

`terraform apply <planfile>` — Wendet eine gespeicherte Plan-Datei an.

```bash
terraform apply tfplan
```

`terraform apply -auto-approve` — Wendet Änderungen ohne interaktive Rückfrage an (in CI/CD üblich, sonst riskant).

```bash
terraform apply -auto-approve
```

`terraform destroy` — Zerstört die gesamte verwaltete Infrastruktur (irreversibel – vorher `plan` prüfen).

```bash
terraform destroy
```

`terraform destroy -target=<resource>` — Zerstört nur eine bestimmte Ressource.

```bash
terraform destroy -target=aws_instance.web
```

## State-Verwaltung

`terraform state list` — Listet alle Ressourcen im State auf.

```bash
terraform state list
```

`terraform state show <resource>` — Zeigt die Details einer bestimmten Ressource an.

```bash
terraform state show aws_instance.web
```

`terraform state mv <src> <dest>` — Verschiebt/benennt eine Ressource im State um.

```bash
terraform state mv aws_instance.old aws_instance.new
```

`terraform state rm <resource>` — Entfernt eine Ressource aus dem State (ohne sie zu zerstören).

```bash
terraform state rm aws_instance.imported
```

`terraform state pull` — Lädt den aktuellen Remote-State herunter und gibt ihn aus.

```bash
terraform state pull > state-backup.json
```

`terraform import <resource> <id>` — Importiert vorhandene Infrastruktur in den State.

```bash
terraform import aws_instance.web i-1234567890abcdef0
```

## Workspaces

`terraform workspace list` — Listet alle Workspaces auf.

```bash
terraform workspace list
```

`terraform workspace new <name>` — Erstellt einen neuen Workspace.

```bash
terraform workspace new staging
```

`terraform workspace select <name>` — Wechselt zu einem Workspace.

```bash
terraform workspace select production
```

`terraform workspace show` — Zeigt den Namen des aktuellen Workspace an.

```bash
terraform workspace show
```

`terraform workspace delete <name>` — Löscht einen leeren Workspace.

```bash
terraform workspace delete staging
```

## Formatieren & Validieren

`terraform fmt` — Formatiert Konfigurationsdateien in den kanonischen Stil.

```bash
terraform fmt
```

`terraform fmt -check` — Prüft, ob die Dateien formatiert sind (für CI).

```bash
terraform fmt -check -recursive
```

`terraform validate` — Validiert Syntax und Konsistenz der Konfiguration.

```bash
terraform validate
```

`terraform output` — Zeigt alle Output-Werte aus dem State an.

```bash
terraform output
```

`terraform output <name>` — Zeigt einen bestimmten Output-Wert an.

```bash
terraform output instance_ip
```

`terraform output -json` — Zeigt die Outputs im JSON-Format an.

```bash
terraform output -json
```

## Provider & Module

`terraform providers` — Zeigt die von der Konfiguration benötigten Provider an.

```bash
terraform providers
```

`terraform providers lock` — Aktualisiert die Dependency-Lock-Datei.

```bash
terraform providers lock -platform=linux_amd64
```

`terraform get` — Lädt Module herunter und aktualisiert sie.

```bash
terraform get -update
```

`terraform graph` — Erzeugt einen Abhängigkeitsgraphen im DOT-Format.

```bash
terraform graph | dot -Tpng > graph.png
```

`terraform version` — Zeigt die Versionen von Terraform und den Providern an.

```bash
terraform version
```

<!-- PROSE:outro -->
## Fazit

Terraform belohnt diszipliniertes Arbeiten: Lass immer erst `terraform plan` laufen und lies die Ausgabe, bevor du `apply` ausführst – besonders bei `terraform destroy` oder `apply -auto-approve`, die deine Infrastruktur ohne weitere Rückfrage umbauen oder einreißen. Behandle die State-Datei wie ein Geheimnis: Sie enthält häufig Klartext-Secrets (Passwörter, Tokens), gehört deshalb nie ins Git und sollte als verschlüsselter Remote-State liegen. `-target` ist ein Notfall-Werkzeug, kein Alltagsflag – setze es nur gezielt ein, wenn du weißt, was du tust.

## Weiterführende Links

- [Terraform-Dokumentation (HashiCorp Developer)](https://developer.hashicorp.com/terraform) – offizielle Referenz zu CLI, Sprache und Providern (englisch)
- [Terraform Registry](https://registry.terraform.io/) – zentrale Sammlung von Providern und Modulen (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [ansible](https://www.jpkc.com/db/cheatsheets/cloud-iac/ansible/) – agentenlose Konfigurationsverwaltung und Provisionierung
- [aws](https://www.jpkc.com/db/cheatsheets/cloud-iac/aws/) – offizielles CLI für Amazon-Web-Services-Ressourcen

