AWS Infrastruktur Deployments mit Terraform automatisieren

Terraform und AWS

Was ist Infrastructure as Code (IaC)?

Mit Infrastructure as Code (IaC) wird die Bereitstellung und Verwaltung von Infrastruktur durch Code und nicht händische Eingriffe durchgeführt. IaC standardisiert und optimiert die Infrastrukturbereitstellung, verbessert die Skalierbarkeit und reduziert das Potenzial für menschliche Fehler. Continuous Integration und Continuous Delivery (CI/CD) Pipelines ermöglichen die Prüfung und Bereitstellung von Änderungen am Infrastrukturcode, was Downtimes weiter reduzieren kann.

Was ist Terraform und welche Vorteile bietet es mir?

Mit Terraform kannst du sowohl Cloud- als auch On-Premise-Ressourcen in menschenlesbaren Konfigurationsdateien definieren. Diese Dateien kannst du versionieren, wiederverwenden und teilen. Anschließend kannst du einen konsistenten Workflow verwenden, um deine Infrastruktur während ihres gesamten Lebenszyklus zu bereitstellen und zu verwalten. Terraform kann Low-Level-Komponenten wie Compute-, Storage- und Networking-Ressourcen sowie High-Level-Komponenten wie DNS-Einträge und SaaS-Funktionen verwalten.

Terraform Basics

Terraform Provider verstehen

Terraform-Provider sind Plugins, die es Terraform ermöglichen, mit verschiedenen Arten von Infrastruktur zu interagieren, wie zum Beispiel Public Cloud-Services oder On-Premise Infrastruktur. Es gibt offizielle und von der Community bereitgestellte Terraform-Provider, die verwendet werden können. Offizielle Provider werden von HashiCorp entwickelt und gepflegt, dem Unternehmen, das Terraform erstellt hat, während Third-Party-Provider von der Community erstellt werden. Offizielle Provider sind in der Regel zuverlässiger und haben besseren Support, aber Third-Party-Provider können nützlich sein, um Nischen- oder spezialisierte Produkte zu integrieren.

Der Terraform State

Der Terraform State ist eine Datei, in der wir den aktuellen Zustand der von Terraform verwalteten Ressourcen speichern. Diese Datei enthält Informationen über die Ressourcen, einschließlich ihrer aktuellen Konfiguration, ihrer IDs und ihrer Abhängigkeiten. Wir verwenden den Status, um zu verfolgen, welche Ressourcen erstellt, aktualisiert oder gelöscht werden müssen. Der Status wird normalerweise in einer Datei namens terraform.tfstate gespeichert, die sich im Arbeitsverzeichnis befindet. Wenn wir jedoch Remote-Backends wie AWS S3 oder Terraform Cloud verwenden, kann der Status auch an einem zentralen Speicherort gespeichert werden, um Zusammenarbeit und Konsistenz zu ermöglichen.

Erläuterung des Terraform-Workflows: init, plan, apply und destroy

Der übliche Terraform Workflow umfasst vier Schritte:

  • terraform init: Initialisiert ein neues oder schon vorhandenes Terraform Arbeitsverzeichnis. Dabei werden die erforderlichen Module und Provider heruntergeladen und konfiguriert
  • terraform plan: Gibt eine Vorschau auf die Änderungen, die Terraform an Infrastrukturressourcen vornehmen wird.
  • terraform apply: Wendet alle erforderlichen Änderungen auf die tatsächlichen Ressourcen an.
  • terraform destroy: Entfernte alle von Terraform verwalteten Ressourcen und macht somit alle Änderungen des Apply-Schritts rückgängig.

Praxisbeispiel: Deployment einer EC2 Instanz auf AWS

Erstellung von Credentials für Terraform

Um Ressourcen auf AWS provisionieren zu können spricht Terraform mit der AWS API und muss sich logischerweise auch mit dieser authentifizieren. Dafür müssen wir Credentials mit entsprechenden Berechtigungen auf AWS anlegen

  1. Melde dich bei der AWS Management Console an und navigiere zum IAM-Service.
  2. Wähle im IAM-Dashboard die Registerkarte Benutzer aus und klicke auf die Schaltfläche Benutzer hinzufügen.
  3. Gib einen Namen für den Benutzer an und setze keine Haken bei Gewähren des Benutzerzugriffs auf die AWS-Managementkonsole (wird nicht benötigt für Terraform).
  4. Wähle auf der Seite Berechtigungen festlegen die Option Direktes Anfügen von Richtlinien.
  5. Gib im Suchfeld AmazonEC2FullAccess ein, um die managed Policy zu finden, die den Zugriff auf EC2-Ressourcen gewährt.
  6. Wähle AmazonEC2FullAccess aus, indem du das Kontrollkästchen daneben aktivierst.
  7. Klicke auf die Schaltfläche Weiter: Tags, wenn du dem Benutzer Tags hinzufügen möchtest. Andernfalls fährst du mit dem nächsten Schritt fort.
  8. Überprüfe auf der Seite Überprüfen die Details und Berechtigungen für den Benutzer.
  9. Klicke auf die Schaltfläche Benutzer erstellen, um den Automation User zu erstellen.
  10. Nachdem der Benutzer erstellt wurde, klicke auf seinen Nutzernamen in der Liste
  11. Wechsel nun zur Registerkarte Sicherheitsanmeldeinformationen
  12. Unter Zugriffsschlüssel, drücke den Button Zugriffsschlüssel erstellen
  13. Wähle die Option Befehlszeilenschnittstelle (CLI)
  14. Setze auf der Seite ganz unten einen Haken, dass du eventuelle Hinweise zu Alternativen von AWS gelesen hast und drücke auf Weiter
  15. Gib dem Zugriffsschlüssel eine sinnvolle Beschreibung wie terraform und drücke auf Zugriffsschlüssel erstellen
  16. Auf der letzten Seite siehst du den Access Key und den Secret Access Key für den User. Notiere dir beide Keys oder lade das CSV File herunter, du kannst dir den Secret Access Key hinterher nicht noch einmal anzeigen lassen.

Quick Tipp: Wenn du AWS IAM-Berechtigungen erteilst, solltest du das Least Privilege Prinzip befolgen, d.h. verteile nur so viele Berechtigungen wie du auch wirklich brauchst. Verwende keine breiten Berechtigungen wie die verwaltete AdministratorAccess Richtlinie von AWS. Erstelle stattdessen bei Bedarf neue Richtlinien mit benutzerdefinierten Berechtigungen

Konfigurieren der Credentials für Terraform

Nachdem wir nun AWS Credentials Credentials generiert haben, werden wir diese nun so setzen, dass Terraform sie nutzen kann.

  1. Öffnen dein Terminal bzw. deine Shell
  2. Exportieren den Access Key und den Secret Access Key als Umgebungsvariable mit den folgenden Befehlen:

1 export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
2 export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY

Stelle sicher, dass du YOUR_ACCESS_KEY und YOUR_SECRET_ACCESS_KEY durch deine eigenen Credentials für deinen Automation User ersetzt. Diese Umgebungsvariablen erlauben es Terraform, sich bei AWS zu authentifizieren und deine Infrastruktur zu verwalten.

Ressourcen in Terraform erstellen

In Terraform ist eine Ressource eine logische Abstraktion einer Infrastrukturkomponente wie einer EC2-Instanz, einem S3-Bucket oder einer Datenbank. Ressourcen werden in Terraform Konfigurationsdateien definiert, und ihr Zustand wird im Terraform State gespeichert. Terraform Ressourcen haben mehrere Attribute wie Name, Region, Größe und Typ, die an bestimmte Anwendungsfälle angepasst werden können.

Terraform Definitionen werden in HCL (HashiCorp Configuration Language) geschrieben.

Im folgenden Beispiel werden wir eine einfache EC2 Instanz mit Terraform erstellen:

1. Lege eine neue Datei mit der Endung .tf (z.B. ec2.tf) und folgendem Inhalt an:

Unsere Terraform Konfiguration besagt folgendes:

  • Der AWS Provider wird konfiguriert Ressourcen in der eu-central-1 Region zu erstellen
  • Mit Hilfe einer datasource können wir in Terraform Informationen zu bereits bestehenden Cloud Ressourcen außerhalb unseren Workspaces abrufen. In unserem Falle rufen wir die ID eines Amazon Machine Images (AMI) , das wir für die Erstellung unserer EC2 Instanz brauchen, ab. Die Filter dienen dazu ein bestimmtes Image von Amazon Linux zu finden.
  • Die Ressource mit dem Typ aws_instance und dem Namen example erstellt eine neue EC2 Instanz mit dem Instanz-Typ t2.micro. Für das Attribut AMI referenzieren wir auf die zuvor abgerufene AMI ID unter Verwendung folgender Syntax: data.<DATA_SOURCE_TYPE>.<DATA_SOURCE>.<ATTRIBUTE>

Um unseren Code nun auszuführen, müssen folgende Schritte ausgeführt werden:

  1. Öffne eine neue Shell und navigiere zum Verzeichnis, in dem du die .tf-Datei erstellt hast.
  2. Intialisiere mit terraform init dein Arbeitsverzeichnis. Terraform wird nun entsprechend der .tf Datei den AWS Provider herunterladen und ihn mit den zuvor gesetzten Zugangsdaten konfigurieren.
  3. Führe den Befehl terraform plan aus. Die Ausgabe sollte besagen, dass versucht wird, eine Ressource zu erstellen. Überprüfe dies anhand deiner .tf-Datei.
  4. Führe nun terraform apply aus, um deine Änderungen anzuwenden. Terraform gibt den Plan erneut aus und fordert dich zur Bestätigung auf. Gib yes ein, um fortzufahren.
  5. Terraform wird jetzt versuchen, die EC2-Instanz zu erstellen. Nach wenigen Sekunden sollte Terraform dir mitteilen, dass es die Ressourcen erfolgreich erstellt hat. Gehe nun in die AWS Management Console (oder nutze die aws-cli) und überprüfe, ob deine EC2-Instanz erstellt wurde.
  6. Um deine Instanz wieder zu zerstören, führe terraform destroy aus. Terraform wird dir mitteilen, dass es versucht, eine Ressource zu zerstören, und dich erneut um Bestätigung bitten. Gib yes ein, um fortzufahren. Nach wenigen Sekunden sollte Terraform dir mitteilen, dass es eine Ressource erfolgreich zerstört hat. Überprüfe erneut die Management Console, um zu verifizieren, dass die Instanz verschwunden ist.
Plan
Plan
Destroy
Destroy

Terraform Best Practices

  1. Organisiere deinen Terraform Code in wiederverwendbaren Modulen, die verwandte Ressourcen zusammenfassen und eine modulare Architektur für deinen Infrastrukturcode bereitstellen.
  2. Befolge das DRY-Prinzip (Don’t repeat yourself): Vermeide mehrfach den gleichen Code zu schreiben, indem du Variablen, Datenquellen und Module effektiv verwendest. Zentralisiere gemeinsame Konfigurationen und Parameter, um die Redundanzen zu reduzieren und ihn gleichzeitig lesbarer zu machen.
  3. Nutze Variablen, um deinen Code flexibler und wiederverwendbarer zu machen. Du kannst Variablen für konfigurierbare Parameter wie z.B. Ressourcennamen oder Instanzgrößen verweden.
  4. Versioniere deinen Code. Speichere deinen Terraform Code in einem Git Repository, um Zusammenarbeit zu ermöglichen, Änderungen im Laufe der Zeit zu verfolgen und Rollbacks bei Bedarf zu erleichtern.
  5. Verwalte deinen Terraform State ordnungsgemäß und nutze keinen lokalen State für produktive Umgebungen, um den aktuellen Zustand deiner Infrastruktur zu verfolgen. Verwende Remote-Backends wie AWS S3 oder Terraform Cloud für die gemeinsame Statusverwaltung, um Zusammenarbeit zu ermöglichen und Konsistenz zwischen Teammitgliedern zu gewährleisten.

Quick Tipp: Bevor du Änderungen an der Infrastruktur vornimmst, führe immer zuerst terraform plan aus. Überprüfe die geplanten Änderungen sorgfältig, um sicherzustellen, dass sie deinen Erwartungen entsprechen.

Fazit

Die Verwendung von IaC Tools wie Terraform vereinfacht Infrastrukturbereitstellung in der Cloud stark. Deployments können in der Regel schneller als von Hand durchgeführt werden und potentielle menschliche Fehlerquellen werden reduziert. Zudem haben wir durch die Definition as Code eine Übersicht über alle bereitgestellten Ressourcen und unter der Verwendung von Versionskontrollsystemen einfache Rollback-Optionen.