Terraform Module

6 Kernkonzepte
Die wichtigsten Konzepte für Terraform Module: module · source · variables · outputs · locals · module registry Module sind die Grundlage für wiederverwendbare, wartbare und testbare Terraform-Infrastrukturen. Sie ermöglichen die Organisation von Code in logischen Einheiten.

Module Grundlagen – Wiederverwendbare Einheiten

module · source · version
module "web_server" { source = "./modules/web" version = "1.2.0" instance_type = "t3.micro" ami_id = "ami-12345678" }

Module sind Container für zusammengehörige Ressourcen, die gemeinsam konfiguriert werden. Sie fördern Wiederverwendbarkeit, Wartbarkeit und Testbarkeit der Infrastruktur.

Module-Struktur

Datei Beschreibung
main.tf Hauptkonfiguration der Ressourcen
variables.tf Eingabevariablen (Inputs) des Moduls
outputs.tf Ausgabewerte (Outputs) des Moduls
README.md Dokumentation für die Benutzung
versions.tf Provider- und Terraform-Versionen
Beispiele
# Lokales Modul
module "database" {
source = "./modules/postgresql"
instance_class = "db.t3.micro"
db_name = "myapp"
}
# Modul von Terraform Registry
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
}
# Modul von GitHub
module "kubernetes" {
source = "github.com/org/repo//modules/k8s?ref=v1.0.0"
}
Tipp: Nutzen Sie den Terraform Module Registry für vorgefertigte, getestete Module (z.B. VPC, EC2, RDS). Dies spart Zeit und beugt Fehlern vor.

Modulnutzung – Module einbinden und nutzen

module · source · arguments
module "app" { source = "./modules/app" env = "production" replicas = 3 tags = var.tags } # Zugriff auf Outputs module.app.public_ip

Modulnutzung ermöglicht die Wiederverwendung von Modulen in verschiedenen Konfigurationen. Ein Modul wird als Block module deklariert und kann mehrfach instanziiert werden.

Beispiele
# Mehrfache Modulnutzung (Development & Production)
module "dev_db" {
source = "./modules/postgres"
environment = "dev"
instance_class = "db.t3.micro"
}
module "prod_db" {
source = "./modules/postgres"
environment = "prod"
instance_class = "db.r5.large"
}
# Outputs eines Moduls nutzen
output "db_endpoint" {
value = module.prod_db.endpoint
}
Tipp: Nutzen Sie count oder for_each mit Modulen, um mehrere Instanzen eines Moduls zu erstellen – z.B. für mehrere Regionen oder Umgebungen.

Variables – Eingaben für Module

variable · type · default · description
variable "instance_type" { type = string description = "EC2 Instance Type" default = "t3.micro" validation { condition = var.instance_type != "" error_message = "instance_type darf nicht leer sein" } }

Variablen sind die Eingaben eines Moduls. Sie ermöglichen die Parametrisierung des Moduls und machen es für verschiedene Umgebungen und Anwendungsfälle nutzbar.

Variable Types

Typ Beschreibung Beispiel
string Text "t3.micro"
number Zahl 3
bool Wahrheitswert true
list Liste von Werten ["a", "b", "c"]
map Schlüssel-Wert-Paare { key = "value" }
object Strukturierte Daten { name = "test", age = 30 }
tuple Liste mit definierten Typen ["a", 1, true]
Beispiele
# Einfache Variable
variable "environment" {
type = string
default = "dev"
}
# Variable mit Sensiblem Wert
variable "db_password" {
type = string
sensitive = true
nullable = false
}
# List-Variable
variable "subnet_ids" {
type = list(string)
default = ["subnet-123", "subnet-456"]
}
# Object-Variable
variable "instance_config" {
type = object({
type = string
ami = string
count = number
})
}
Tipp: Nutzen Sie sensitive für Passwörter oder Schlüssel, damit diese nicht in Logs oder im Plan ausgegeben werden. Verwenden Sie validation-Blöcke für Eingabevalidierung.

Outputs – Ausgaben eines Moduls

output · value · description · sensitive
output "instance_id" { value = aws_instance.main.id description = "Die ID der EC2-Instanz" sensitive = false }

Outputs sind die Werte, die ein Modul nach seiner Ausführung bereitstellt. Sie ermöglichen die Weitergabe von Informationen an das übergeordnete Modul oder an andere Module.

Beispiele
output "public_ip" {
value = aws_instance.web.public_ip
description = "Öffentliche IP des Webservers"
}
output "database_url" {
value = "postgresql://${var.db_user}:${var.db_password}@${aws_db_instance.main.address}:5432/${var.db_name}"
sensitive = true
}
# Mehrere Werte in einem Output
output "instance_info" {
value = {
id = aws_instance.main.id
public_ip = aws_instance.main.public_ip
private_ip = aws_instance.main.private_ip
}
}
Tipp: Deklarieren Sie Outputs in der Datei outputs.tf. Nutzen Sie sensitive für sicherheitsrelevante Werte, damit diese nicht im Klartext im Plan erscheinen.

Locals – Lokale Werte im Modul

locals · expressions · functions
locals { common_tags = { Environment = var.environment Project = var.project_name } instance_name = "${var.environment}-web-${count.index + 1}" }

Locals sind lokale Werte innerhalb eines Moduls, die für Berechnungen, Kombinationen oder Abkürzungen verwendet werden. Sie helfen, redundante Ausdrücke zu vermeiden.

Beispiele
locals {
# Tags für alle Ressourcen
tags = {
Environment = var.environment
ManagedBy = "Terraform"
}
# Namenskonvention
name_prefix = "${var.environment}-${var.project_name}"
# Berechnete Werte
subnet_count = length(var.subnet_cidrs)
}
# Verwendung von Locals
resource "aws_instance" "main" {
tags = local.tags
name = "${local.name_prefix}-instance"
}
Tipp: Locals sind ideal für die zentrale Definition von Tags, Namenskonventionen und wiederverwendbaren Ausdrücken. Sie verbessern die Lesbarkeit und Wartbarkeit des Codes.

Module Registry & Versioning – Teilen und Versionieren

terraform-aws-modules · version · source
module "s3_bucket" { source = "terraform-aws-modules/s3-bucket/aws" version = "3.15.0" bucket = "my-bucket" acl = "private" }

Module Registry ist der zentrale Ort für öffentliche und private Terraform-Module. Das Versioning ermöglicht stabile und kontrollierte Updates.

Source-Formate

Quelle Format Beispiel
Lokal ./pfad ./modules/vpc
Terraform Registry namespace/name/provider terraform-aws-modules/vpc/aws
GitHub github.com/org/repo//path github.com/org/repo//modules/k8s
Git git::https://... git::https://github.com/org/repo.git
S3 s3::https://... s3::https://s3.eu-central-1.amazonaws.com/bucket/module.zip
Beispiele
# Modul aus der Registry mit Version
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "19.15.0"
cluster_name = "my-cluster"
cluster_version = "1.27"
subnet_ids = module.vpc.private_subnets
}
# Private Registry (Enterprise)
module "internal" {
source = "app.terraform.io/org/modules/database/aws"
version = "2.1.0"
}
# Semantische Versionierung
# Version: 1.2.3 (Major.Minor.Patch) # ~> 1.2: Jede Patch-Version von 1.2.x # >= 1.0, < 2.0: Alle 1.x Versionen
Tipp: Verwenden Sie immer eine fixe Version für Module aus der Registry, um unerwartete Breaking Changes zu vermeiden. Nutzen Sie ~> für Patch-Updates, wenn Sie automatische Sicherheitsupdates wünschen.

Terraform Module Best Practices

source Module-Quelle
Lokal, Registry, Git
version Versionierung
Semantische Versionen
variables Eingaben
Typen, Defaults, Validierung
outputs Ausgaben
sensitive, description
locals Lokale Werte
Tags, Namen, Berechnungen
README Dokumentation
Nutzung, Beispiele, Requirements

Quick Summary

module
Module definieren
source
Quelle angeben
variable
Eingaben
output
Ausgaben
locals
Lokale Werte
registry
Registry & Versionen
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "5.0.0" } · variable "instance_type" { type = string } · output "public_ip" { value = aws_instance.main.public_ip }