Wie ich Terraform-Projekte strukturiere
Module, Umgebungen und Zustände, so organisiert, dass die nächste Person sie verstehen kann.
Module, Umgebungen und Zustände, so organisiert, dass die nächste Person sie verstehen kann.

Jedes Terraform-Projekt beginnt sauber. Ein Ordner, ein main.tf, ein paar Ressourcen. Dann kommt eine zweite Umgebung. Dann ein paar weitere Dienste, ein gemeinsames Netzwerk, eine zweite Region. Zwei Jahre später gibt es eine 3000-Zeile main.tfEine Staatsakte, die niemand anfassen darf, und ein Plan, der zehn Minuten dauert.
Struktur macht den Unterschied zwischen Infrastrukturcode, der reibungslos wächst und Code, der zum am wenigsten bevorzugten Teil des Repos wird. Das ist das Layout, das ich immer benutze. (Alles hier funktioniert auch für OpenTofu.)
infrastructure/
modules/
network/
eks-cluster/
rds-postgres/
live/
staging/
network/
main.tf
backend.tf
terraform.tfvars
cluster/
databases/
production/
network/
cluster/
databases/
modules/ enthält wiederverwendbare Bausteine ohne umweltspezifische Werte.live/ enthält die tatsächlichen Einsätze. Jeder Ordner ist eine Zustanddatei, die Module mit umweltspezifischen Eingaben aufruft.Spätere Komponenten können Ausgänge von früheren Komponenten mit terraform_remote_state oder, besser, durch Suche nach Ressourcen mit Datenquellen oder einem gemeinsamen Parameterspeicher.
Terraform hat Arbeitsplätze, die eine Konfiguration mehrere Zustände haben lassen. Es ist verlockend, sie für Umgebungen zu verwenden: terraform workspace select production.
Ich bevorzuge separate Ordner für Umgebungen:
Arbeitsbereiche sind immer noch praktisch, um viele identische Kopien derselben Sache zu erstellen, wie ein Stapel für jeden Kunden oder für Vorschaumöglichkeiten.
Wenn Sie einen Befehl ausführen müssen, um herauszufinden, welche Umgebung Sie ändern möchten, dann arbeitet die Struktur gegen Sie.
Behalte nie einen Zustand auf einem Laptop. Verwenden Sie ein Remote-Backend mit Sperrung:
terraform {
backend "s3" {
bucket = "acme-terraform-state"
key = "production/network/terraform.tfstate"
region = "eu-central-1"
encrypt = true
use_lockfile = true
}
}
Das S3-Backend unterstützt nun native Sperrungen mit einer Sperrdatei, so dass die separate DynamoDB-Tabelle nicht mehr erforderlich ist. Azure Storage und Google Cloud Storage Backends sind ebenfalls nativ gesperrt.
Schützen Sie den Staateschutz: Versionssicherung eingeschaltet, Verschlüsselung eingeschlossen, Zugriff auf die Personen und Pipelines beschränkt, die ihn benötigen. Der Staat enthält oft Geheimnisse.
Das oben stehende Ordnerlayout hat einen lästigen Nebenwirkung: viele wiederholte Boilerplate. Jeder Ordner braucht seine Backend-Konfiguration und Provider-Konfigurationen.
Hilfreiche Hilfsmittel:
Für ein kleines Team sind einfache Ordner mit ein wenig Wiederholung in Ordnung. Sobald du Dutzende Komponenten hast, zahlt sich Terragrunt oder eine Plattform aus.
Kleine Dinge , die viel Verwirrung ersparen:
<env>-<service>-<purpose>Wie ... prod-shop-db.provider "aws" {
region = "eu-central-1"
default_tags {
tags = {
environment = "production"
owner = "team-platform"
managed_by = "terraform"
repository = "acme/infrastructure"
}
}
}
.terraform.lock.hcl - Ich habe eine Akte.terraform fmt -check, terraform validate(Siehe auch:Die Zustandsdateien sind klein und nach Lebenszyklus und Umgebung getrennt. Fast jedes andere Problem, langsame Pläne, beängstigende Anwendungen, Konflikte, Menschen, die sich blockieren, wird einfacher, wenn man das hat.
Ich denke, Sie bauen Ihre Terraform für die Person aus, die nächstes Jahr eintritt. Wenn sie sich zurechtfinden, hast du es richtig gemacht.
Desly