Blocks ·
Arguments ·
Resources ·
Variables ·
Expressions ·
Functions
Terraform verwendet HCL für die deklarative Definition von Infrastruktur. Diese Syntax-Elemente sind die Grundlage für das Schreiben von Terraform-Konfigurationen.
Blocks sind die grundlegenden Strukturelemente in HCL. Sie bestehen aus einem Typ, optionalen Labels und einem Body mit Argumenten und verschachtelten Blöcken.
| Block-Typ | Beschreibung |
|---|---|
| resource | Definiert eine Infrastruktur-Ressource |
| data | Liest vorhandene Ressourcen oder Daten |
| variable | Definiert eine Eingabevariable |
| output | Definiert einen Ausgabewert |
| provider | Konfiguriert einen Provider (z.B. AWS, Azure) |
| module | Verwendet ein Terraform-Modul |
| terraform | Konfiguration für Terraform selbst (Backend, Version) |
| locals | Definiert lokale Werte |
resource "aws_instance" "web").
Arguments sind Schlüssel-Wert-Paare innerhalb von Blöcken. Sie definieren die Konfiguration und Parameter von Ressourcen, Providern und Modulen.
| Typ | Beschreibung | Beispiel |
|---|---|---|
| string | Textwert | "Hello World" |
| number | Numerischer Wert | 42, 3.14 |
| bool | Wahrheitswert | true, false |
| list | Liste von Werten | ["a", "b", "c"] |
| map | Schlüssel-Wert-Map | { key = "value" } |
| object | Strukturierte Daten | { name = "test", age = 30 } |
| tuple | Liste mit festen Typen | ["a", 1, true] |
Resources definieren neue Infrastruktur-Komponenten. Data Sources lesen vorhandene Informationen aus der Infrastruktur, ohne etwas zu ändern.
| Meta-Argument | Beschreibung |
|---|---|
| count | Erstellt mehrere Instanzen einer Ressource |
| for_each | Erstellt Instanzen basierend auf einer Map oder Liste |
| depends_on | Definiert explizite Abhängigkeiten |
| provider | Verwendet einen bestimmten Provider (z.B. bei Multi-Cloud) |
| lifecycle | Steuert das Verhalten bei Erstellung, Update und Löschung |
data Sources, um vorhandene Ressourcen zu referenzieren (z.B. bestehende VPCs, AMIs, Subnetze). Das vermeidet Hardcoding von IDs.
Variables sind Eingabeparameter für Terraform-Module. Outputs sind Rückgabewerte, die nach der Ausführung von terraform apply angezeigt oder von anderen Modulen verwendet werden.
| Attribute | Beschreibung |
|---|---|
| type | Typ der Variable (string, number, bool, list, map, object) |
| default | Standardwert, falls kein Wert übergeben wird |
| description | Beschreibung der Variable (Dokumentation) |
| validation | Validierungsregeln für den Wert |
| sensitive | Markiert die Variable als sensibel (nicht im Log anzeigen) |
.tfvars Dateien (z.B. terraform.tfvars oder dev.tfvars) für umgebungsspezifische Variablen. Sensible Variablen sollten nicht in Versionskontrolle eingecheckt werden.
Expressions ermöglichen dynamische Berechnungen von Werten. Sie werden in Argumenten verwendet und können Variablen, Funktionen, ternäre Operatoren und Schleifen enthalten.
| Expression | Beschreibung |
|---|---|
| ${} | Interpolation von Werten in Strings |
| condition ? true : false | Ternärer Operator (bedingte Auswahl) |
| [for item in list : item] | For-Ausdruck (Liste transformieren) |
| {for key, value in map : key => value} | For-Ausdruck für Maps |
| lookup(map, key, default) | Sicherer Zugriff auf Map-Werte |
| element(list, index) | Zugriff auf Listenelement mit Index |
| length(list) | Länge einer Liste |
| contains(list, value) | Prüft, ob Wert in Liste enthalten ist |
Functions sind eingebaute Werkzeuge zur Transformation und Bearbeitung von Werten. Sie werden in Expressions verwendet und erweitern die Möglichkeiten von HCL.
| Funktion | Beschreibung | Beispiel |
|---|---|---|
| file() | Liest Inhalt einer Datei | file("script.sh") |
| join() | Verbinder eine Liste zu einem String | join(",", ["a","b"]) → "a,b" |
| split() | Teilt einen String in eine Liste | split(",", "a,b") → ["a","b"] |
| merge() | Führt Maps zusammen | merge({a=1}, {b=2}) → {a=1,b=2} |
| format() | Formatierte Ausgabe | format("ID: %s", "123") → "ID: 123" |
| base64encode() | Base64-Kodierung | base64encode("data") |
| base64decode() | Base64-Dekodierung | base64decode("ZGF0YQ==") |
| lookup() | Map-Zugriff mit Default | lookup({a=1}, "b", 0) → 0 |
| element() | Listenzugriff | element(["a","b"], 1) → "b" |
| length() | Länge von List/Map/String | length(["a","b"]) → 2 |
| timestamp() | Aktueller Zeitstempel | timestamp() → "2024-01-01T00:00:00Z" |
merge für Tags, file für User-Data und format für dynamische Namen.
resource
key = value
resource
variable
${}
file()
resource "aws_instance" "web" { ami = var.ami } ·
output "ip" { value = aws_instance.web.public_ip }