Klauke Enterprises Blog

Wie du deine Infrastruktur automatisierst - CI/CD mit Terraform

Geschrieben von Felix Klauke | 20.04.2021

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.

Was ist Terraform

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:

  1. Du beschreibst deine Infrastruktur in deiner Terraform Konfiguration
  2. Du übergibst deine Konfiguration an Terraform
  3. Terraform erstellt sich einen execution plan und legt fest, wie es deine Infrastruktur von ihrem Ist-Zustand in den Soll-Zustand überführt
  4. Terraform wendet seinen Plan an und sorgt dafür, dass sich deine Infrastruktur mit deiner Konfiguration deckt

Was ist CI/CD

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. 

Terraform und CI/CD

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. 

Terraform Cloud Account erstellen

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.

GitHub einrichten

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:

  1. Im Schritt Checkout werden deine Konfigurationen aus deinem GitHub Repository auf den CI Server geladen
  2. Mit Setup Terraform stellt der CI Server die Umgebung für Terraform bereit
  3. Mit Terraform Format werden deine Konfigurationen auf ihr richtiges Format überprüft
  4. Die Initialisierung von Terraform stellt eine Verbindung mit der Terraform Cloud her, um die Daten in deinem Backend abrufen zu können
  5. Im Terraform Plan Schritt wird der execution Plan für Terraform erstellt
  6. Im nächsten Schritt erstellt der CI Server einen Kommentar, wenn es sich bei der Ausführung um einen Pull Request handelt und stellt dir somit den execution plan im Pull Request zur Review bereit
  7. Wenn der Plan nicht erstellt werden konnte beendet der Terraform Plan Status Schritt die Ausführung der Pipeline
  8. Im 8. und letzten Schritt wird der Terraform Plan ausgeführt, wenn es sich um einen Push auf die main Branch handelt. 

Fazit

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!