Programmieren statt Konfigurieren: Infrastruktur als TypeScript-Code

Das quelloffene Entwicklerframework Cloud Development Kit dient dem Erstellen von Infrastruktur und lässt sich unter anderem mit TypeScript nutzen.

In Pocket speichern vorlesen Druckansicht 8 Kommentare lesen

(Bild: Pixelbliss/Shutterstock.com)

Lesezeit: 17 Min.
Von
  • Robert Hoffmann
Inhaltsverzeichnis

Infrastructure as Code (IaC) ist eine verbreitete Best Practice, bei der Code – statt manueller Prozesse – die Infrastruktur verwaltet und provisioniert. Dafür kommen bekannte Werkzeuge wie AWS CloudFormation oder Terraform zum Einsatz. Eines haben fast alle Werkzeuge gemeinsam: Sie nutzen eine Konfigurationssprache wie YAML zum Beschreiben der Infrastruktur. Damit gehen einige Herausforderungen einher, denn lückenhafte IDE-Unterstützung und umfangreiche Templates reduzieren die Übersichtlichkeit und Produktivität. In den letzten Jahren ist eine alternative Herangehensweise populär geworden. Eine neue Generation von IaC-Werkzeugen erlaubt es, Infrastruktur mit universellen Programmiersprachen zu beschreiben. Ein praktisches Beispiel stellt einen bekannten Vertreter näher vor: das Cloud Development Kit, kurz CDK. 

Das CDK ist ein Open-Source-Framework zum Definieren von Infrastruktur mithilfe bekannter Programmiersprachen wie Python, Java, Go, JavaScript und TypeScript. Nachfolgend liegt der Fokus auf dem Verwenden des CDK mit TypeScript. Die 2012 veröffentlichte Programmiersprache ist ein Superset von JavaScript und hebt sich vor allem durch ihre statische Typisierung ab.

Wird AWS verwendet, macht das CDK aus Code eine deklarative Beschreibung in AWS CloudFormation, die dann Ressourcen (Infrastruktur) in der Cloud erzeugt. CDK gibt es auch für Kubernetes und Terraform (Abb. 1).

(Bild: Amazon Web Services)

Das Beschreiben der Infrastruktur mit Programmcode erlaubt TypeScript-Entwicklerinnen und -Entwicklern, in ihrer bekannten Entwicklungsumgebung zu arbeiten und auf hilfreiche Funktionen wie Autovervollständigung und Inline-Dokumentation zurückzugreifen. Zudem bietet das CDK zusätzliche Abstraktionen, genannt Constructs, zum Aufsetzen der Infrastruktur.

Nun geht es an das Verwenden des Cloud Development Kit, um Infrastruktur auf AWS zu modellieren. Hierzu ist es nötig, eine CDK-Anwendung in der gewünschten Programmiersprache zu schreiben, beispielsweise TypeScript. Eine CDK-Anwendung kann mehrere Stacks, also Gruppierungen von Infrastruktur, enthalten. Innerhalb eines Stacks instanziiert der Entwickler oder die Entwicklerin eine Reihe von Klassen, die die eigentliche Infrastruktur repräsentieren, wie beispielsweise eine virtuelle Maschine mit Amazon EC2 oder einen Objektspeicher wie Amazon S3. Diese Klassen heißen Constructs (siehe Abbildung 1). Sie können die Infrastruktur mit sinnvollen Voreinstellungen aufsetzen und typische Konfigurationen per Funktionsaufruf aktivieren. Das beschleunigt das Definieren der gesamten Infrastruktur und macht es leichter, Best Practices zu befolgen. Constructs können unterschiedlich komplex sein und entweder einzelne Infrastrukturkomponenten enthalten oder sogar ganze Architekturen. 

Eine CDK-Anwendung schreiben Entwickler in der gewünschten Programmiersprache. Dann übersetzt das CDK CLI es in ein Template eines IaC-Werkzeugs, in diesem Fall CloudFormation für AWS (Abb. 2).

(Bild: Amazon Web Services)

Danach wird das CDK CLI verwendet, um den Anwendungscode in ein CloudFormation-Template zu übersetzen. AWS CloudFormation ist ein Service, um Infrastruktur auf AWS deklarativ zu beschreiben und auszurollen. Das CDK CLI sendet das Template zum CloudFormation-Dienst, um die eigentliche Infrastruktur zu erstellen (siehe Abbildung 2). Das Interessante bei diesem Prozess ist, dass das CDK auf bestehende IaC-Werkzeuge aufsetzt.

Das Cloud Development Kit ist Open Source und in großen Teilen treibt eine offene Community seine Entwicklung voran. Heute existiert das CDK in verschiedenen Varianten, die jeweils unterschiedliche Clouds beziehungsweise Plattformen programmieren können. Initial hatte AWS es als AWS CDK ins Leben gerufen. Wie der Name erahnen lässt, liegt hier der Fokus auf der Modellierung von Infrastruktur und der Nutzung von Diensten in der AWS Cloud. Die Kernkomponenten von CDK verwendeten weitere Open-Source-Projekte wieder, um Kubernetes-Anwendungen (cdk8s) und Ressourcen mit Terraform (cdktf) mit dem gleichen Programmiermodell aufsetzen zu können. Damit deckt das CDK-Ökosystem eine sehr breite Auswahl an Plattformen ab. Wie beim AWS CDK generiert das zugehörige CLI die Templates aus dem geschriebenen Programmcode. Diese Templates lassen sich dann mit den nativen Funktionen der jeweiligen Werkzeuge beziehungsweise Plattformen ausführen. cdk8s synthetisiert YAML-Dateien, die das Kubernetes-Kommandozeilenwerkzeug kubectl direkt lesen und anwenden kann. cdktf synthetisiert Terraform-Templates im JSON-Format.

Dass das CDK mehr ist als die Übersetzung von Programmcode in Templates für CloudFormation, Kubernetes oder Terraform, demonstriert ein praktisches Beispiel. Es zeigt, wie die Constructs als Abstraktionen dienen können, um mit wenigen Zeilen Programmcode Architekturen mit sinnvollen Standardkonfigurationen aufzubauen.

Die Beispielarchitektur für eine hochverfügbare Webanwendung besteht aus einem Application Load Balancer (ALB) und einer Auto Scaling Group (ASG) (Abb. 3).

(Bild: Amazon Web Services)

Die Beispielarchitektur besteht aus einem Application Load Balancer, der über das Internet erreichbar ist. Er verteilt HTTP-Anfragen an eine Amazon EC2 Auto Scaling Group. Die Definition dieser Architektur mit Berücksichtigung einiger Best Practices schlägt sich – beim Verwenden von CloudFormation – in über 300 Zeilen YAML nieder. Es stellt sich die Frage, warum eine einfache Architektur schon so viele Zeilen Code benötigt. Die Antwort liegt darin, dass das in Abbildung 3 dargestellte Diagramm eine vereinfachte Sicht ist, die eine Menge zusätzlich zu definierender Objekte und Einstellungen unterschlägt (siehe Abbildung 4).

Eine Auflistung der zusätzlichen Objekte und Einstellungen, die jeweils für den Application Load Balancer (ALB), das Virtual Private Network (VPC) und die Auto Scaling Group (ASG) zu erstellen beziehungsweise vorzunehmen sind (Abb. 4)

(Bild: Amazon Web Services)

Zum einen ist eine Amazon Virtual Private Cloud (VPC), die private Netzwerkumgebung, zu konfigurieren. Das erfordert viele Entscheidungen: Welcher IP-Adressbereich soll zum Einsatz kommen? Wie viele Subnetze soll es geben? In wie vielen Availability Zones, also diskreten Rechenzentren innerhalb einer AWS-Region, sind Subnetze zu erstellen? Gibt es öffentliche Subnetze, die vom Internet erreichbar sind, und private, die es nicht sind? Auf all diese Fragen gibt es Antworten in Form von Best Practices, die entweder bekannt oder zunächst zu recherchieren sind. Damit aber nicht genug: Zum anderen ist es anschließend nötig, die Einzelkomponenten zu konfigurieren und miteinander zu verbinden. So braucht es für die Kommunikation zwischen Subnetzen und mit dem Internet jeweils Routing-Tabellen. Je nachdem, ob es sich um ein öffentliches oder privates Subnetz handelt, enthalten die Routing-Tabellen eine Route zum Internet oder zum Network-Address-Translation-(NAT)-Gateway. Das NAT-Gateway benötigt noch eine Elastic IP, also eine öffentliche IP-Adresse, mit der es im Internet die privaten Hosts vertritt. 

Für den Application Load Balancer und die Auto-Scaling-Gruppe sind ebenfalls zusätzliche Objekte und Einstellungen anzulegen. Ein Aspekt sind die Security Groups, die als virtuelle Firewalls fungieren und entsprechend mit Regeln für ein- und ausgehenden Datenverkehr zu versehen sind. Die Vielzahl an Konfigurationsmöglichkeiten ist der Grund, warum eine auf den ersten Blick einfache Architektur zu einem über 300 Zeilen langen CloudFormation-Template wird.