maciek905 - stock.adobe.com

for_each und dynamische Blöcke in Terraform-Code verwenden

In diesem Tutorial erfahren Sie, wie Sie mit dynamischen Blöcken und dem for_each-Attribut in Terraform sauberen, wiederverwendbaren Code für Cloud-Implementierungen schreiben.

Terraform ist ein leistungsstarkes Infrastructure-as-Code--Tool, mit dem Sie das Erstellen, Warten und Zerstören von Cloud-Ressourcen automatisieren. Ähnlich wie Entwickler Repositories wie GitHub nutzen, um ihren Code zu speichern, bietet Terraform die Vorteile eines Versionskontrollsystems für die Cloud-Infrastruktur eines Unternehmens.

Terraform ist außerdem Open Source und wird ständig gewartet. Durch die laufenden Beiträge der Entwickler kommen außerdem ständig neue Funktionen hinzu. Nutzer können sogar eine eigene Funktion vorschlagen, von denen sie glauben, dass es der Gemeinschaft nützt.

Terraform bietet mehrere Funktionen, die bewährte Programmierpraktiken fördern, wie das Wiederverwenden von Code und dynamische Codeblöcke. In diesem Tutorial lernen Sie die Vielseitigkeit von Terraform als Infrastruktur-als-Code-Tool kennen, indem Sie lernen, wie Sie mit zwei äußerst nützlichen Funktionen arbeiten: dem for_each-Attribut und dynamischen Blöcken.

Wie Sie das for_each-Attribut von Terraform verwenden

Normalerweise wird der Code eines Terraform-Projekts mit einer Anwendung kombiniert, wobei der Terraform-Code die Infrastruktur vorgibt, auf der die Anwendung läuft. Bei diesem Entwurfsparadigma ist die spezifische Infrastruktur in vielen Fällen für alle Anwendungen und Umgebungen gleich.

Um den Prozess der wiederholten Erstellung derselben Cloud-Ressource zu vereinfachen, hat Terraform das for_each-Argument eingeführt. Durch die Übergabe des for_each-Arguments an eine Cloud-Ressource wird Terraform angewiesen, für jedes Element in einer Map oder Liste eine andere Ressource zu erstellen.

Beispiel: Verwenden von for_each zum Erstellen einer VPC-Ressource

Um dies zu veranschaulichen, verwenden wir ein Terraform-Modul, um eine einfache Virtual Private Cloud-Ressource (VPC) in AWS zu erstellen, wie in Abbildung 1 dargestellt.

Erstellen einer VPC-Ressource in AWS mit dem Terraform-Modul
Abbildung 1: Wir erstellen eine einfache VPC-Ressource in AWS mit dem Terraform-Modul.

Um dieselbe Ressource für mehrere Umgebungen zu erstellen, fügen Sie zunächst eine Map (Karte) der verschiedenen Umgebungen zusammen mit den für jede Umgebung zu verwendenden Werten hinzu, wie in Abbildung 2 gezeigt.

Definieren der neuen Umgebungsvariable
Abbildung 2: Definieren Sie eine neue Umgebungsvariable, um dieselbe Ressource in mehreren Umgebungen zu erstellen, wie der Entwicklungs-, Staging- und Produktionsumgebung.

Die Variable environment ist eine Map verschiedener Maps, auf die Sie dann in der Terraform-Hauptdatei verweisen, wie in Abbildung 3.

Referenzieren der Umgebungsvariable
Abbildung 3: Referenzieren Sie die Umgebungsvariable in der Haupt-Terraform-Datei, die wir in Abbildung 1 erstellt haben.

Wenn Sie in Zeile 14 das Attribut for_each hinzufügen und seinen Wert auf die Umgebungsvariable setzen, wird Terraform für jedes Element in der Umgebungsvariablen-Map ein VPC-Modul erstellen.

Die Zeilen 8 und 9 referenzieren die privaten und öffentlichen Subnetzlisten, die in der Map jeder Umgebung enthalten sind, mit der Syntax each.value.<list_name>. Mit anderen Worten: Holen Sie sich für jedes Element in der Umgebungsvariablenzuordnung den Wert dieses Elements und holen Sie sich dann das Element nach seinem Namen.

Vorteile der Verwendung von for_each in Terraform

Durch das for_each-Attribut vermeiden Sie unnötige Doppelungen in Terraform-Konfigurationen. Das Hinzufügen neuer Elemente zur Umgebungsübersicht oder das Ändern vorhandener Elemente geht schnell, da alle wichtigen konfigurierbaren Elemente an einem Ort gespeichert sind.

Sie können auch andere Methoden verwenden, um das gleiche Setup wie in diesem Beispiel zu erreichen, zum Beispiel Terraform-Arbeitsbereiche. for_each lässt sich jedoch breiter einsetzen, um Ressourcen dynamisch in Abhängigkeit von Listen, Maps oder anderen Ressourcen zu erstellen.

Wie Sie dynamische Blöcke in Terraform verwenden

Da wir gerade von der dynamischen Erstellung von Ressourcen sprechen, lassen Sie uns einen Blick auf eine andere der nützlichsten Funktionen von Terraform werfen: dynamische Blöcke.

In Terraform können Sie mit dynamischen Blöcken verschachtelte Blöcke innerhalb einer Ressource auf der Grundlage einer Variablen erstellen. Statt für jedes Element in einer Map eine Ressource zu erstellen, wie es das for_each-Attribut tut, erzielen dynamische Blöcke verschachtelte Blöcke innerhalb einer Ressource für jedes Element in einer Map oder Liste.

Beispiel: Dynamische Blöcke zum Vereinfachen von Ingress- und Egress-Regeln

Am einfachsten lassen sich dynamischer Blöcke anhand eines Beispiels erklären.

Definieren einer AWS-Sicherheitsgruppenressource mit Ingress- und Egress-Regeln.
Abbildung 4: Definieren Sie eine AWS-Sicherheitsgruppenressource mit Ingress- und Egress-Regeln.

Abbildung 4 zeigt eine AWS-Sicherheitsgruppenressource. Diese Sicherheitsgruppe verfügt über einige Eingangs- und Ausgangsregeln, um den Zugriff auf eine andere Ressource innerhalb der VPCs zu steuern, die in dem vorangegangenen for_each-Beispiel erstellt wurden.

Wie in Abbildung 4 zu sehen ist, gibt es eine ganze Reihe von Wiederholungen, die Sie mit den dynamischen Blöcken von Terraform bereinigen.

Nachdem Sie die Ingress- und Egress-Regeln in dynamische Blöcke umgewandelt haben, sollte der Terraform-Code wie in Abbildung 5 aussehen.

Ingress- und Egress-Regeln als Dynamische Blöcke in Terraform
Abbildung 5: Vereinfachung Sie die Definition von Ingress- und Egress-Regeln für dieselbe AWS-Sicherheitsgruppe mit dynamischen Blöcken.

Die dynamischen Blöcke enthalten das for_each-Attribut, das jetzt verschiedenen Variablen zugewiesen ist. Abbildung 6 zeigt die Definitionen der Variablen.

Abbildung 6 zeigt die Definitionen der Variablen.
Abbildung 6: Definition von Werten für Ingress- und Egress-Variablen für dieselbe AWS-Sicherheitsgruppe.

Beachten Sie, dass der Name des dynamischen Blocks nicht einfach eine Zeichenkette ist. Er muss mit dem Namen des endgültigen Blocks übereinstimmen, den Sie erstellen möchten.

Als nächstes richtet der dynamische Block endgültige Blöcke ein auf der Grundlage der Werte in der durch das for_each-Attribut angegebenen Map oder Liste. Vom Konzept her ist dies sehr ähnlich wie das for_each-Attribut bei einer Ressource.

Jeder Wert aus der Map oder Liste dient dazu, Werte für den Inhalt des endgültigen Ingress- oder Egress-Blocks zu definieren. Wenn die Map oder die Liste leer ist, erstellt Terraform keinen endgültigen Block. Diese Funktion ist nützlich, wenn Sie sie als Mechanismus zum Deaktivieren oder Aktivieren bestimmter Funktionen einer Ressource implementieren, die durch in dieser Ressource definierte Blöcke gesteuert werden.

Vorteile dynamischer Blöcke

Die Verwendung von dynamischen Blöcken sorgt dafür, dass Ihr Terraform-Code übersichtlicher und wartungsfreundlicher ist, so dass bei Konfigurationsänderungen weniger Nacharbeit erforderlich ist.

Nehmen wir an, Sie müssen eine ähnliche neue Ingress-Regel zu Ihrer Sicherheitsgruppe hinzufügen, um mit dem vorherigen Beispiel fortzufahren. Bei einer Konfiguration, die dynamische Blöcke verwendet, müssen Sie nur einen neuen Wert des Ports zur Liste der Ingress-Variablen hinzufügen.

Erfahren Sie mehr über Cloud Computing