Infrastructure as Code: Mit Terraform einen multiregionalen Blog in der Public Cloud erstellen – Teil 2
Willkommen zum zweiten Beitrag unserer Serie zu Infrastructure as Code mit Terraform. Nachdem wir die Grundlagen für unser Projekt geschaffen haben, ist es nun an der Zeit, eine erste Instanz zu konfigurieren und darauf Ihren Blog einzurichten. In einem Umfeld, in dem der Entwickler den Ton angibt, ist auch klar, dass man seine Infrastruktur gerne auf dieselbe Art patchen würde, wie man seinen Code korrigiert, d. h. mit denselben Möglichkeiten für Automatisierung, Reproduzierbarkeit und Zusammenarbeit. Dank Infrastructure as Code ist dies inzwischen möglich, und wir können Ressourcen auf dieselbe Weise verwalten, wie wir den Code einer Anwendung bearbeiten. Mit dieser Beitragsserie möchten wir die Vorteile dieses Ansatzes verdeutlichen. Anstatt nur theoretische Überlegungen anzustellen, wollten wir lieber an einem konkreten Projekt arbeiten, anhand dessen wir die Grundprinzipien von Infrastructure as Code genau aufzeigen können. Wir haben uns dabei für Terraform entschieden, das besonders gut den Anforderungen der Abstraktion von Infrastrukturen in einer hybriden Umgebung gerecht wird. Die Snippets in den Beiträgen haben wir unserer detaillierten, auf Github verfügbaren Anleitung entnommen. Im ersten Beitrag sind wir auf die grundlegenden Funktionen von Terraform eingegangen und haben die Schlüsselwörter provider, resource und variable sowie die Erstellung einer ersten Deployment-Umgebung erklärt. Im vorliegenden Artikel besprechen wir zuerst den Start einer Instanz sowie die Konfiguration unserer Website. Im Anschluss erklären wir, wie die Infrastruktur gesichert und eine einfache Lastverteilung zwischen zwei Regionen eingerichtet wird. Da wir in diesem Beitrag nicht näher auf die Verwendung von Content Management Systemen (CMS) eingehen, werden wir unseren Blog mithilfe von Hugo erstellen, einem ausgezeichneten Generator für statische Webseiten, der sehr einfach installiert werden kann.
Die Instanz vorbereiten Um Ihre Instanz zu definieren, öffnen Sie die Datei „main.tf“. Dort patchen Sie zunächst den provider (in unserem Beispiel OpenStack) und geben die verwendete Version (1.5) an, damit es bei einer größeren Aktualisierung von Terraform nicht zu Problemen mit Ihrer Infrastruktur kommt. Mit diesem Trick können Sie sich viel Ärger sparen. Legen Sie außerdem die Region als Variable fest, um später mehrere OpenStack-Regionen nutzen zu können.
Kommen wir nun zur Instanz an sich. Mehrere Elemente sind für den Start der Instanz notwendig. Terraform ermittelt die Abhängigkeiten und generiert dann den passenden Plan.
Bei genauerer Betrachtung des von uns verwendeten Codes werden Sie bemerken, dass Terraform die Interpolation von Variablen erlaubt: Deshalb erscheint auf unserer Instanz auch der Parameter „var.count“ in der Zeile der Property „count“. Mit der Interpolationssyntax, die sowohl in JSON als auch in HCL (HashiCorp Configuration Language) verfügbar ist, können wir an dieser Stelle die Anzahl der Instanzen, die gestartet werden sollen, angeben. Terraform wird dann so oft iterieren, wie es der Wert der Variable count angibt. Sie kann außerdem für andere Dinge genutzt werden, beispielsweise für die Durchführung von logischen Operationen (zum Beispiel um zu überprüfen, ob eine Variable eine Bedingung erfüllt, bevor eine Ressource erstellt wird).
System nach dem Start konfigurieren Für die Konfiguration der Maschine gilt dieselbe Logik: Die Benutzerdaten (user_data) werden in ein Template geschrieben, das die Skripte und Dateien festlegt, die bei Erstellung der Instanz ausgeführt bzw. geladen werden. Diese Templates werden von Terraform entsprechend dem Abhängigkeitsbaum der Ressourcen zusammengestellt. An dieser Stelle können Sie zum Beispiel auch Apache konfigurieren, um eine von Ihnen zuvor erstellte Virtual-Host-Datei zu hosten.
Es ist zudem möglich, für jede Ressource Parameter für die automatische Provisionierung festzulegen, um noch effizienter zu werden oder einfach nur, wenn die Datenmenge zu groß ist. Wir fordern beispielsweise für jede per SCP gestartete Instanz eine Kopie unseres Bloginhalts an. Nun können wir unsere erste Instanz erstellen. Um diese bestmöglich zu sichern, ist es jedoch von Vorteil, ein TLS-Zertifikat einzurichten und die Instanz redundant aufzusetzen. Ein TLS-Zertifikat generieren Sie müssen das Let‘s Encrypt-Zertifikat natürlich nicht manuell auf Ihrem Apache Server einrichten, sondern können in Terraform einstellen, dass das Zertifikat automatisch bei der Erstellung der Instanz generiert und integriert wird. Diese Funktion ist nicht nativ in Terraform vorhanden. Installieren Sie deshalb das Plugin ACME Provider. Terraform wird dann den Account und das Zertifikat mithilfe dedizierter Ressourcen erstellen, bevor es eine Bestätigung anfordert.
Nun haben Sie Ihre Instanz mit einem TLS-Zertifikat gesichert. Sie können Ihre Infrastruktur aber auch zusätzlich mit einer zweiten Instanz, die in einer anderen Region gehostet ist, vor Ausfällen schützen. In diesem Beitrag werden wir nur auf die einfache Lastverteilung per Round Robin DNS eingehen. Mit Terraform haben wir allerdings weit mehr Möglichkeiten, um eine hohe Verfügbarkeit zu erreichen.
Round Robin DNS einrichten Um unsere Instanz in einer neuen Region zu erstellen, müssen einfach der entsprechende OpenStack provider (Region B) in der „main.tf“-Datei angegeben und anschließend die Konfigurationselemente dieser neuen Instanz (Port Netz B, Instanz B, ...) eingetragen werden. Jetzt wird nur noch mithilfe des providers OVH, der alle notwendigen Ressourcen für den Betrieb unserer APIs auflistet, eine Verbindung zwischen den Instanzen hergestellt. Mit der Ressource „ovh_domain_zone_record“ können wir unsere DNS-Zone und alle zugehörigen Einträge spezifizieren. Sie haben nun einen einsatzbereiten Blog mit einfacher Lastverteilung zwischen zwei Instanzen in zwei verschiedenen Regionen erstellt. Durch diese wenigen Schritte unseres Projekts haben wir bereits ein besseres Verständnis davon, wie eine Instanz auf Terraform funktioniert und wie die unterschiedlichen Properties verwendet werden. Doch unsere Möglichkeiten mit Terraform sind noch lange nicht ausgeschöpft. Im nächsten Beitrag unserer Serie erfahren Sie mehr!
Weitere Informationen zu den verwendeten Terraform-Templates finden Sie in unserer GitHub-Dokumentation:
- Eine gebrauchsfertige Instanz erstellen - Sicherheit und Redundanz zwischen den Regionen gewährleisten