Überblick über Pulumi – ein „Infrastructure as Code“ Tool

Pulumi ist ein Infrastructure as Code (IaC) Tool, das einem beim Erstellen, Deployment und dem Management von Cloud-Infrastruktur hilft. Beim IaC-Ansatz wird die Cloud-Infrastruktur wie Code behandelt. Das heißt, die Cloud-Infrastruktur wird mittels Code definiert und versioniert. Neben Pulumi ist Terraform ein weiterer bekannter Vertreter dieses Ansatzes.

Der Unterschied zu Terraform besteht darin, dass Pulumi Universal-Programmiersprachen (wie TypeScript oder C#) zur Beschreibung der Infrastruktur benutzt, wohingegen Terraform die HashiCorp Configuration Language (HCL) verwendet.

Der Universal-Programmiersprachen-Ansatz hat einen wesentlichen Vorteil: Programmierer, die vorher schon mit einer unterstützten Programmiersprache gearbeitet haben, finden einen leichteren Einstieg. Außerdem können Sprachkonstrukte der Programmiersprachen, wie Schleifen und Bedingungen, verwendet werden.

Pulumi unterstützt aktuell bei der Beschreibung der Infrastruktur die Programmiersprachen TypeScript, JavaScript, C#, Python und Go.

Es unterstützt verschiedene Cloud Provider. Darunter die großen drei (AWS, Azure und Google Cloud). Für die Azure Cloud gibt es einen sogenannten „Nativen Provider“, der täglich aktualisiert wird und somit die neusten Änderungen der Azure Resource Manager (ARM) API unterstützt. Hierbei wird dieselbe semantische Versionierung der Azure ARM API verwendet, sodass auch gezielt Versionen einer Cloud Ressource gepinnt werden können. Native Provider für die AWS und Google Cloud befinden sich in einer „public preview“ Phase.

Die Sprachbibliotheken und das Command Line Interface (CLI) stehen unter der Apache 2.0 Lizenz. Der Pulumi Service (eine Managed-Cloud-Lösung für Projekte) hingegen nicht. Dieser ist jedoch nicht zwingend für das Arbeiten mit Pulumi nötig, erleichtert das Verwalten der Projekte aber.

States, Stacks und Backends

Der Zustand der modellierten Infrastruktur wird in sogenannten States gespeichert. Diese enthalten die Infrastruktur-Metadaten. Diese sind die genaue Bezeichnung der verwendeten Cloud Ressourcen mit ihren Eigenschaften und ihrer Verbindung zueinander.

Je Infrastruktur-Projekt kann es mehrere Stacks geben. Mithilfe der Stacks lässt sich die Infrastruktur-Umgebung in verschiedene Bereiche einteilen. Zum Beispiel:

  • Einen Dev Stack, der die neueste Infrastruktur enthält, an der gerade aktiv entwickelt wird.
  • Einen Staging Stack, der die entwickelte Infrastruktur und die Anwendungen testet.
  • Und einen Prod Stack, der die veröffentlichte Produktivinfrastruktur beinhaltet.

Jeder Stack hat jeweils eigene unabhängige States, kann also mehr oder weniger und andere Cloud Ressourcen enthalten als ein anderer Stack.

Die States und Stacks werden mithilfe von Backends gespeichert. Pulumi bietet dabei grundsätzlich zwei verschiedene Arten von Backends an:

Self-Managed Backends wie zum Beispiel das Speichern auf der eigenen Festplatte, in Form einer JSON Datei, oder das Speichern auf Cloud Ressourcen wie Azure Blob Storages oder AWS S3 Buckets.

Die zweite Backend-Art ist der Pulumi Service, der als managed oder self-hosted Cloud Service angeboten wird. Dieser Service bietet eine noch granularere Verwaltung der Infrastruktur-Projekte durch das Setzen von Zugriffsrechten. Er steht nicht unter einer Open-Source-Lizenz.

Im nachfolgenden Bild sieht man die Übersicht eines Infrastruktur-Projekts (mit dem Namen „azure-typescript“) im Pulumi Service. Hierbei sehen wir, dass es aus drei Stacks besteht: dev, staging und prod. Jeder Stack hat unterschiedliche Cloud Ressourcen und dadurch auch unterschiedliche States. Der dev-Stack beinhaltet z.B. fünf Cloud-Ressourcen, wohingegen der prod-Stack nur drei hat.

Build, Deploy, Manage

Allgemein kann man den Arbeitsablauf mit Pulumi in drei Teile aufteilen: Build, Deploy und Manage.

Im Build-Schritt erstellt man die Infrastruktur mithilfe des Pulumi SDKs unter Benutzung einer unterstützten Programmiersprache, zum Beispiel TypeScript. Im Deploy-Schritt wird die Infrastruktur mithilfe der Pulumi CLI mittels des Befehles pulumi up ausgebracht. Mit dem letzten Schritt Manage wird die Verwaltung des Zugriffs auf die Stacks mithilfe der Pulumi Console, also dem Pulumi Service-Backend verstanden.

Als Beispiel könnte man mit dem folgenden Pulumi-TypeScript-Code eine statische Webseite in Azure anlegen:


import * as pulumi from "@pulumi/pulumi";
import * as resources from "@pulumi/azure-native/resources";
import * as storage from "@pulumi/azure-native/storage";

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("myResourceGroup");

// Create an Azure Resource (Storage Account)
const storageAccount = new storage.StorageAccount("myStorageAccount", {
    resourceGroupName: resourceGroup.name,
    sku: {
        name: storage.SkuName.Standard_LRS,
    },
    kind: storage.Kind.StorageV2,
});

// Create an static website inside the Storage Account
const staticWebsite = new storage.StorageAccountStaticWebsite("myStaticWebsite", {
    accountName: storageAccount.name,
    resourceGroupName: resourceGroup.name,
    indexDocument: "index.html",
});

// Upload a Blob containing the index.html
const indexHtml = new storage.Blob("index.html", {
    resourceGroupName: resourceGroup.name,
    accountName: storageAccount.name,
    containerName: staticWebsite.containerName,
    source: new pulumi.asset.FileAsset("index.html"),
    contentType: "text/html",
});

// Export and print the Web endpoint(URL) from the static website
export const staticEndpoint = storageAccount.primaryEndpoints.web;

Zuerst wird eine neue Resourcegruppe mit dem Namen myResourceGroup erstellt. Anschließend wird eine Storage Account Cloud Ressource (storageAccount) erstellt, die den Namen myStorageAccount trägt. Dieser enthält eine statische Webseite(staticWebsite, Name: myStaticWebsite). Es wird ein Binary Large Object (Blob) definiert (indexHtml), das auf die index.html Datei verweist, die sich im gleichen Verzeichnis wie der Pulumi-TypeScript-Code befindet. Im letzten Abschnitt wird definiert, dass die URL der statischen Webseite exportiert werden soll und somit nach dem Deployen des Codes zum Beispiel mittels der Pulumi CLI angezeigt wird. Dies war der Build-Schritt.

Im Deploy-Schritt wird mittels der Pulumi-CLI und dem Befehl pulumi up die definierte Cloud-Infrastruktur deployt.

Im letzten Schritt Manage kann die erstellte Azure-Infrastruktur über die Pulumi Console angezeigt werden. Außerdem können Zugriffsberechtigungen auf die Stacks zum Beispiel für eine teamübergreifendende Entwicklung gesetzt werden. Voraussetzung hierfür ist, dass der Pulumi Service als Backend benutzt wurde.

Fazit

Dieses IaC Tool unterstützt den Entwickler bei der Erstellung, Deployment und dem Management von Cloud Ressourcen. Im Unterschied zu anderen IaC Tools werden Universal-Programmiersprachen verwendet. Pulumi besteht aus dem Pulumi SDK für die Programmiersprachen TypeScript, JavaScript, C#, Python und Go, dem Pulumi CLI zum Deployment der erstellten Ressourcen und dem Pulumi Service zum Management der Zugriffsrechte für die erstellten Cloud-Infrastruktur-Projekte.

Es vereinfacht die Arbeit mit Cloud Ressourcen durch den Einsatz von Infrastructure as Code, da wiederkehrende Aufgaben einmal definiert und beliebig oft reproduziert werden können. Man verfügt stets eine schriftliche Beschreibung seiner Infrastruktur-Umgebung, die auch versioniert werden kann. Es bietet einen leichten Einstieg für Personen, die bereits mit einer der unterstützten Programmiersprachen gearbeitet haben.

Es kann sowohl von Software-Entwicklern für das Entwickeln einer Testumgebung, von DevOps-Entwicklern für das Definieren und Erweitern von Infrastruktur-Projekten oder zentralen IT-Mitarbeitern für das Warten einer Produktivumgebung verwendet werden.