
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:
- Terraform CLI: Das Hauptwerkzeug.
- Installation (macOS via Homebrew):
brew install terraform - Installation (Windows via Choco):
choco install terraform
- Installation (macOS via Homebrew):
- Git & GitHub CLI (
gh): Zur Versionsverwaltung deiner.tf-Dateien. - Cloud CLIs (je nach genutztem Provider):
- AWS CLI:
awscli(füraws configure) - Azure CLI:
azure-cli(füraz login) - Google Cloud SDK:
gcloud(fürgcloud auth application-default login) - OCI CLI:
oci-cli(für API-Key-Konfigurationen)
- AWS CLI:
- 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:

- 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 - Remote Backend: Speichere die
.tfstate-Datei niemals im Git! Nutze AWS S3, Azure Blob Storage oder OCI Object Storage als Remote Backend. - GitHub Actions (CI/CD): Automatisiere deine Deployments. Bei jedem Pull Request führt GitHub ein
terraform planaus; nach dem Merge aufmainfolgtterraform 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:
| Konzept | AWS | Azure | OCI (Oracle Cloud) | GCP (Google Cloud) |
| Netzwerk | VPC / Subnet | Resource Group / VNet / Subnet | VCN / Subnet | VPC / Subnet |
| Virtuelle Maschine | aws_instance | azurerm_linux_virtual_machine | oci_core_instance | google_compute_instance |
| Firewall | Security Group | Network Security Group | Security List / NSG | Firewall Rule |
| DNS | Route53 | Azure DNS | OCI DNS | Cloud 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:
| Befehl | Beschreibung |
terraform init | Initialisiert das Arbeitsverzeichnis, lädt Provider-Plugins herunter und verbindet das Backend. |
terraform fmt -recursive | Formatiert deinen HCL-Code automatisch nach offiziellen Style-Guides. |
terraform validate | Prüft Syntax und interne Konsistenz deiner Konfigurationsdateien. |
terraform plan | Vorschau-Modus: Zeigt genau an, welche Ressourcen erstellt (+), geändert (~) oder gelöscht (-) werden. |
terraform apply | Führt die Änderungen aus und baut die Infrastruktur in der Cloud auf (-auto-approve überspringt die Bestätigung). |
terraform destroy | Räumt auf: Löscht sämtliche von diesem Projekt verwalteten Ressourcen in der Cloud. |
terraform state list | Zeigt alle aktuell von Terraform verwalteten Ressourcen im State an. |
terraform output | Gibt 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!
