Wenn man über DevOps spricht, muss man immer an ein paar Dinge denken, eines davon ist Infrastructure as Code. Natürlich basiert diese Methodik auf der Überwindung der Grenzen zwischen Entwicklern und Betrieb, so dass ein DevOps-Ingenieur Fähigkeiten in beide Richtungen entwickeln muss. Heutzutage gibt es viele verschiedene Möglichkeiten, Programmiercode zu verwenden, um eine Infrastruktur zu erstellen, zu ändern und zu warten. Hier können Sie die Grundlagen von Infrastructure as Code nachlesen.
Es gibt ein Orchestrator-Tool, das derzeit in unseren Kreisen an Popularität gewinnt, und das ist Pulumi. In diesem Blog werden wir beschreiben, wie Sie Ihre Infrastruktur mit Pulumi erstellen und es mit dem bekannten Orchestrator Terraform vergleichen.
Was ist Pulumi?
Pulumi ist ein Open-Source-Infrastruktur-als-Code-Tool, mit dem Sie Infrastrukturen mithilfe von Programmiersprachen erstellen, bereitstellen und verwalten können. Im Gegensatz zu herkömmlichen IaC-Tools behandelt Pulumi die Infrastruktur als Software.
Pulumi ermöglicht es Entwicklern und Betreibern, moderne Cloud-Anwendungen und -Infrastrukturen mit vertrauten Sprachen wie TypeScript, Python, Go usw. zu erstellen, bereitzustellen und zu verwalten. Pulumi unterstützt Multi-Cloud-Setups und ermöglicht es Benutzern, die Infrastruktur bei verschiedenen Cloud-Anbietern wie AWS, Azure, Google Cloud und anderen mit einer einzigen Codebasis zu verwalten. Diese Flexibilität vereinfacht nicht nur den Verwaltungsprozess, sondern verbessert auch die Zusammenarbeit zwischen Entwicklungs- und Betriebsteams.
Pulumi vs. Terraform
Wenn es um Orchestrierung geht, ist die erste Option in unseren Köpfen natürlich Terraform. Die Open-Source-Software von HashiCorp ist wahrscheinlich der populärste Ansatz für die Erstellung von Infrastrukturen auf deklarative Weise, unter Verwendung von Code. Gibt es also irgendwelche Vorteile, Pulumi zu verwenden, anstatt bei Terraform zu bleiben? Ja, in der Tat. Hier können Sie alle Unterschiede zwischen Pulumi und Terraform nachlesen, auf die die Entwickler von Pulumi hinweisen, aber hier sind unsere wichtigsten und objektiven Auswahlen:
Der Hauptunterschied besteht darin, dass Terraform nur HCL (HashiCorp Configuration Language) verwendet, während Sie bei Pulumi aus einigen der beliebtesten Programmiersprachen wählen können - TypeScript, Pulumi, Go, JavaScript, .NET, Java, YAML. Dies alles ist dank der Apache 2.0-Lizenz möglich. Pulumi nutzt die besten Praktiken der Softwareentwicklung für die Infrastruktur.
Auch wenn die deklarative Programmierung in der Infrastruktur als Code bevorzugt wird, müssen wir darauf hinweisen, dass Pulumi verwendet werden kann, um Ressourcen zwingend zu definieren, während wir in Terraform hauptsächlich einen deklarativen Stil haben.
Nachfolgend finden Sie eine Tabelle mit den wichtigsten Unterschieden zwischen diesen beiden Orchestrierungen.

Pulumi Architektur
Pulumi arbeitet auf der Grundlage einer Client-Server-Architektur:
Pulumi CLI (Client) wird zur Interaktion mit Pulumi verwendet, während Pulumi Engine (Server) für die Koordinierung und Verwaltung des Bereitstellungsprozesses zuständig ist. Sie interagiert mit den APIs der Cloud-Anbieter, um Ressourcen in der Cloud zu erstellen und zu verwalten. Sie übernimmt das Pulumi-Programm, übersetzt es in die entsprechenden Cloud-API-Aufrufe und sorgt dafür, dass der gewünschte Zustand der Infrastruktur erreicht wird.
Wenn Sie einen Pulumi-Befehl zur Bereitstellung Ihrer Infrastruktur ausführen, sendet das CLI Ihr Programm und Ihre Konfiguration an die Engine, die dann die erforderlichen Cloud-Vorgänge zur Erstellung und Verwaltung der angegebenen Ressourcen ausführt.
Pulumi ist sicherheitskonform und erfüllt die Normen PCI, ISO 27001 und HIPAA.
Pulumi-Stapel
In Pulumi sind Stacks ein grundlegendes Konzept für die Verwaltung verschiedener Bereitstellungen Ihrer Infrastruktur innerhalb desselben Pulumi-Projekts. Ein Stack stellt eine eigene Instanz Ihrer Infrastruktur dar, die es Ihnen ermöglicht, getrennte Bereitstellungen für verschiedene Umgebungen (z. B. Entwicklung, Staging und Produktion) oder verschiedene Konfigurationen innerhalb derselben Umgebung zu haben.
Schaffung einer Infrastruktur mit pulumi
Wie Sie sich wahrscheinlich denken können, gibt es zwei Dinge, bevor wir unsere Infrastrukturreise mit Pulumi beginnen:
1. Installieren Sie Pulumi: Stellen Sie sicher, dass Sie Pulumi installiert haben. Sie können es von der offiziellen Pulumi-Website herunterladen und installieren, natürlich abhängig von Ihrem Betriebssystem.
2. Cloud-Anbieter-Konto: Sie benötigen ein Konto bei einem Cloud-Anbieter (wie AWS, Azure oder GCP), wenn Sie planen, Ressourcen in der Cloud bereitzustellen.
Jetzt können wir ein Pulumi-Projekt initialisieren. Wir empfehlen, zu diesem Zweck die IDE zu verwenden und einen leeren Ordner zu öffnen oder einen zu erstellen. Dann verwenden wir einfach:
$ pulumi new
Wenn für diesen Befehl keine weiteren Optionen angegeben werden, werden Sie zu einem Menü geführt, aus dem Sie eine Vorlage auswählen können:
Please choose a template (28/221 shown):
[Use arrows to move, type to filter]
> aiven-go A minimal Aiven Go Pulumi program
aiven-python A minimal Aiven Python Pulumi program
aiven-typescript A minimal Aiven TypeScript Pulumi program
alicloud-csharp A minimal AliCloud C# Pulumi program
alicloud-fsharp A minimal AliCloud F# Pulumi program
alicloud-go A minimal AliCloud Go Pulumi program
alicloud-javascript A minimal AliCloud JavaScript Pulumi program
alicloud-python A minimal AliCloud Python Pulumi program
alicloud-typescript A minimal AliCloud TypeScript Pulumi program
alicloud-visualbasic A minimal AliCloud VB.NET Pulumi program
alicloud-yaml A minimal AliCloud Pulumi YAML program
auth0-csharp A minimal Auth0 C# Pulumi program
auth0-go A minimal Auth0 Go Pulumi program
auth0-javascript A minimal Auth0 TypeScript Pulumi program
auth0-python A minimal Auth0 Python Pulumi program
auth0-typescript A minimal Auth0 TypeScript Pulumi program
auth0-yaml A minimal Auth0 Pulumi YAML program
aws-csharp A minimal AWS C# Pulumi program
aws-fsharp A minimal AWS F# Pulumi program
aws-go A minimal AWS Go Pulumi program
aws-java A minimal AWS Java Pulumi program
aws-javascript A minimal AWS JavaScript Pulumi program
aws-native-csharp A minimal AWS C# Pulumi program
aws-native-fsharp A minimal AWS F# Pulumi program
aws-native-go A minimal AWS Go Pulumi program
aws-native-javascript A minimal AWS JavaScript Pulumi program
aws-native-python A minimal AWS Python Pulumi program
aws-native-typescript A minimal AWS TypeScript Pulumi program
...
A full list of all the templates can be found in the official github repo here. For this example we will use aws-typescript, indicating that we will use TypeScript language to deploy infrastructure in AWS.
This command will walk you through creating a new Pulumi project.
Enter a value or leave blank to accept the (default), and press <ENTER>.
Press ^C at any time to quit.
project name: (Testing)
project description: (A minimal AWS TypeScript Pulumi program)
Created project 'Testing'
Hier geben wir einen Projektnamen für das Pulumi-Projekt an. Danach werden wir aufgefordert, unseren ersten Stack im Projekt zu erstellen. Wie wir bereits erwähnt haben, sind Stacks eine logische Unterteilung in Pulumi, die meist für verschiedene Umgebungscodes innerhalb desselben Projekts verwendet wird, aber auch zur Definition verschiedener Teile derselben Umgebungsinfrastruktur wie Netzwerk, Daten, Compute, Backup usw. verwendet werden kann.
Please enter your desired stack name.
To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`).
stack name: (dev)
Created stack 'dev'
Nachdem wir einen Namen für unseren ersten Stapel gewählt haben, fragt Pulumi in der Regel, wo und in welcher Region wir Ressourcen erstellen wollen, also wählen wir für unsere Zwecke wieder die Standardoption:
aws:region: The AWS region to deploy into: (us-east-1)
Saved config
Pulumi wird die benötigten Abhängigkeiten für die ausgewählten Optionen herunterladen und tadaa, wir haben erfolgreich ein neues Projekt initialisiert:
Finished installing dependencies
Your new project is ready to go! ✨
To perform an initial deployment, run `pulumi up
Beachten Sie, dass Pulumi eine Reihe von Dateien auf der Grundlage unserer Optionen und Einstellungen erstellt hat:

Schauen wir uns diese Dateien genauer an. Wir haben Pulumi.yaml, die unsere Optionen für den Projektnamen und die Beschreibung enthält.

Pulumi.dev.yaml zeigt die Stack-Konfiguration, in welcher Region wir Ressourcen erstellen werden. Wenn Sie Erfahrung mit AWS oder einer Cloud im Allgemeinen haben, wissen Sie, dass es nicht ausreicht, nur die Region zu definieren, um Pulumi zu authentifizieren und Ressourcen für Ihr AWS-Konto zu erstellen. Ja, Sie können Ihre Anmeldeinformationen zu dieser Datei hinzufügen, aber wenn Sie dies auf sichere Weise tun wollen, ist das nicht empfehlenswert. Wenn Sie mit Pulumi Ressourcen erstellen, ohne explizit AWS-Anmeldeinformationen anzugeben, verwendet Pulumi die standardmäßige AWS-Anmeldeinformationen-Kette, um Ihre Anfragen zu authentifizieren. Die AWS-Anmeldedatenkette funktioniert normalerweise in der folgenden Reihenfolge:
Umgebungsvariablen: Wenn Sie die Umgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY gesetzt haben, verwendet Pulumi diese Anmeldedaten.
AWS CLI-Konfiguration: Wenn Sie die AWS CLI mit aws configure konfiguriert haben, verwendet Pulumi die in den AWS CLI-Konfigurationsdateien gespeicherten Anmeldedaten.
Instanzprofil-Anmeldeinformationen: Wenn Ihr Code auf einer AWS-Ressource läuft, der ein Instanzprofil (IAM-Rolle) zugeordnet ist, verwendet Pulumi die mit dieser Rolle verbundenen Anmeldeinformationen.
Es ist also besser, diese Datei unverändert zu lassen:

Werfen wir auch einen Blick auf die Datei index.ts:

Das ist die Standardvorlage, wenn ein Projekt auf TypeScript für AWS basiert. Wenn Sie eine andere Vorlage wählen, wird die Datei darauf basieren. Hier haben wir Code zum Erstellen von S3-Buckets in AWS mit dem aws-Paketmodul. Es werden 3 Module importiert: @pulumi/pulumi, @pulumi/aws und @pulumi/awsx.
@pulumi/aws ist der offizielle AWS-Ressourcenanbieter für Pulumi und bietet eine breite Palette von AWS-Ressourcen und -Services, die Sie mit Pulumi in einer beliebigen Programmiersprache - JavaScript, TypeScript, Python, Go oder .NET - verwalten können.
@pulumi/awsx ist eine zusätzliche Bibliothek, die auf @pulumi/aws aufbaut. Sie bietet Abstraktionen auf höherer Ebene und Muster für die Arbeit mit AWS-Ressourcen.
Apropos index.ts-Datei, oder was auch immer die Datei auf der Grundlage der Sprachpräferenz ist, jetzt ist es an Ihnen, welche Ressourcen Sie erstellen möchten und wo.
Für unser Beispiel werden wir die Standarddatei beibehalten.
Jetzt können wir pulumi up verwenden, um unsere Änderungen im Cloud Provider zu implementieren:
$ pulumi up
Previewing update (dev)
View in Browser (Ctrl+O): https://app.pulumi.com/...
Type Name Plan
+ pulumi:pulumi:Stack Testing-dev create
+ └─ aws:s3:Bucket my-bucket create
Outputs:
bucketName: output<string>
Resources:
+ 2 to create
Do you want to perform this update? details
+ pulumi:pulumi:Stack: (create)
[urn=urn:pulumi:dev::Testing::pulumi:pulumi:Stack::Testing-dev]
+ aws:s3/bucket:Bucket: (create)
[urn=urn:pulumi:dev::Testing::aws:s3/bucket:Bucket::my-bucket]
[provider=urn:pulumi:dev::Testing::pulumi:providers:aws::default_5_42_0::04da6b54-80e4-46f7-96ec-b56ff0331ba9]
acl : "private"
bucket : "my-bucket-57d6bca"
forceDestroy: false
--outputs:--
bucketName: output<string>
Do you want to perform this update? yes
Updating (dev)
View in Browser (Ctrl+O): https://app.pulumi.com/...
Type Name Status
+ pulumi:pulumi:Stack Testing-dev created (8s)
+ └─ aws:s3:Bucket my-bucket created (3s)
Outputs:
bucketName: "my-bucket-876beba"
Resources:
+ 2 created
Duration: 10s
Pulumi zeigt uns an, welche Ressourcen erstellt, zerstört oder aktualisiert werden sollen, und wenn wir "Ja" eingeben, beginnt Pulumi mit der Erstellung dieser Ressourcen für uns.
Wenn wir diesen Eimer nicht behalten wollen, zerstören wir ihn einfach:
$ pulumi destroy
Previewing destroy (dev)
View in Browser (Ctrl+O): https://app.pulumi.com/...
Type Name Plan
- pulumi:pulumi:Stack Testing-dev delete
- └─ aws:s3:Bucket my-bucket delete
Outputs:
- bucketName: "my-bucket-876beba"
Resources:
- 2 to delete
Do you want to perform this destroy? yes
Destroying (dev)
View in Browser (Ctrl+O): https://app.pulumi.com/...
Type Name Status
- pulumi:pulumi:Stack Testing-dev deleted
- └─ aws:s3:Bucket my-bucket deleted (1s)
Outputs:
- bucketName: "my-bucket-876beba"
Resources:
- 2 deleted
Duration: 5s
The resources in the stack have been deleted, but the history and configuration associated with the stack are still maintained.
If you want to remove the stack completely, run `pulumi stack rm dev`.
Außerdem gibt es den Befehl pulumi preview , der uns nur die Änderungen anzeigt, die durch die Anwendung entstehen werden.
$ pulumi preview
Previewing update (dev)
View in Browser (Ctrl+O): https://app.pulumi.com/...
Type Name Plan
+ pulumi:pulumi:Stack Testing-dev create
+ └─ aws:s3:Bucket my-bucket create
Outputs:
bucketName: output<string>
Resources:
+ 2 to create
Sie können pulumi-Stapel verwalten, z. B. einen neuen Stapel anlegen:
$ pulumi stack init prod
Created stack 'prod'
die verfügbaren Stapel auflisten:
$ pulumi stack ls
NAME LAST UPDATE RESOURCE COUNT URL
dev 5 minutes ago 0 https://app.pulumi.com/.../Testing/dev
prod* n/a n/a https://app.pulumi.com/.../Testing/prod
Stapel auswählen:
$ pulumi stack select prod
Stapel löschen:
$ pulumi stack rm dev
This will permanently remove the 'dev' stack!
Please confirm that this is what you'd like to do by typing `dev`: dev
Stack 'dev' has been removed!
und andere Befehle für Stapel und weitere Funktionalitäten. Sie können sie alle in der offiziellen Dokumentation finden.
Schlussfolgerung
Infrastructure as Code mit Pulumi ist mehr als nur eine technologische Entwicklung, es ist ein Umdenken, das Unternehmen in die Lage versetzt, mehr Flexibilität, Zuverlässigkeit und Effizienz in ihren Infrastrukturmanagementprozessen zu erreichen.
Indem es DevOps-Ingenieuren ermöglicht, vertraute Programmiersprachen zu nutzen, Komplexitäten zu abstrahieren und die Zusammenarbeit zu fördern, hat sich Pulumi als ein entscheidender Faktor im Bereich von IaC erwiesen. Wenn Unternehmen ihre digitale Transformation fortsetzen, kann die Entscheidung für Pulumi als Tool der Wahl für Infrastructure as Code eine Entscheidung sein, die sie in eine skalierbarere, flexiblere und nachhaltigere Zukunft führt.