Die wichtigsten Regeln
Remote State + Locking
backend "azurerm" mit Storage Account – der Blob-Lease verhindert parallele Applies. Ein State pro Umgebung.
Versionen pinnen
required_version und required_providers mit ~>-Constraints, .terraform.lock.hcl committen.
Module
Wiederkehrendes (z. B. „App Service + Key Vault + Identity“) als Modul mit klaren Variablen und Outputs.
Keine Secrets im Code
Secrets in Key Vault, Zugriff per Managed Identity. Variablen mit sensitive = true markieren.
Variablen beschreiben & prüfen
Jede Variable mit type, description und validation – Fehler fallen beim Plan auf, nicht in Produktion.
fmt, validate, lint
terraform fmt -check, validate und tflint in der CI. plan als Kommentar am Merge Request.
for_each statt count
Nicht so
resource "azurerm_resource_group" "rg" {
count = length(var.envs)
name = "rg-app-${var.envs[count.index]}"
location = "westeurope"
}
# Element aus der Mitte entfernen → alle danach neuSo
resource "azurerm_resource_group" "rg" {
for_each = toset(var.envs)
name = "rg-app-${each.key}"
location = "westeurope"
tags = local.common_tags
}Der sichere Ablauf
- 01
Format & Validierung
terraform fmt · validateSyntax und Stil prüfen – schnell und lokal.
- 02
Plan im Merge Request
terraform plan -out=tfplanDie CI zeigt genau, was erstellt, geändert oder gelöscht wird.
- 03
Review
4-Augen-PrinzipEin Mensch prüft den Plan – besonders Zeilen mit „destroy“.
- 04
Apply des geprüften Plans
terraform apply tfplanAusgerollt wird genau der reviewte Plan, authentifiziert per Managed Identity oder OIDC.