Was ist Terraform? Was ist Infrastrukturbereitstellung? Definition von Infrastruktur als Code
Infrastructure as Code (IaC) ist das Konzept der Verwaltung und Bereitstellung Ihrer IT-Infrastruktur mithilfe von Konfigurationsdateien. Terraform ist ein Infrastructure-as-Code-Software-Tool, mit dem Sie Ihre Infrastruktur sicher und vorhersehbar aufbauen, ändern und verbessern können.
Die Bereitstellung der Infrastruktur ist der Prozess der Einrichtung Ihrer IT-Infrastruktur. Sie bezieht sich auch auf die Schritte, die erforderlich sind, um den Zugang zu Daten und Ressourcen zu verwalten und sie für Benutzer und Systeme verfügbar zu machen.
Terraform ist ein von HashiCorp entwickeltes Open-Source-Orchestrierungstool, das mit der Programmiersprache Go erstellt wurde. Die Go-Sprache wird in eine Binärdatei namens "Terraform" kompiliert, die Anfragen an die Anwendungsprogrammierschnittstelle (API) des Cloud-Anbieters stellt. Terraform stellt diese Anfragen auf der Grundlage von vom Benutzer geschriebenen Infrastrukturvorlagen. Bei diesen Vorlagen handelt es sich um Textdateien, die ähnlich wie Programmcode geschrieben sind und die gewünschte Infrastruktur beschreiben, die erstellt werden soll.
Wofür wird Terraform verwendet? Terraform Basic Use Cases
Wie bereits erwähnt, ist Terraform ein Orchestrierungstool, das für Infrastructure as Code (IaC) verwendet wird. Es sorgt dafür, dass Konfigurationsdateien einer leicht zu lesenden Dokumentation ähneln, die On-Prem- und Cloud-Ressourcen beschreibt. Mit den unten beschriebenen Befehlen setzt Terraform diese Ressourcen um und schafft so die von uns gewünschte Infrastruktur.
Die folgende Abbildung zeigt, wie Sie Google Cloud Platform als Cloud-Anbieter konfigurieren und einen privaten Schlüssel implementieren. Dies erfordert Parameter für das GCP-Projekt, die Projektregion und -zone sowie eine GCP-Authentifizierungsdatei.

Sobald wir die Zone und den Provider definiert haben, können wir zu allem anderen übergehen, was unsere Infrastruktur benötigt: Instanzen, Load Balancer, automatische Skalierung, Sicherheitsgruppen usw. Hier ist ein einfaches Beispiel für die Definition eines Kubernetes-Clusters auf der Google Kubernetes Engine (GKE) mit Terraform.

Terraform Architektur & Grundlegende Befehle
Sobald die Vorlagen vorbereitet sind, können sie mit dem Befehl "terraform apply" angewendet werden, wodurch die gewünschte Infrastruktur erstellt wird. Wenn Sie diesen Befehl eingeben, übersetzt die Terraform-Binärdatei den Terraform-Code in eine Reihe von API-Anfragen an den Anbieter, der die Infrastruktur erstellt. In ähnlicher Weise wird der Befehl "terraform destroy" verwendet, um die bestehende Infrastruktur zu zerstören. Ein weiterer nützlicher Befehl ist "terraform plan", der einen Implementierungsplan erstellt, der festlegt, welche Maßnahmen ergriffen werden müssen, um die in den Vorlagen beschriebene Infrastruktur zu erreichen. Dieser Plan basiert auf den von Terraform verwendeten Vorlagen und Infrastruktur-Statusdateien.
Terraform speichert die Definition der bereits existierenden Infrastruktur in der sogenannten Terraform-Zustandsdatei. Diese Datei wird von Terraform verwendet, um die reale Infrastruktur mit Vorlagen zu korrelieren, Ressourcenverbindungen zu erhalten und die Produktivität beim Aufbau einer großen Infrastruktur zu verbessern. Die Zustandsdatei liegt im JSON-Format (JavaScript Object Notation) vor und wird standardmäßig lokal gespeichert, was für die individuelle Arbeit eine gute Option ist, aber nicht für die Teamarbeit. Wenn mehrere Personen an Terraform-Vorlagen arbeiten, gibt es Probleme beim Speichern der Statusdatei.
Da Terraform-Vorlagen in Form von Programmcode geschrieben werden, bedeutet dies, dass sie in einem Versionskontrollsystem gespeichert werden können, was es mehreren Entwicklern ermöglicht, daran zu arbeiten. Das Problem tritt beim Speichern und Arbeiten mit der Statusdatei auf. Da sie standardmäßig lokal gespeichert wird, bedeutet dies, dass bei der Verwendung eines Versionskontrollsystems die Zustandsdatei auch in diesem System gespeichert werden muss. Dies ist problematisch, weil es bedeutet, dass jeder Projektbeteiligte für einen ordnungsgemäßen Betrieb sicherstellen muss, dass er jedes Mal mit der neuesten Version der Statusdatei arbeitet. Diese Option ist zwar unbequem, würde aber funktionieren. Wenn die Zustandsdatei jedoch in einem gemeinsamen Speicher abgelegt wird, ergibt sich ein neues Problem - das Fehlen der so genannten "Sperre". Die Sperre verbietet die gleichzeitige Ausführung von Terraform-Operationen, die mit der Statusdatei arbeiten. Dies ist sinnvoll, da das gleichzeitige Schreiben in eine gemeinsam genutzte Statusdatei zu Konflikten, Datenverlust, Dateikorruption und Inkonsistenzen zwischen Vorlagen und Infrastruktur in der Statusdatei führen kann. Außerdem ist die Speicherung der Statusdatei in einem Versionskontrollsystem unerwünscht, da alle Daten in der Datei als unverschlüsselter Text gespeichert werden.
Bewährte Praktiken
Die gute Praxis für die Speicherung der Statusdatei besteht darin, sie über das so genannte Backend aus der Ferne zu speichern. Dieses Terraform-Backend bestimmt das Laden und Speichern von Daten in Terraform. Standardmäßig wird ein lokales Backend verwendet, um Daten auf der lokalen Festplatte zu speichern. Es ist möglich, ein Remote-Backend zu verwenden, über das Terraform Daten über den Zustand der Infrastruktur an einem entfernten Ort speichert, wodurch alle Probleme gelöst werden, die bei der Verwendung eines Versionskontrollsystems auftreten.
Es gibt auch einige gute Praktiken beim Schreiben des Codes zur Definition unserer Infrastruktur. Das erste Beispiel, das wir gegeben haben, ist eigentlich nicht die beste Praxis beim Schreiben von Terraform-Dateien. Wir empfehlen, verschiedene Terraform-Dateien zu verwenden, um den Code lesbarer und weniger komplex zu machen und ihn bei Bedarf leicht zu ändern. Sie können sich hier ein Beispiel für Infrastrukturdateien ansehen:

Wie Sie sehen können, gibt es Dateien wie Versionen, Ausgaben und Variablen. In den Variablendateien werden alle Variablen gespeichert, die für die Infrastruktur benötigt werden. Das ist eine wirklich gute Praxis, um Informationen zu speichern, denn - noch einmal - sie sind leicht zu lesen und später zu ändern. Wenn wir also das erste Beispiel der Definition des Google-Anbieters nehmen und es in zwei Dateien aufteilen, sieht die Variable wie folgt aus:

Genauso verhält es sich mit Versionen und Ausgaben. Sie können Versionen und Versionsanforderungen in der Versionsdatei und Ausgaben in der Ausgabedatei speichern. Sie können zwar alles in der Hauptdatei speichern, aber das ist keine gute Praxis.
Weitere ausführliche Tutorials und Praktiken zu Terraform finden Sie hier.

