Infrastructure as Code (IaC) zur Bereitstellung von Servern und anderen Diensten ist ein fundamentaler Baustein aktueller Softwarelösungen. Meist in Verbindung mit Infrastructure as a Service (IaaS) genutzt, sichert es eine konsistente Konfiguration der zum Softwarestand benötigten Strukturen, wie Datenbanken, Netzwerk- und Speicherkomponenten. Dabei gibt es unterschiedliche Ansätze zum Beschreiben der Hardwarestrukturen und in diesem Beitrag wollen wir Terraform vorstellen, unsere Erfahrungen mit Terraform skizzieren und einen Vergleich zu Azure ARM Templates ziehen.
Terraform
Terraform ist eine Softwarelösung zum Planen und Einspielen von Änderungen in die Infrastruktur. Es können verschiedene IaaS-Anbieter, wie Azure, AWS oder die Google Cloud Plattform, eingebunden werden. Dabei kommen Provider zum Einsatz, um die Konfiguration in Befehle und Formate der Zielplattform zu überführen. Die Konfigurationsdatei enthält alle Komponenten, welche für die Anwendung nötig sind (siehe Abbildung 1). Im Beispiel sieht man die Azure Provider Konfiguration zu Beginn, gefolgt von Definitionen für eine Azure Resource Group und einen App Service Plan samt Webapp. Die hier verwendeten Einstellungen wie Anwendungseinstellungen und Datenbankverbindung können auf aus Variablen eingefügt werden, welche über die Releasepipeline geseeded werden können.
Terraform nutzt außerdem einen State, welcher die bestehende Infrastruktur inklusive aller aktuellen Einstellungen abbildet (siehe Abbildung 2). Dieser wird beim Planen von Änderungen genutzt, um die Differenz zwischen bestehender und definierter Infrastruktur zu ermitteln. Dieses Feature erlaubt es vor dem Deployment die Änderungen anzuzeigen und somit Fehler vorzubeugen. Der State kann für Testzwecke lokal und für den Einsatz im Projekt remote gehostet werden. So wird ein konsistenter State für alle Pipelines und Anwender bereitgestellt. Außerdem kann der im Planen-Schritt erstellte State gespeichert und für ein späteres Deployment verwendet werden. Dies ermöglicht es Änderungen vor dem Auspielen explizit freizugeben.
Einsatz von Terraform in Smart Edge
Auch im AIT Smart Edge setzen wir auf Terraform als IaC-Lösung. Alle Azure Ressourcen können über Infrastruktur-Pipelines bereitgestellt werden. Wir profitieren hier von der einfachen Integrierbarkeit von Terraform in Azure Pipelines. Bestehende Komponenten wurden via import-Kommando in den State geladen, um eine unnötige Wiederbereitstellung (Redeployment) von Komponenten zu vermeiden. Wir sind jedoch auch an die Grenzen gestoßen, da der Azure Provider nicht vom Cloud Plattform Betreiber, sondern von dem Terraform Hersteller HashiCorp Inc., in Zusammenarbeit mit der Community entwickelt wird.
Daraus ergeben sich Differenzen in den Features, gerade wenn neue Ressourcentypen zu Azure hinzugefügt oder um Features erweitert werden. Bei uns betraf es konkret die Time Series Insights zum Analysieren von IoT-Daten. Hier mussten wir auf den Azure ARM Standard zurückgreifen, da es den Resourcetypen “Time Series Insights” im Azure Terraform Provider noch nicht gab. Inzwischen wurde der Terraform Azure Provider um das geforderte Feature erweitert, das grundlegende Problem besteht jedoch weiterhin: Der Provider wird immer ein wenig hinter der aktuellen Plattform zurückbleiben.
Fazit
Terraform ist ein Tool, um schnell einfach zu verstehende IaC-Konfigurationen mit Standardkomponenten, wie WebApps und Serverless Functions, zu erstellen. Ferner lässt es auch die Bereitstellung der Ressourcen in weiter Cloud Dienste neben Microsoft Azure zu. Sobald ein Terraform-Projekt aber größer wird und mit neuen Plattform-Features gearbeitet werden soll, lohnt es sich unserer Meinung auch Azure ARM Templates in Betracht zu ziehen.
Die Konfiguration von komplexen Komponenten, wie SQL-Datenbanken, ist in Azure ARM Templates zwar ähnlich aufwendig wie in Terraform. Aber der anfänglich schwerere Einstieg in die ARM Templates wird durch die Aktualität und vollständige Konfigurierbarkeit schnell wettgemacht. Seit kurzem bietet die Azure CLI auch die Möglichkeit des Previews von Änderungen vor dem Deployment eines Templates auszugeben. Somit ist auch hier eine Vorabprüfung der Änderungen an der Infrastruktur ähnlich zum Terraform State möglich.