Terraform-Module, die andere wirklich benutzen wollen.
Wiederverwendbar, dokumentiert, verändert und nicht überarbeitet.
Wiederverwendbar, dokumentiert, verändert und nicht überarbeitet.

Jedes Plattformteam baut schließlich ein Set interner Terraform-Module. Eine Standardmethode, um eine Datenbank, einen Eimer, ein Netzwerk, einen Cluster zu erstellen. Die Idee ist großartig: Die besten Praktiken des Unternehmens einmal zu kodieren und alle wiederverwenden zu lassen.
In der Praxis werden viele interne Module entweder ignoriert (Teams kopieren stattdessen Ressourcen) oder gehasst (so viele Optionen, dass sie niemand versteht). Hier ist, was ein Modul macht, das die Leute wirklich benutzen wollen.
Ein gutes Modul macht eine Sache gut, mit einer Meinung. Nicht "ein Umschlag um jedes Argument von aws_db_instance" , aber "eine PostgreSQL-Datenbank konfiguriert, wie wir Datenbanken hier laufen": verschlüsselt, gesichert, überwacht, im richtigen Netzwerk, mit den richtigen Tags.
Wenn das Modul nur jedes Argument der zugrunde liegenden Ressource durchläuft, fügt es keinen Wert hinzu. Die Teams könnten die Ressource genauso gut direkt nutzen.
Ein gutes Modul entfernt Entscheidungen. Ein schlechtes Modul verlegt sie einfach in eine andere Datei.
modules/rds-postgres/
main.tf
variables.tf
outputs.tf
versions.tf
README.md
examples/
basic/
main.tf
tests/
defaults.tftest.hcl
versions.tf Sie müssen die erforderliche Terraform-Version und die Anbieterversionen festlegen.examples/ zeigt den tatsächlichen Gebrauch und dient als Testgerät.tests/ mit terraform test - Die Akten.Wenige erforderliche Eingaben, gute Standards für den Rest. Das Grundbeispiel sollte nur eine Handvoll Zeilen benötigen:
module "orders_db" {
source = "git::https://github.com/acme/terraform-modules.git//rds-postgres?ref=v2.3.0"
name = "orders"
environment = "production"
size = "medium"
}
Validieren von Eingaben Also scheitern Fehler früh mit einer klaren Botschaft:
variable "size" {
description = "Database size: small, medium or large."
type = string
default = "small"
validation {
condition = contains(["small", "medium", "large"], var.size)
error_message = "size must be one of: small, medium, large."
}
}
Übersetzungen size = "medium" In eine bestimmte Instanzklasse innerhalb des Moduls zu integrieren bedeutet auch, dass Sie den zugrunde liegenden Instanztyp später ändern können, ohne dass jedes Team seinen Code ändert.
Nützliche Ergebnisse: IDs, Endpunkte, ARNs, Sicherheitsgruppen-IDs, Name der geheimen Anmeldeinformationen. Denken Sie darüber nach, was die nächste Ressource braucht.
Genaue Typen verwenden: object({...}) mit optionalen Attributen anstelle eines generischen map(any).
Die Module wechseln. Benutzer brauchen Stabilität. Also ...
v1.4.0, v2.0.0.?ref=v2.3.0 für Git oder version = "~> 2.3" für ein Register). Niemals auf main.Niemand möchte einen README manuell pflegen. Terrafform-Dokumente erzeugt die Eingabe- und Ausgabetabellen aus Ihrem Code:
terraform-docs markdown table --output-file README.md --output-mode inject .
Führen Sie es in einem Pre-Commit-Hook oder CI durch, und die Dokumentation bleibt synchron. Fügen Sie oben einen kurzen, von Menschen geschriebenen Abschnitt hinzu: wofür das Modul dient, was es standardmäßig tut und ein minimales Beispiel.
Selbst ein paar Tests helfen sehr:
terraform test um Standardvorgaben zu überprüfen: Verschlüsselung eingeschaltet, Löschschutz eingeschaltete, Tags vorhanden.Der häufigste Fehler, den ich sehe: Module, die Module mit Dutzenden von Variablen verpacken, mit Flaggen für jeden möglichen Anwendungsfall und count Überall sind Tricks.
Anzeichen, dass du zu weit gegangen bist:
Es ist in Ordnung, wenn ein Modul nein sagt. Wenn ein Team einen wirklich ungewöhnlichen Bedarf hat, kann es die Ressource direkt nutzen oder Sie können ein zweites, separates Modul erstellen. Nicht jeder Anwendungsfall gehört in den gleichen.
Eine klare Meinung, wenige erforderliche Eingaben, validierte Variablen, nützliche Ausgänge, generierte Dokumente, echte Versionen und ein paar Tests. Gebaut für den allgemeinen Fall, mit der Demut, nicht alles zu decken.
Meine Meinung: Bauen Sie Module, die den richtigen Weg kurz und offensichtlich machen. Wenn die Leute stattdessen Ressourcen kopieren, hilft ihnen das Modul noch nicht.
Desly