Durch die Automatisierung deiner Infrastruktur gewährleistest du Stabilität, Reproduzierbarkeit und schaufelst dir wertvolle Zeit frei, die du nutzen kannst, um an statt in deiner Infrastruktur zu arbeiten. Ich zeige dir, wie du deine Infrastruktur in Terraform definierst und mit einer CI/CD Pipeline automatisierst.
Terraform konsolidiert deine Infrastruktur dank seiner einfachen Hashicorp configuration language in einem einfachen, einheitlichen Konfigurationsformat. Deine Infrastruktur wird dabei durch seine Konfiguration abgebildet, man spricht auch von Infrastructure as Code (kurz "IaC"). Du musst dich zum Anpassen deiner Infrastruktur nicht mehr in verschiedenen Konten einloggen und manuell Änderungen vornehmen, sondern kannst deine zentrale Konfiguration ändern und sie mit Terraform auf deine Umgebung anwenden.
Auch komplexe Cloud-Infrastrukturen kannst du in sauberem Code somit verständlich und reproduzierbar abbilden. Diese Abbildung ist zentral verfügbar und jederzeit für jeden ersichtlich. Praktisch jeder größere Anbieter unterstützt eine Form von Automatisierung, z.B. via Terraform. Dadurch kannst du auch anbieterübergreifende Projekte an einem Ort zusammenlegen und managen.
Der Workflow von Terraform ist denkbar einfach:
CI/CD steht für Continuous Integration, Continuous Delivery und Continuous Deployment. Häufig erweitert durch manuelle Review-Prozesse und andere konstruktive und Analytischen Maßnahme findet hier ein großer Teil der Sicherung deiner (Software-)Qualität statt.
Continuous Integration beschreibt den Prozess, der jedes mal durchgeführt wird, wenn du etwas an deinem Source Code änderst. Die Änderung wird in die bisherige Code Basis integriert, gebaut und getestet. Fehler fallen dadurch frühzeitig auf und schaffen es gar nicht erst in deine Produktionsumgebung.
Die Änderungen, die du kontinuierlich integriert hast werden im Schritt der Continuous Delivery ausgeliefert. So können sie in einer Testumgebung ausführlich geprüft und die Qualität gesichert werden. Während die Continuous Integration nur Fehler im Code an sich aufspüren kann, kann die Continuous Delivery auch Fehler finden, die nur auftreten, wenn deine Anwendung auch deployed wird. Wir haben bereits gezeigt an wie vielen Stellen Continuous Delivery dir einen deutlichen Marktvorteile verschafft.
Wenn sowohl die Continuous Integration, als auch die Continuous Delivery grünes Licht geben, steht deiner Anwendung nichts mehr im Wege, um im Zuge des Continuous Deployment direkt in deine Produktivumgebung übernommen zu werden.
Wir werden nun unseren bekannten Terraform Workflow im Sinne der CI/CD automatisieren. Die Terraform Konfiguration kannst du ganz einfach in einem öffentlichen oder privaten GitHub Repository deiner Wahl unterbringen. Wir verlassen uns beim CI Server auf GitHub Actions.
Bei der CI/CD werden wir zwischen zwei Workflows unterscheiden. Jeder Branch wird für sich einen Terraform Plan generieren. Nur der Workflow auf der main Branch wird am Schluss auch den Terraform Plan umsetzen. In einem Pull Request kannst du den Terraform dadurch anschaulich darstellen und noch innerhalb deines VCS entscheiden, welche Änderungen an deiner Infrastruktur es in Production schaffen.
Der erste Schritt ist die Erstellung eines GitHub Accounts und eines Terraform Cloud Accounts. Während wir die Konfiguration in GitHub sichern, sichern wir den Terraform State in der Terraform Cloud.
Nach der Erstellung deines Accounts solltest du für dein Projekt einen neuen Workspace anlegen. Wir benötigen nur ein API-driven workflow Projekt, da wir jegliche CI/CD Pipeline in GitHub Actions ausführen. Als nächstes erstellst du dir deinen Terraform Cloud API Token, den wir brauchen, um aus GitHub Actions auf deine Terraform Cloud zuzugreifen.
Erstelle dir ein neues GitHub Repository, das du ab jetzt für die Arbeit mit Terraform nutzen wirst. In den Secrets deines GitHub Projekts (Settings -> Secrets) trägst du deinen Terraform Cloud API Token ein. Du kannst ihn zum Beispiel TF_API_TOKEN
nennen.
Terraform selbst solltest du z.B. in der main.tf
wie folgt konfigurieren:
terraform { required_providers { } backend "remote" { organization = "YOUR_ORGANIZATION_NAME" workspaces { name = "YOUR_WORKSPACE_NAME" } } }
Zuletzt legen wir noch den GitHub Workflow an, der ie Arbeit mit Terraform übernehmen wird. Erstelle dafür die Datei .github/workflows/terraform.yml
und fülle sie mit diesem Inhalt.
Was genau macht dieser Workflow:
Fertig! So schnell kann es gehen. Terraform wird ab jetzt automatisiert deine Terraform Konfiguration anwenden. Ab jetzt werden alle deine Änderungen auf der main branch sofort in deine Infrastruktur übernommen. Für alle anderen Änderungen wird dir zuerst der Execution Plan von Terraform im Pull Request zur Überprüfung vorgelegt, bevor du die Änderungen in die main Branch übernimmst, oder auch nicht.
Happy Terraforming!