Infrastructure as Code mit Terraform

Der ultimative Multi-Cloud Guide (AWS, Azure, OCI, GCP)

Wer moderne Cloud-Infrastrukturen verwaltet, merkt schnell: Das manuelle Klicken in den Web-Konsolen von AWS, Azure, Google Cloud oder Oracle Cloud ist nicht nur extrem zeitaufwendig, sondern auch anfällig für Fehler. Sobald du deine Umgebung nachbauen, erweitern oder im Team verwalten möchtest, führt kein Weg an Infrastructure as Code (IaC) vorbei.

Das mächtigste und flexibelste Werkzeug dafür ist Terraform von HashiCorp. In diesem Guide erfährst du:

  • Welche Tools du installieren musst.
  • Wie du deine Terraform-Projekte sauber in Ordnerstrukturen organisiert.
  • Wie GitHub dein Best-Practice-Workflow für Terraform unterstützt.
  • Konkrete Code-Beispiele für AWS, Azure, OCI und Google Cloud.
  • Ein Cheatsheet mit den wichtigsten Terraform-Befehlen für die Praxis.

🛠️ Was muss man alles installieren? Die Tool-Chain

Für ein reibungsloses Arbeiten mit Terraform auf deinem lokalen System (macOS, Linux oder Windows via WSL2) benötigst du folgende Tools:

  1. Terraform CLI: Das Hauptwerkzeug.
    • Installation (macOS via Homebrew): brew install terraform
    • Installation (Windows via Choco): choco install terraform
  2. Git & GitHub CLI (gh): Zur Versionsverwaltung deiner .tf-Dateien.
  3. Cloud CLIs (je nach genutztem Provider):
    • AWS CLI: awscli (für aws configure)
    • Azure CLI: azure-cli (für az login)
    • Google Cloud SDK: gcloud (für gcloud auth application-default login)
    • OCI CLI: oci-cli (für API-Key-Konfigurationen)
  4. Code-Editor: VS Code mit der offiziellen HashiCorp Terraform Extension (bietet Syntax-Highlighting, Auto-Completion und Linting).

📁 Die perfekte Ordnerstruktur: Modular & Übersichtlich

Ein häufiger Fehler bei Terraform-Einsteigern ist die „Monolith-Falle“: Sämtliche Server, Firewalls, Netzwerke und DNS-Einträge werden in eine einzige gigantische main.tf geworfen. Das wird schnell unwartbar.

Best Practice: Trennung nach Komponenten und Modulen

Organisiere deine Infrastruktur in logische Ordner/Module. Jeder Bereich bekommt sein eigenes Verzeichnis mit main.tf, variables.tf und outputs.tf:

Plaintext

my-multicloud-infrastructure/
├── .github/
│   └── workflows/
│       └── terraform-ci.yml       # GitHub Actions Workflow
├── modules/
│   ├── network/                   # VPCs, Subnetze, VCN
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   ├── firewall/                  # Security Groups, Firewalls
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   ├── vm/                        # Virtuelle Maschinen & Compute
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   └── dns/                       # DNS-Zone & Records
│       ├── main.tf
│       ├── variables.tf
│       └── outputs.tf
└── environments/
    ├── dev/
    │   ├── main.tf                # Ruft die Module auf
    │   ├── terraform.tfvars
    │   └── backend.tf
    └── prod/
        ├── main.tf
        └── terraform.tfvars

🐙 GitHub als Steuerzentrale & State-Schutz

Dein Code gehört in ein Git-Repository (z. B. auf GitHub). Dabei sind zwei Dinge extrem wichtig:

  1. Die .gitignore-Datei: Terraform speichert im lokalen Zustand sensible Daten und Keys. Schütze dein Repository!Code-Snippet# .gitignore .terraform/ *.tfstate *.tfstate.backup *.tfvars !example.tfvars
  2. Remote Backend: Speichere die .tfstate-Datei niemals im Git! Nutze AWS S3, Azure Blob Storage oder OCI Object Storage als Remote Backend.
  3. GitHub Actions (CI/CD): Automatisiere deine Deployments. Bei jedem Pull Request führt GitHub ein terraform plan aus; nach dem Merge auf main folgt terraform apply.

☁️ Die Cloud-Unterschiede & Terraform-Codebeispiele

Auch wenn die Terraform-Syntax (HCL) für alle Clouds identisch ist, unterscheiden sich die Provider-Ressourcen und Namensgebungen stark:

KonzeptAWSAzureOCI (Oracle Cloud)GCP (Google Cloud)
NetzwerkVPC / SubnetResource Group / VNet / SubnetVCN / SubnetVPC / Subnet
Virtuelle Maschineaws_instanceazurerm_linux_virtual_machineoci_core_instancegoogle_compute_instance
FirewallSecurity GroupNetwork Security GroupSecurity List / NSGFirewall Rule
DNSRoute53Azure DNSOCI DNSCloud DNS

1. Amazon Web Services (AWS)

Terraform

# modules/vm/aws_vm.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "eu-central-1"
}

resource "aws_instance" "web_server" {
  ami           = "ami-008280f43848544bf" # Amazon Linux 2023
  instance_type = "t3.micro"

  tags = {
    Name = "AWS-Free-Tier-VM"
  }
}

2. Microsoft Azure

Terraform

# modules/vm/azure_vm.tf
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "my-tf-rg"
  location = "westeurope"
}

resource "azurerm_linux_virtual_machine" "vm" {
  name                = "azure-demo-vm"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_B1s"
  admin_username      = "adminuser"

  admin_ssh_key {
    username   = "adminuser"
    public_key = file("~/.ssh/id_rsa.pub")
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-jammy"
    sku       = "22_04-lts"
    version   = "latest"
  }
}

3. Oracle Cloud Infrastructure (OCI)

Besonders spannend dank der leistungsstarken ARM-Instanzen im Always Free Tier!

Terraform

# modules/vm/oci_vm.tf
terraform {
  required_providers {
    oci = {
      source  = "oracle/oci"
      version = "~> 5.0"
    }
  }
}

provider "oci" {
  region = "eu-frankfurt-1"
}

resource "oci_core_instance" "arm_vm" {
  availability_domain = "gL4x:EU-FRANKFURT-1-AD-1"
  compartment_id      = "ocid1.compartment.oc1..example"
  display_name        = "OCI-AlwaysFree-ARM"
  shape               = "VM.Standard.A1.Flex" # Ampere ARM

  shape_config {
    ocpus         = 2
    memory_in_gbs = 12
  }

  source_details {
    source_type = "image"
    source_id   = "ocid1.image.oc1.eu-frankfurt-1.example" # Oracle Linux oder Ubuntu ARM
  }
}

4. Google Cloud Platform (GCP)

Terraform

# modules/vm/gcp_vm.tf
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 5.0"
    }
  }
}

provider "google" {
  project = "my-gcp-project-id"
  region  = "europe-west3"
  zone    = "europe-west3-a"
}

resource "google_compute_instance" "default" {
  name         = "gcp-e2-micro-vm"
  machine_type = "e2-micro"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }

  network_interface {
    network = "default"
    access_config {} # Öffentliche IP vergeben
  }
}

📌 Fazit: Die wichtigsten Terraform-Befehle (Cheatsheet)

Hier ist deine tägliche Befehlsreferenz für das Terminal:

BefehlBeschreibung
terraform initInitialisiert das Arbeitsverzeichnis, lädt Provider-Plugins herunter und verbindet das Backend.
terraform fmt -recursiveFormatiert deinen HCL-Code automatisch nach offiziellen Style-Guides.
terraform validatePrüft Syntax und interne Konsistenz deiner Konfigurationsdateien.
terraform planVorschau-Modus: Zeigt genau an, welche Ressourcen erstellt (+), geändert (~) oder gelöscht (-) werden.
terraform applyFührt die Änderungen aus und baut die Infrastruktur in der Cloud auf (-auto-approve überspringt die Bestätigung).
terraform destroyRäumt auf: Löscht sämtliche von diesem Projekt verwalteten Ressourcen in der Cloud.
terraform state listZeigt alle aktuell von Terraform verwalteten Ressourcen im State an.
terraform outputGibt alle definierten Output-Variablen aus (z. B. erstelle IP-Adressen).

Zusammenfassung

Mit einer sauberen Ordnerstruktur für Module, dem richtigen GitHub-Workflow und Terraform als einheitlichem Tool hast du das beste Fundament gelegt, um deine Infrastruktur herstellerunabhängig, transparent und sicher zu verwalten – egal ob bei AWS, Azure, OCI oder Google Cloud!