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.
AWS Infrastruktur Deployments mit Terraform automatisieren
Was ist Infrastructure as Code (IaC)?
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 konfiguriertterraform 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
- Melde dich bei der
AWS Management Console
an und navigiere zumIAM-Service
. - Wähle im IAM-Dashboard die Registerkarte
Benutzer
aus und klicke auf die SchaltflächeBenutzer hinzufügen
. - 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). - Wähle auf der Seite
Berechtigungen festlegen
die OptionDirektes Anfügen von Richtlinien
. - Gib im Suchfeld
AmazonEC2FullAccess
ein, um die managed Policy zu finden, die den Zugriff auf EC2-Ressourcen gewährt. - Wähle
AmazonEC2FullAccess
aus, indem du das Kontrollkästchen daneben aktivierst. - 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. - Überprüfe auf der Seite
Überprüfen
die Details und Berechtigungen für den Benutzer. - Klicke auf die Schaltfläche
Benutzer erstellen
, um den Automation User zu erstellen. - Nachdem der Benutzer erstellt wurde, klicke auf seinen Nutzernamen in der Liste
- Wechsel nun zur Registerkarte
Sicherheitsanmeldeinformationen
- Unter
Zugriffsschlüssel
, drücke den ButtonZugriffsschlüssel erstellen
- Wähle die Option
Befehlszeilenschnittstelle (CLI)
- Setze auf der Seite ganz unten einen Haken, dass du eventuelle Hinweise zu Alternativen von AWS gelesen hast und drücke auf
Weiter
- Gib dem Zugriffsschlüssel eine sinnvolle Beschreibung wie
terraform
und drücke aufZugriffsschlüssel erstellen
- Auf der letzten Seite siehst du den
Access Key
und denSecret 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.
- Öffnen dein Terminal bzw. deine Shell
- 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 einesAmazon 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 Namenexample
erstellt eine neue EC2 Instanz mit dem Instanz-Typt2.micro
. Für das AttributAMI
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:
- Öffne eine neue Shell und navigiere zum Verzeichnis, in dem du die .tf-Datei erstellt hast.
- 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. - 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. - Führe nun
terraform apply
aus, um deine Änderungen anzuwenden. Terraform gibt den Plan erneut aus und fordert dich zur Bestätigung auf. Gibyes
ein, um fortzufahren. - 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.
- 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. Gibyes
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.
Terraform Best Practices
- Organisiere deinen Terraform Code in wiederverwendbaren Modulen, die verwandte Ressourcen zusammenfassen und eine modulare Architektur für deinen Infrastrukturcode bereitstellen.
- 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.
- 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.
- 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.
- 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.