|
| 1 | +# Lab 1 - Pulumi Grundlagen |
| 2 | + |
| 3 | +## Überblick |
| 4 | + |
| 5 | +In der ersten Übung werden wir uns mit den Grundlagen von Pulumi vertraut machen. Hierzu gehört |
| 6 | + |
| 7 | +- der Umgang mit der Pulumi CLI, |
| 8 | +- das Erstellen eines Projekts und Stacks, |
| 9 | +- das Hinzufügen von Konfiguration und Secrets |
| 10 | +- und das Exportieren eines Outputs. |
| 11 | + |
| 12 | +## Pulumi CLI |
| 13 | + |
| 14 | +### Login |
| 15 | + |
| 16 | +Jeder sollte vor Teilnahme bereits ein Pulumi Konto erzeugt haben (falls nicht, nun hier schnell nachholen: <https://app.pulumi.com/> und am Einfachsten direkt Euren GitHub Login verwenden). |
| 17 | + |
| 18 | +```bash |
| 19 | +pulumi login |
| 20 | +``` |
| 21 | + |
| 22 | +Es gibt die Möglichkeit, sich interaktiv via Browser anzumelden oder ein AccessToken in der Pulumi Konsole zu generieren und dieses für den Login auf der Kommandozeile zu verwenden. |
| 23 | +Eine nicht-interaktive Anmeldung wird ebenfalls unterstützt, in dem ein AccessToken über die Environment-Variable `PULUMI_ACCESS_TOKEN` angegeben wird. Ich selbst verwende im Workshop ein AccessToken. |
| 24 | + |
| 25 | +```bash |
| 26 | +pulumi whoami # zeigt den derzeit angemeldeten User an |
| 27 | +``` |
| 28 | + |
| 29 | +### Erstes Projekt |
| 30 | + |
| 31 | +Wir erzeugen nun unser erstes Pulumi Projekt mit unserem ersten Stack. Dazu führen wir folgenden Befehl aus: |
| 32 | + |
| 33 | +```bash |
| 34 | +pulumi new |
| 35 | +``` |
| 36 | + |
| 37 | +Wir wählen `typescript` als Template für das Projekt, und belassen die weiteren Einstellungen wie sie sind. Als Ergebnis erhalten wir einen neuen Pulumi Stack `lab1/dev`. |
| 38 | +Dies lässt sich leicht überprüfen, in dem wir die Stacks auflisten: |
| 39 | + |
| 40 | +```bash |
| 41 | +pulumi stack ls |
| 42 | +``` |
| 43 | + |
| 44 | +:bulb: Nehmt Euch kurz Zeit und schaut Euch die Dateien im erzeugten Pulumi Projekt an. |
| 45 | + |
| 46 | +:mag: Das erzeugte Projekt ist letztlich ein ganz normales **Typescript** Projekt mit vielen Bekannten: `.gitignore, tsconfig.json, package.json, index.ts, ...` Die einzige zusätzliche Datei ist `Pulumi.yaml`, diese enthält Informationen zum aktuellen Projekt: |
| 47 | + |
| 48 | +```yaml |
| 49 | +name: lab1 |
| 50 | +runtime: nodejs |
| 51 | +description: A minimal TypeScript Pulumi program |
| 52 | +``` |
| 53 | +
|
| 54 | +--- |
| 55 | +
|
| 56 | +Nun erzeugen wir zwei weitere Stacks: |
| 57 | +
|
| 58 | +```bash |
| 59 | +pulumi stack init staging # erzeugt Stack lab1/staging |
| 60 | +pulumi stack init prod # erzeugt Stack lab1/prod |
| 61 | +``` |
| 62 | + |
| 63 | +Wir wechseln zwischen den Stacks: |
| 64 | + |
| 65 | +```bash |
| 66 | +pulumi stack select dev |
| 67 | +pulumi stack select staging |
| 68 | +pulumi stack select prod |
| 69 | +pulumi stack select dev |
| 70 | +``` |
| 71 | +
|
| 72 | +:mag: Obwohl wir mehrere Stacks erzeugt haben, hat sich keine Datei verändert bzw. ist eine neue Datei im Projekt hinzugekommen. Dies liegt daran, dass die Information über die Stacks selbst vom Pulumi Service verwaltet werden. |
| 73 | +
|
| 74 | +:bulb: Ähnlich wie bei Terraform gibt es die Möglichkeit, das State-Management ohne den Pulumi-Service zu betreiben (und den State z.B. auf AWS S3 oder Azure BlobStorage abzulegen). Es gibt hierzu nicht wirklich viel Information im Netz, ein guter Ansatz wird von Sam Cogan [hier](https://samcogan.com/storing-pulumi-state-in-azure/) in seinem Blogpost beschrieben. |
| 75 | +
|
| 76 | +### Konfiguration eines Stacks |
| 77 | +
|
| 78 | +Es können unabhängig für jeden Stack Konfigurationsparameter und Secrets verwaltet werden. Das ist insofern interessant, als dass man damit für unterschiedliche Umgebungen andere Parametersätze verwenden kann. In einer DEV Umgebung reichen vielleicht weniger und kleinere VMs, als in einer PROD Umgebung. Stacks kann man also als Strukturelement verwenden, um verschiedene Environments zu modellieren. |
| 79 | +
|
| 80 | +#### Konfiguration |
| 81 | +
|
| 82 | +Im ersten Schritt legen wir einen Config-Parameter im Stack `lab1/dev` an: |
| 83 | +
|
| 84 | +```bash |
| 85 | +pulumi stack select dev |
| 86 | +pulumi config set myname Florian-dev |
| 87 | +``` |
| 88 | +
|
| 89 | +:bulb: Durch das Festlegen eines Config-Parameters ist im Projektverzeichnis eine neu Datei entstanden. |
| 90 | +
|
| 91 | +:muscle: **Lege für die anderen Stacks ebenfalls einen solchen Config-Parameter an!** |
| 92 | +
|
| 93 | +#### Secrets |
| 94 | +
|
| 95 | +Im zweiten Schritt legen wir nun ein Secret im Stack `lab1/dev` an: |
| 96 | +
|
| 97 | +```bash |
| 98 | +pulumi stack select dev |
| 99 | +pulumi config set mysecret secret-dev --secret |
| 100 | +``` |
| 101 | +
|
| 102 | +:bulb: Das erstellte Secret wird verschlüsselt in der Stack-Konfigurationsdatei gespeichert (hier `Pulumi.dev.yaml`). |
| 103 | +
|
| 104 | +:muscle: **Lege für die anderen Stacks ebenfalls ein solches Secret an!** |
| 105 | +
|
| 106 | +### Nutzung der Konfiguration im Pulumi Programm |
| 107 | +
|
| 108 | +Wir schreiben nun zum ersten Mal Code für unser Pulumi Programm, und zwar in die `index.ts`: |
| 109 | +
|
| 110 | +```ts |
| 111 | +import * as pulumi from "@pulumi/pulumi"; |
| 112 | + |
| 113 | +const config = new pulumi.Config(); |
| 114 | + |
| 115 | +const myname = config.require("myname"); |
| 116 | +const mysecret = config.requireSecret("mysecret"); |
| 117 | + |
| 118 | +const optionalConfigParameter = config.get("optional") || "defaultValue"; |
| 119 | + |
| 120 | +export const name = myname; |
| 121 | +export const secret = mysecret; |
| 122 | +``` |
| 123 | +
|
| 124 | +Im Terminal führen wir nun den wohl wichtigsten Pulumi Befehl aus: |
| 125 | +
|
| 126 | +```bash |
| 127 | +pulumi up # 'pulumi up -y' um ohne Nachfrage auszuführen |
| 128 | +``` |
| 129 | +
|
| 130 | +Dieser Aufruf veranlasst Pulumi unser Programm auszuführen, den |
| 131 | +**desired state** |
| 132 | +daraus abzuleiten und anschließend dafür zu sorgen, dass |
| 133 | +**desired state == actual state** |
| 134 | +
|
| 135 | +Nach Beendigung des Befehls sehen wir, dass Pulumi zwei Outputs erzeugt hat: |
| 136 | +
|
| 137 | +```bash |
| 138 | +name : "Florian" |
| 139 | +secret: "[secret]" |
| 140 | +``` |
| 141 | +
|
| 142 | +Diese können wir uns auch gezielt anzeigen lassen: |
| 143 | +
|
| 144 | +```bash |
| 145 | +pulumi stack output |
| 146 | +``` |
| 147 | +
|
| 148 | +Um die Secrets in Plaintext sehen zu können: |
| 149 | +
|
| 150 | +```bash |
| 151 | +pulumi stack output --show-secrets |
| 152 | +``` |
| 153 | +
|
| 154 | +:muscle: **Weitere Aufgaben** |
| 155 | +
|
| 156 | +1. Führe `pulumi up` auch für die anderen Stacks durch. |
| 157 | +2. Füge den optionalen Parameter in einem Stack hinzu. |
| 158 | +3. Entferne einen der benötigten Parameter aus einem Stack und provoziere damit einen Fehler. |
0 commit comments