Ein Nebenprojekt auf Azure Container Apps

Ein Nebenprojekt auf Azure Container Apps

- Matt

Nach dem letzten Spieleabend wollte ich nicht mehr per Hand ausrechnen, wer wem noch was schuldet. Ein kleines Werkzeug war schnell geschrieben: eine ASP.NET-Core-Minimal-API mit SQLite, die Beträge auf Personen aufteilt und einen Link zum Teilen ausgibt. Das Problem war nicht der Code, sondern der Betrieb. Mein Homelab läuft im eigenen Netz, für ein Tool, das Freunde von unterwegs erreichen sollen, hätte ich extra einen Port nach außen öffnen müssen, für etwas, das im Schnitt zweimal im Monat benutzt wird. Das stand in keinem Verhältnis.

az containerapp up

Genau für diesen Fall gibt es Azure Container Apps. Der schnellste Weg dorthin ist ein einziger Befehl:

az containerapp up `
  --name spieleabend-api `
  --resource-group rg-nebenprojekte `
  --source . `
  --ingress external `
  --target-port 8080

az containerapp up baut aus dem Quellverzeichnis ein Image, legt bei Bedarf eine Azure Container Registry, einen Log-Analytics-Arbeitsbereich und eine Container-Apps-Umgebung an und deployt in einem Rutsch. Einen Dockerfile brauchte ich nicht, das Kommando erkennt das .NET-Projekt und baut das Image über Buildpacks. Bequem, aber auch der Punkt mit der wenigsten Kontrolle. Wenn ich das Image lieber selbst bestimme, nehme ich stattdessen dotnet publish mit PublishContainer und übergebe der CLI nur das fertige Image.

Skalierung auf null

Der eigentliche Grund für Container Apps ist die Abrechnung. Im Consumption-Plan zahlt man pro Sekunde für zugewiesene vCPU- und Arbeitsspeicherzeit, und eine Revision kann auf null Instanzen herunterskalieren, wenn keine Anfragen ankommen. Die ersten 180.000 vCPU-Sekunden und 360.000 GiB-Sekunden pro Monat und Abonnement sind ohnehin im kostenlosen Kontingent enthalten. Mit --min-replicas 0 --max-replicas 3 läuft die App nur, wenn sie gebraucht wird, und der erste Aufruf nach einer Pause wartet ein, zwei Sekunden auf den Kaltstart. Für ein Freizeitprojekt ist das ein Kompromiss, den ich gerne eingehe.

Die Rechnung, die trotzdem kommt

Skaliert die App auf null, fallen für sie selbst keine Kosten an. Übersehen habe ich den Log-Analytics-Arbeitsbereich, den az containerapp up automatisch für die Umgebung anlegt. Der sammelt Konsolen- und Systemlogs, und deren Aufnahme sowie Aufbewahrung wird unabhängig davon abgerechnet, ob die Container gerade laufen. Bei einem Tool mit zwei Aufrufen im Monat war das kein großer Betrag, aber auch keiner, den man erwartet, wenn man von „skaliert auf null” ausgeht. Wer das vermeiden will, kann die Log-Speicherung abschalten und sich über den Live-Log-Stream behelfen, dauerhafte Logs gibt es dann aber auch nicht mehr.

Für ein Nebenprojekt, das niemand rund um die Uhr braucht, ist das trotzdem der richtige Ort. Nur die Rechnung schaue ich mir seitdem einmal im Monat an, nicht erst, wenn sie überrascht.