Blog

Terraform mit YAML: Teil 2

Chris ter Beke

Aktualisiert Oktober 15, 2025
3 Minuten

Dieser Beitrag ist der zweite in einer dreiteiligen Serie über die Optimierung Ihrer Terraform-Einrichtung mit YAML.

Im ersten Teil dieser Serie haben wir gelernt, wie Sie YAML verwenden können, um die Konfiguration von Terraform-Ressourcen zu vereinfachen. Wir haben uns vor allem darauf konzentriert, den Syntax-Overhead der HCL-Sprache zu reduzieren und die Konfiguration auch für Nicht-Ingenieure zugänglich zu machen.

In diesem zweiten Teil werden wir uns mit einigen fortgeschrittenen Techniken und Mustern beschäftigen.

Dynamische Blöcke

Eine leistungsstarke Funktion von Terraform sind dynamische Blöcke. Mit ihnen können Sie mehrere verschachtelte Blöcke angeben, indem Sie eine Schleife über ein Set oder eine Karte ziehen.

Im folgenden Beispiel fügen wir eine Lebenszyklusregel zu einem Speicherbereich hinzu, die Objekte automatisch nach 3 Tagen löscht. Wir fügen auch eine Lebenszyklusregel hinzu, die einen unvollständigen Upload nach 1 Tag automatisch abbricht.

resource "google_storage_bucket" "bucket" {
  name          = "my-awesome-bucket"
  location      = "EU"
  force_destroy = false

  lifecycle_rule {
    action {
      type = "Delete"
    }
    condition {
      age = 3
    }
  }

  lifecycle_rule {
    action {
      type = "AbortIncompleteMultipartUpload"
    }
    condition {
      age = 1
    }
  }
}

Sie können sich vorstellen, dass die Syntax dieser Ressourcen lang und mühsam zu lesen ist, wenn wir noch mehr Lifecyle-Regeln hinzufügen. Zum Glück gibt es dynamische Blöcke, die uns etwas Erleichterung verschaffen.

Im folgenden Beispiel verwenden wir einen dynamischen Block mit einer lokalen Karte, um die gleichen Lebenszyklusregeln anzuwenden:

locals {
    lifecycle_rules = {
        "Delete" = 3
        "AbortIncompleteMultipartUpload" = 1
    }
}

resource "google_storage_bucket" "bucket" {
  name          = "my-awesome-bucket"
  location      = "EU"
  force_destroy = false

  dynamic "lifecycle_rule" {
    for_each = local.lifecycle_rules

    content {
        action = {
            type = lifecycle_rule.key
        }
        condition {
            age = lifecycle_rule.value
        }
    }
  }
}

Wie Sie sehen, hat sich der Umfang des Boilerplate-Codes bereits deutlich verringert. Lassen Sie uns nun unsere YAML-Magie darauf anwenden und sehen, was passiert.

bucket:
  name: example-bucket-123
  location: EU
  force_destroy: true
  lifecycle_rules:
    Delete: 3
    AbortIncompleteMultipartUpload: 1
locals {
  config = yamldecode(file("config.yaml"))
}

resource "google_storage_bucket" "bucket" {
  name          = config.bucket.name
  location      = config.bucket.location
  force_destroy = config.bucket.force_destroy

  dynamic "lifecycle_rule" {
    for_each = config.bucket.lifecycle_rules

    content {
      action = {
        type = lifecycle_rule.key
      }
      condition {
        age = lifecycle_rule.value
      }
    }
  }
}

Indem wir die tatsächlichen Regeln in unserer YAML-Konfigurationsdatei angeben, wird deutlich, welche Regeln wir für unseren Bucket erzwingen.

Mehrere Ressourcentypen

Sehen wir uns nun an, wie wir auf der Grundlage einer YAML-Konfigurationsdatei mehr als eine einzelne Ressource definieren können. Hier sehen Sie ein Beispiel für IAM-Mitglieder im Speicherbereich:

bucket:
  name: example-bucket-123
  location: EU
  force_destroy: true
  admins:
    - "group:storage-admins@company.com"
    - "user:john-break-glass@company.com"
locals {
  config = yamldecode(file("config.yaml"))
}

resource "google_storage_bucket" "bucket" {
  name          = config.bucket.name
  location      = config.bucket.location
  force_destroy = config.bucket.force_destroy
}

resource "google_storage_bucket_iam_member" "admins" {
  for_each = toset(config.bucket.admins)

  bucket = google_storage_bucket.bucket.name
  role   = "roles/storage.admin"
  member = each.key
}

Ein Muster, das hier verwendet wird, besteht darin, die Konfiguration in YAML zu gruppieren und sie auf mehrere Terraform-Ressourcen zu verteilen. Dies reduziert die Anzahl der Stellen im Code, die Sie anfassen müssen, um Ihre Infrastruktur zu ändern.

Nächstes Mal

Jetzt kennen wir die Grundlagen von YAML in Terraform sowie einige fortgeschrittene Situationen, in denen es nützlich sein kann. Im nächsten und letzten Teil dieser Serie werden wir uns mit Templating und Schema-Validierung beschäftigen. Außerdem werfen wir einen kurzen Blick darauf, wie Sie die Injektion von YAML-Konfigurationsdateien mit Terragrunt automatisieren können.

Verfasst von

Chris ter Beke

Chris ter Beke has been using Google Cloud Platform for over 8 years. He has built multiple SaaS platforms using technologies like Terraform, Kubernetes, Python, and automated CI/CD pipelines.

Contact

Let’s discuss how we can support your journey.