Dieser Beitrag ist der erste in einer dreiteiligen Serie über die Optimierung Ihrer Terraform-Einrichtung mit YAML.
Terraform ist eines der am weitesten verbreiteten Tools zur Bereitstellung von Infrastrukturen aus Code oder Konfiguration. Allerdings verwendet es eine eigene Sprache namens
Warum YAML?
Eine der besten Eigenschaften von YAML ist meiner Meinung nach das Fehlen von Syntax-Overhead. Sie ermöglicht es Ihnen, Parameter und Werte ganz einfach zu notieren. Schauen wir uns einen Vergleich von HCL-Code und YAML an, bei dem wir einige Google Pub/Sub-Themen und Abonnements konfigurieren:
locals {
config = {
topics = [
{
name = "my-topic"
labels = {
environment = "prod"
}
subscriptions = [
{
name = "my-subscription"
push_endpoint = "https://example.com/push"
}
]
}
]
}
}
topics:
- name: my-topic
labels:
environment: prod
subscriptions:
- name: my-subription
Wie Sie sehen können, ist der Unterschied in der Anzahl der Zeilen ziemlich groß. Das wird sich natürlich ändern, sobald wir etwas HCL-Code zum Importieren der YAML-Konfiguration hinzufügen, aber es summiert sich schnell, wenn Ihre Infrastruktur wächst.
Das Laden und Konvertieren der YAML-Datei in HCL ist sehr einfach. Sie können dies sogar in einer Zeile mit den Funktionen yamldecode und file erledigen:
locals {
config = yamldecode(file("config.yaml"))
}
Das Ergebnis ist eine HCL-Darstellung der gleichen Daten wie in dem vorherigen Beispiel.
In diesem Beispiel beträgt die Gesamtzahl der Codezeilen bei der Verwendung von normaler HCL 18, von denen 9 reine Syntaxzeilen sind. Die Gesamtzahl der Zeilen mit YAML, einschließlich des Ladens und Parsens der Datei, beträgt 9. Das ist eine Reduzierung um 50%!
Weitere Informationen zur YAML-Dekodierung in Terraform finden Sie in der offiziellen Dokumentation.
Ein weiterer Vorteil von YAML gegenüber HCL ist die Vertrautheit. Viele Ingenieure, die nicht im Bereich Infrastruktur arbeiten, sind mit der HCL-Syntax und ihren Eigenheiten nicht vertraut. YAML hingegen ist so einfach und weit verbreitet, dass fast jeder Ingenieur es in seiner Karriere schon einmal verwendet hat. Das bedeutet, dass, wenn Ihr Repository YAML für die Infrastrukturkonfiguration enthält, andere Techniker die Konfiguration leicht anpassen und bereitstellen können (vorzugsweise unter Verwendung einer CI/CD-Pipeline und einer angemessenen Codeüberprüfung). Dies bietet eine autarke Umgebung für Anwendungs- oder Datenteams, die auf der Basisinfrastruktur arbeiten.
Ein einfaches Beispiel
Lassen Sie uns ein voll funktionsfähiges Beispiel erstellen:
project:
id: my-project-id
region: europe-west4
bucket:
name: example-bucket-123
location: EU
force_destroy: true
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.47.0"
}
}
}
locals {
config = yamldecode(file("config.yaml"))
}
provider "google" {
project = config.project.id
region = config.project.region
}
resource "google_storage_bucket" "bucket" {
name = config.bucket.name
location = config.bucket.location
force_destroy = config.bucket.force_destroy
}
In diesem Beispiel erstellen und konfigurieren wir einen Cloud Storage Bucket. Wir verwenden zwei separate Stammobjekte (project und bucket), um die Konfiguration übersichtlich und lesbar zu halten.
Schleifen verwenden
Oft möchten wir mehrere Ressourcen konfigurieren, z.B. verschiedene Speicherbereiche für verschiedene Anwendungen. Lassen Sie uns das obige Beispiel anpassen, um eine for_each Schleife zu verwenden:
project:
id: my-project-id
region: europe-west4
buckets:
- name: example-bucket-123
location: EU
force_destroy: true
- name: example-bucket-456
location: US
force_destroy: false
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.47.0"
}
}
}
locals {
config = yamldecode(file("config.yaml"))
}
provider "google" {
project = config.project.id
region = config.project.region
}
resource "google_storage_bucket" "bucket" {
for_each = toset(config.buckets)
name = each.value.name
location = each.value.location
force_destroy = each.value.force_destroy
}
Wie Sie sehen, können wir jetzt mit minimalem Zusatzcode so viele Buckets bereitstellen, wie wir wollen.
Nächstes Mal
Jetzt haben wir ein grundlegendes Verständnis für die Vorteile der Verwendung von YAML-Konfigurationsdateien in Ihrem Terraform-Code. Im nächsten Beitrag dieser Serie werden wir uns mit fortgeschritteneren Themen befassen, wie z.B. dem Umgang mit verschachtelten Schleifen, der Erstellung mehrerer Ressourcentypen aus einer einzigen YAML-Konfiguration sowie dynamischer Variableninjektion und Templating. Als Bonus werden wir uns mit der Validierung von YAML-Dateien mit Hilfe eines Schemas beschäftigen, um ein frühes Feedback über die Konfiguration zu erhalten, ohne einen Terraform-Plan ausführen zu müssen.
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




