Ausweitung von Terraform: Der Wunsch nach benutzerdefinierten Funktionen


Bicycle

Terraform-Funktionen sind zu einer zentralen Säule in der Verwaltung von Infrastructure as Code geworden. Diese integrierten Funktionen ermöglichen es Entwicklern, Daten zu manipulieren, Berechnungen durchzuführen und Ressourcenkonfigurationen innerhalb ihrer Terraform-Projekte zu optimieren. Mit der wachsenden Komplexität der Infrastruktur wächst auch der Bedarf an fortschrittlicheren und anpassbaren Funktionen, um spezifische Anforderungen zu erfüllen und Arbeitsabläufe zu optimieren.

Das aktuelle Set an Terraform-Funktionen bietet eine solide Grundlage, hat jedoch Einschränkungen bei der Handhabung bestimmter Anwendungsfälle. Dieser Blogbeitrag untersucht das Potenzial zur Erweiterung der Fähigkeiten von Terraform durch benutzerdefinierte Funktionen. Er geht auf den aktuellen Stand der Terraform-Funktionen ein, diskutiert die Auswirkungen benutzerdefinierter Funktionen auf Infrastructure as Code und beleuchtet Ansätze zur Implementierung dieser Funktion. Am Ende werden die Leser Einblicke gewinnen, wie benutzerdefinierte Funktionen die Flexibilität und Effizienz von Terraform bei der Verwaltung komplexer Infrastruktureinrichtungen revolutionieren könnten.

Aktueller Stand von Terraform-Funktionen

Übersicht der integrierten Funktionen

Terraform-Funktionen sind eingebaute, wiederverwendbare Codeblöcke, die spezifische Aufgaben innerhalb von Terraform-Konfigurationen ausführen. Diese Funktionen machen den Code dynamischer und stellen sicher, dass Konfigurationen dem DRY-Prinzip (Don't Repeat Yourself) folgen. Sie ermöglichen es den Benutzern, Daten zu manipulieren, Berechnungen durchzuführen und Ressourcenkonfigurationen innerhalb von Terraform-Projekten zu optimieren.

Die Syntax für eingebaute Funktionen folgt im Allgemeinen dem Muster: <function_name>(arg 1, arg 2). Diese Funktionen akzeptieren eine vordefinierte Anzahl und Art von Argumenten, obwohl einige, wie min() und max(), undefinierte Argumente desselben Typs verarbeiten können. Für eine verbesserte Effizienz können Benutzer Argumente mit Listen- oder Tupelvariablen und Erweiterungssyntax übergeben: (<list/tuple variable> ...).

Terraform bietet eine Vielzahl eingebaute Funktionen, darunter:

  • Typumwandlungsfunktionen
  • Längenberechnungsfunktionen
  • Funktionen zum Aufbau komplexer Variablen

Obwohl diese Funktionen nicht häufig verwendet werden, sind sie unerlässlich, um flexiblere und wartbare Konfigurationen zu erstellen.

Einschränkungen und Schmerzpunkte

Trotz ihrer Nützlichkeit weist das aktuelle Funktionssystem von Terraform mehrere Einschränkungen auf:

  • Fehlende benutzerdefinierte Funktionen: Benutzer können keine benutzerdefinierten Funktionen erstellen, um Verarbeitungsschritte hinzuzufügen, die über die eingebauten Möglichkeiten hinausgehen. Diese Einschränkung schränkt die Möglichkeit ein, Funktionen an spezifische Anwendungsfälle anzupassen.
  • Einschränkungen des Modulsystems: Das Modulsystem von Terraform ist zwar nützlich für die Wiederverwendung von Code, hat aber auch Einschränkungen. Die Unfähigkeit zur partiellen Anwendung kann die Modulschnittstellen verkomplizieren.
  • Typbeschränkungen: Bei der Definition der Typen der Eingabevariablen eines Moduls kann die Verwendung von Map- oder Objekttypen unpraktisch sein. Der Map-Typ erfordert, dass alle Werte denselben Typ haben, während der Objekt-Typ die Angabe aller Schlüsselnamen und Werttypen erfordert.

Community-Workarounds

Um diese Einschränkungen zu umgehen, hat die Terraform-Community mehrere Workarounds entwickelt:

  • Provider-definierte Funktionen: Einige Provider implementieren benutzerdefinierte Funktionen, die aus HCL verwendet werden können, obwohl diese Funktion relativ neu ist und es nur wenige Beispiele gibt.

Provider-definierte Funktionen

  • Verwendung von Modulen als Pseudo-Funktionen: Benutzer erstellen häufig Module, um ein funktionsähnliches Verhalten zu replizieren, indem sie Variablen, Lokale und Ausgabeprimitiven verwenden, um Parameter, Funktionskörper und Rückgabekonzepte zu imitieren.

  • Werkzeuge zur Codegenerierung: Werkzeuge von Drittanbietern wie Terramate wurden entwickelt, um die Einschränkungen von Terraform zu adressieren. Terramate führt Konzepte wie Stacks, globale Variablen und Codegenerierung ein, um das Management von Umgebungen zu vereinfachen und die Komplexität des Codes zu reduzieren.

    1globals {
    2  a = tm_try(global.b, null)
    3}
    
  • Kreative Nutzung bestehender Funktionen: Benutzer kombinieren häufig eingebaute Funktionen auf komplexe Weise, um gewünschte Ergebnisse zu erzielen, was jedoch zu weniger lesbarem Code führen kann.

Obwohl diese Workarounds eine gewisse Erleichterung bieten, fordert die Terraform-Community weiterhin die Einführung benutzerdefinierter Funktionen, um die Flexibilität und Wiederverwendbarkeit des Codes in der Infrastrukturverwaltung zu verbessern.

In einem Statement betont ein Contributor, dass aufgrund der Natur von HCL als nicht-generelle Programmiersprache jegliche neuen Funktionserstellungsfähigkeiten innerhalb von HCL von Natur aus begrenzt wären. Es wird erwähnt, dass partielle Anwendung und Funktionscurrying möglicherweise erreichbar wären, dies jedoch das Ausmaß der nativen Verbesserungen darstellen könnte. Anstatt HCL direkt zu erweitern, liegt der Entwicklungsschwerpunkt darauf, die Funktionsfähigkeiten durch die RPC-Schicht (Remote Procedure Call) zu erweitern, die für absehbare Zeit die primäre Methode zur Erweiterung der Funktionalität bleiben wird. Diese Aussage erfolgt als Reaktion auf fortlaufende Anfragen der Terraform-Community nach flexibleren und wiederverwendbaren Code-Optionen durch benutzerdefinierte Funktionen, wie in der vorherigen Kommunikation erwähnt.

Benutzerdefinierte Funktionen: Ein Game-Changer für IaC

Verbesserte Flexibilität in der Konfiguration

Benutzerdefinierte Funktionen haben das Potenzial, die Infrastructure as Code (IaC) zu revolutionieren, indem sie mehr Flexibilität bei der Konfiguration bieten. Derzeit bieten die eingebauten Funktionen von Terraform eine solide Grundlage für die Datenmanipulation und die Durchführung von Berechnungen. Die fehlende Möglichkeit, benutzerdefinierte Funktionen zu erstellen, schränkt jedoch die Möglichkeiten der Benutzer ein, Verarbeitungsschritte über die bereits vorhandenen hinaus hinzuzufügen. Diese Einschränkung führt häufig zu komplexen Workarounds und weniger effizientem Code.

Die Einführung benutzerdefinierter Funktionen würde es den Benutzern ermöglichen, komplexe Anforderungen effizienter zu bewältigen. Benutzerdefinierte Funktionen könnten z.B. spezifische Anwendungsfälle behandeln, die derzeit mit den vorhandenen integrierten Funktionen schwer zu handhaben sind. Diese Verbesserung würde es den Benutzern ermöglichen, dynamischere und anpassungsfähigere Konfigurationen zu erstellen, indem sie ihren Infrastrukturcode an spezifische Anforderungen anpassen, ohne auf umständliche Lösungen zurückgreifen zu müssen.

Verbesserte Wiederverwendbarkeit des Codes

Benutzerdefinierte Funktionen würden die Wiederverwendbarkeit von Code in Terraform-Projekten erheblich verbessern. Um Code wiederverwenden zu können, müssen Benutzer derzeit oft ganze Module erstellen, was für einfache Operationen mehr Aufwand als nötig bedeutet. Mit benutzerdefinierten Funktionen könnten Benutzer wiederverwendbare Logik definieren, die einfach in verschiedenen Teilen ihrer Konfiguration verwendet werden kann.

Beispielsweise könnte eine benutzerdefinierte Funktion definiert werden, um eine bestimmte Berechnung oder Datenumwandlung durchzuführen, die wiederholt in einem Projekt verwendet wird. Anstatt diese Logik zu duplizieren oder ein Modul zu erstellen, könnte der Benutzer einfach die benutzerdefinierte Funktion dort aufrufen, wo sie benötigt wird. Dieser Ansatz würde zu einem schlankeren, wartungsfreundlicheren und DRY (Don't Repeat Yourself) Code führen.

Domänenspezifische Optimierungen

Benutzerdefinierte Funktionen würden domänenspezifische Optimierungen ermöglichen, indem Benutzer Funktionen erstellen können, die auf ihre spezifische Branche oder Anwendungsfall zugeschnitten sind. Diese Funktion wäre besonders wertvoll für die Handhabung komplexer, branchenspezifischer Berechnungen oder Datenmanipulationen, die von den eingebauten Funktionen von Terraform nicht abgedeckt werden.

Darüber hinaus wäre die Möglichkeit für Provider, kontextspezifische Funktionen einzuschließen, ein Game-Changer. Dies würde es Cloud-Providern oder Drittanbietern ermöglichen, spezialisierte Funktionen anzubieten, die für ihre spezifischen Dienste oder Plattformen optimiert sind. Ein Cloud-Provider könnte beispielsweise benutzerdefinierte Funktionen für fortgeschrittene Netzwerksberechnungen oder Sicherheitsrichtliniengenerierung anbieten, wodurch der Prozess der Konfiguration komplexer Infrastrukturkomponenten vereinfacht wird.

Durch die Ermöglichung dieser domänenspezifischen Optimierungen würden benutzerdefinierte Funktionen die Lücke zwischen den allgemeinen Fähigkeiten von Terraform und den spezifischen Bedürfnissen verschiedener Branchen und Cloud-Umgebungen schließen, was letztlich zu einer effizienteren und effektiveren Infrastrukturverwaltung führt.

Implementierung benutzerdefinierter Funktionen: Mögliche Ansätze

Erweiterung von HCL

Während die Kernfunktionalität von Terraform ein robustes Set an eingebauten Funktionen umfasst, kann es Fälle geben, in denen spezifische Logik oder Datenmanipulation erforderlich sind, die nicht von den Standards abgedeckt werden. Obwohl Terraform das Erstellen benutzerdefinierter Funktionen innerhalb von HCL selbst nicht nativ unterstützt, können Entwickler diese Fähigkeit effektiv durch alternative Mittel simulieren.

Ein Ansatz zur Erweiterung der Fähigkeiten von HCL ist die Verwendung externer Datenquellen. Externe Datenquellen ermöglichen es Benutzern, externe Programme aufzurufen, die in jeder Sprache geschrieben sein können, die JSON-Ausgaben zurückgeben kann. Diese Methode ermöglicht es effektiv, benutzerdefinierte Funktionen zu erstellen, die extern ausgeführt werden, und bietet eine flexible Möglichkeit, komplexe Logik in Terraform-Konfigurationen einzubinden.

Eine weitere Methode zur Implementierung benutzerdefinierter Operationen ist die Verwendung von local-exec Provisionern. Diese Provisioner können Skripte auf dem lokalen Rechner ausführen, der Terraform ausführt, wenn Ressourcen erstellt oder geändert werden. Dieser Ansatz ist besonders nützlich für Szenarien, die benutzerdefinierte Operationen erfordern, die an bestimmte Lebenszyklusereignisse von Ressourcen gebunden sind.

Go-basierte Funktionsbibliotheken

Für fortgeschrittenere Anpassungen können Entwickler Terraform-Plugins mit Go erstellen. Dieser Ansatz beinhaltet das Erstellen eines Providers, der benutzerdefinierte Ressourcen und Datenquellen umfasst. Der Prozess beginnt mit dem Einrichten einer grundlegenden Projektstruktur und dem Gerüst für ein Terraform-Plugin.

Um eine benutzerdefinierte Funktion als Ressource zu implementieren, erstellen Entwickler eine Go-Datei (z.B. resource_server.go), die das Datenschema und die CRUD-Operationen für die Ressource definiert. Das Schema definiert die Struktur der Ressource, während die CRUD-Funktionen die Logik für das Erstellen, Lesen, Aktualisieren und Löschen der Ressource implementieren.

Wenn Sie mehr über die Erstellung von Providern erfahren möchten, empfehlen wir Ihnen, einen Blick auf unsere Blog-Serie zu werfen, in der wir die Erstellung und Erweiterung von Providern basierend auf unseren Erfahrungen mit dem Mondoo-Provider behandelt haben.

Externe Funktionsausführung

Die externe Funktionsausführung bietet eine leistungsstarke Möglichkeit, benutzerdefinierte Logik in Terraform-Workflows zu integrieren. Dieser Ansatz ermöglicht es Terraform, mit externen Programmen zu interagieren und deren Ausgabe für die Verwendung innerhalb von Konfigurationen zu verarbeiten.

Entwickler können beispielsweise ein PowerShell-Skript erstellen, das spezifische Daten abruft und es innerhalb einer Terraform-Konfiguration verwendet. Diese Methode ist besonders nützlich, wenn mit lokalen Tools interagiert oder Daten von externen APIs verarbeitet werden müssen, die nicht direkt von den eingebauten Funktionen oder verfügbaren Providern von Terraform unterstützt werden.

Es ist jedoch wichtig zu beachten, dass die Verwendung externer Programme plattformspezifische Abhängigkeiten einführen und die Portabilität von Terraform-Konfigurationen über verschiedene Umgebungen hinweg einschränken kann. Daher sollte bei der Implementierung benutzerdefinierter Funktionen durch externe Ausführung sorgfältig abgewogen werden, ob die Flexibilität die potenziellen Einschränkungen bei der plattformübergreifenden Kompatibilität überwiegt.

Zusammenfassung

Die Einführung benutzerdefinierter Funktionen in Terraform hat das Potenzial, Infrastructure as Code weiter zu entwickeln. Diese Verbesserung würde den Benutzern die Flexibilität geben, maßgeschneiderte Lösungen für komplexe Anforderungen zu erstellen, was zu einem effizienteren und besser wartbaren Code führen würde. Die Möglichkeit, domänenspezifische Optimierungen vorzunehmen und die Wiederverwendbarkeit von Code zu verbessern, hätte erhebliche Auswirkungen auf die Art und Weise, wie Entwickler ihre Infrastruktur verwalten, und würde es ihnen ermöglichen, einzigartige Szenarien mühelos zu bewältigen.

Obwohl Terraform benutzerdefinierte Funktionen nicht nativ unterstützt, gibt es mehrere Ansätze, diese Funktionalität zu simulieren. Dazu gehören die Erweiterung der HCL durch externe Datenquellen, die Erstellung von Go-basierten Funktionsbibliotheken und die Nutzung externer Funktionsausführung. Jeder dieser Ansätze hat seine eigenen Stärken und Kompromisse, so dass Entwickler den für ihre spezifischen Bedürfnisse am besten geeigneten Ansatz wählen können. Während sich Terraform weiterentwickelt, unterstreicht die anhaltende Nachfrage der Community nach benutzerdefinierten Funktionen die Notwendigkeit, dieses wichtige Werkzeug für modernes Infrastrukturmanagement anzupassen und zu verbessern.

Zurück Unsere Trainings entdecken

Wir sind für Sie da

Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.

Hier kontaktieren