Terraform HCL Syntax

6 Kernkonzepte
Die wichtigsten Syntax-Elemente von HashiCorp Configuration Language (HCL): 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 – Grundlegende Strukturen

block type "label" { ... }
resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" }

Blocks sind die grundlegenden Strukturelemente in HCL. Sie bestehen aus einem Typ, optionalen Labels und einem Body mit Argumenten und verschachtelten Blöcken.

Häufige Block-Typen

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
Beispiele
provider "aws" {
region = "eu-central-1"
}
variable "instance_type" {
default = "t2.micro"
}
output "instance_id" {
value = aws_instance.web.id
}
Tipp: Jeder Block hat einen Typ und kann ein oder mehrere Labels haben. Das erste Label ist oft der Name, das zweite ein Bezeichner (z.B. resource "aws_instance" "web").

Arguments – Schlüssel-Wert-Paare

key = value
ami = "ami-0c55b159cbfafe1f0" instance_type = var.instance_type tags = { Name = "web-server" Environment = "production" }

Arguments sind Schlüssel-Wert-Paare innerhalb von Blöcken. Sie definieren die Konfiguration und Parameter von Ressourcen, Providern und Modulen.

Argument-Typen

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]
Beispiele
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
tags = {
Name = "main-vpc"
Environment = var.environment
}
}
Tipp: Argumente können einfache Werte, Verweise auf andere Ressourcen, Variablen, Ausdrücke oder sogar ganze Blöcke sein. Die Reihenfolge der Argumente ist nicht wichtig.

Resources & Data Sources – Infrastruktur definieren und lesen

resource · data
resource "aws_instance" "web" { ami = data.aws_ami.ubuntu.id instance_type = var.instance_type } data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/ubuntu-22.04-amd64-server-*"] } }

Resources definieren neue Infrastruktur-Komponenten. Data Sources lesen vorhandene Informationen aus der Infrastruktur, ohne etwas zu ändern.

Meta-Argumente für Resources

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
Beispiele
# Resource mit count
resource "aws_instance" "web" {
count = 3
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
# Data Source
data "aws_vpc" "default" {
default = true
}
# Verweis auf Data Source
vpc_id = data.aws_vpc.default.id
Tipp: Verwenden Sie data Sources, um vorhandene Ressourcen zu referenzieren (z.B. bestehende VPCs, AMIs, Subnetze). Das vermeidet Hardcoding von IDs.

Variables & Outputs – Parameter und Rückgaben

variable · output
variable "instance_type" { type = string default = "t2.micro" description = "EC2 Instanz-Typ" } output "instance_ip" { value = aws_instance.web.public_ip description = "Öffentliche IP der Instanz" }

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.

Variable-Typen und Validierung

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)
Beispiele
# Variable mit Validierung
variable "environment" {
type = string
description = "Umgebung (dev, staging, prod)"
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Umgebung muss dev, staging oder prod sein."
}
}
# Sensible Variable (z.B. Passwort)
variable "db_password" {
type = string
sensitive = true
}
# Output mit Formatierung
output "instance_info" {
value = "${aws_instance.web.public_ip} (${aws_instance.web.instance_type})"
}
Tipp: Verwenden Sie .tfvars Dateien (z.B. terraform.tfvars oder dev.tfvars) für umgebungsspezifische Variablen. Sensible Variablen sollten nicht in Versionskontrolle eingecheckt werden.

Expressions – Werte berechnen

${} · conditional · for · lookup
"${var.environment}-${var.instance_type}" var.environment == "prod" ? "large" : "small" [for instance in aws_instance.web : instance.private_ip] lookup(var.tags, "Environment", "dev")

Expressions ermöglichen dynamische Berechnungen von Werten. Sie werden in Argumenten verwendet und können Variablen, Funktionen, ternäre Operatoren und Schleifen enthalten.

Häufige Expression-Typen

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
Beispiele
# Interpolation
Name = "${var.name_prefix}-instance"
# Ternärer Operator
instance_type = var.environment == "prod" ? "t2.large" : "t2.micro"
# For-Ausdruck (Liste von Subnetz-IDs)
subnet_ids = [for subnet in aws_subnet.private : subnet.id]
# For-Ausdruck mit Bedingung
names = [for instance in aws_instance.web : instance.tags.Name if instance.tags.Environment == "prod"]
# lookup für sicheren Map-Zugriff
environment = lookup(var.tags, "Environment", "dev")
Tipp: Expressions sind das Herz der Dynamik in Terraform. Verwenden Sie For-Ausdrücke und den ternären Operator, um Code zu reduzieren und flexiblere Konfigurationen zu erstellen.

Functions – Werkzeuge für Transformationen

basename · file · merge · join · split · format
file("${path.module}/user-data.sh") join(",", var.instances) merge(var.default_tags, { Name = "web" }) format("Instance %s", var.instance_id)

Functions sind eingebaute Werkzeuge zur Transformation und Bearbeitung von Werten. Sie werden in Expressions verwendet und erweitern die Möglichkeiten von HCL.

Die wichtigsten Funktionen

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"
Beispiele
# User-Data aus Datei
user_data = file("${path.module}/user-data.sh")
# Tags zusammenführen
tags = merge(var.default_tags, {
Name = "web-server"
})
# Liste als String mit Komma
subnet_ids_str = join(",", aws_subnet.private.*.id)
# Formatierung mit mehreren Werten
instance_name = format("%s-%s-%d", var.environment, "web", count.index)
# Base64 für User-Data
user_data_base64 = base64encode(file("script.sh"))
Tipp: Die Terraform-Dokumentation listet über 50 eingebaute Funktionen. Nutzen Sie merge für Tags, file für User-Data und format für dynamische Namen.

Terraform HCL im Überblick

.tf Hauptkonfigurationsdateien
Resources, Variables, Outputs
.tfvars Variablen-Dateien
Umgebungsspezifische Werte
${} Interpolation
Dynamische Werte
for For-Ausdrücke
Listen transformieren
var. Variablenreferenz
var.instance_type
data. Data Source Referenz
data.aws_ami.ubuntu.id

Quick Summary

resource
Blöcke definieren
key = value
Argumente setzen
resource
Ressourcen erstellen
variable
Variablen & Outputs
${}
Expressions
file()
Funktionen
resource "aws_instance" "web" { ami = var.ami } · output "ip" { value = aws_instance.web.public_ip }