Infrastrukturänderungen sind zu riskant für blinde Bereitstellungen? Bicep validieren und testen

Veröffentlicht am:

Eine Bicep-Datei kann erfolgreich kompiliert werden und trotzdem eine unbeabsichtigte Infrastrukturänderung enthalten. Eine einzelne geänderte Zeile könnte beispielsweise die Storage-Redundanz wechseln oder einen Container entfernen, bevor es jemand bemerkt.

CloudTrips benötigt eine wiederholbare Sicherheitsprüfung, die Coderegressionen lokal erkennt, die Vorlage mit Azure prüft und die Auswirkung auf Live-Ressourcen vor der Bereitstellung zeigt.

Die drei Prüfungen verstehen

Jede Prüfung beantwortet eine andere Frage:

Prüfung Beantwortete Frage
Snapshot Hat sich das Bicep-Ergebnis gegenüber der genehmigten Codebasis geändert?
Preflight-Validierung Akzeptiert Azure diese Vorlage, Konfiguration und Zugriffsrechte?
What-if Wie würde die Bereitstellung die aktuellen Azure-Ressourcen verändern?

Snapshots sind lokal und deterministisch. Preflight und What-if kontaktieren Azure.

Snapshot-Befehl verfügbar machen

Snapshots benötigen Bicep CLI ab Version 0.41.2. Prüfe die installierte Version:

az bicep version

Die in diesem Projekt verwendete Azure-CLI-Installation speichert die Bicep-Programmdatei in $HOME/.azure/bin. Führe Snapshot-Befehle über diese Datei aus:

"$HOME/.azure/bin/bicep" --version

Ist die Datei nicht vorhanden, installiere sie:

az bicep install

Ist die angezeigte Version älter als 0.41.2, führe az bicep upgrade aus.

Genehmigte TEST-Basis erfassen

Erstelle im Verzeichnis cloudtrips-bicep einen Snapshot:

"$HOME/.azure/bin/bicep" snapshot environments/test.bicepparam \
  --mode overwrite \
  --subscription-id 00000000-0000-0000-0000-000000000000 \
  --resource-group rg-cloudtrips-bicep-test-weu \
  --location westeurope \
  --deployment-name deploy-cloudtrips-storage-test

Dadurch entsteht environments/test.snapshot.json. Committe diese Datei, weil sie die genehmigte Testbasis und keine wegwerfbare Build-Ausgabe ist.

Die mit Nullen gefüllte Abonnement-ID ist beabsichtigt. Der Snapshot läuft lokal und authentifiziert sich nicht mit dieser ID. Sie liefert einen stabilen Kontext für Ausdrücke wie resourceGroup().id und uniqueString(), damit alle Entwickler dasselbe Ergebnis erzeugen. Der Snapshot muss daher nicht den Namen des echten Speicherkontos enthalten.

Bearbeite die generierte JSON-Datei nicht manuell.

Unveränderten Code erfolgreich prüfen

Validiere das aktuelle Bicep-Ergebnis gegen den Snapshot:

"$HOME/.azure/bin/bicep" snapshot environments/test.bicepparam \
  --mode validate \
  --subscription-id 00000000-0000-0000-0000-000000000000 \
  --resource-group rg-cloudtrips-bicep-test-weu \
  --location westeurope \
  --deployment-name deploy-cloudtrips-storage-test

Keine Ausgabe und Exitcode 0 bedeuten, dass das aktuelle Ergebnis mit der Basis übereinstimmt. Verwende beim Validieren immer exakt dieselben Kontextwerte.

Beweisen, dass der Test ein Risiko erkennt

Ändere vorübergehend diese Zeile in environments/test.bicepparam:

param storageSku = 'Standard_GRS'

Führe denselben Snapshot-Befehl mit --mode validate aus. Er sollte fehlschlagen und den Wechsel des Storage-SKU von Standard_LRS zu Standard_GRS anzeigen.

Fehlgeschlagene Bicep-Snapshot-Validierung mit der unbeabsichtigten Änderung des TEST-Storage-SKU

Stelle den genehmigten Wert wieder her:

param storageSku = 'Standard_LRS'

Führe die Snapshot-Validierung erneut aus. Sie sollte nun ohne Ausgabe erfolgreich sein. Verwende --mode overwrite nur, nachdem eine Änderung geprüft und ausdrücklich genehmigt wurde. Überschreibe die Basis niemals nur, um einen fehlgeschlagenen Test zu unterdrücken.

Azure-Preflight-Validierung ausführen

Wähle das echte TEST-Abonnement aus und lasse Azure die Bereitstellung prüfen:

az account set \
  --subscription "<Name oder ID des CloudTrips-TEST-Abonnements>"

az deployment group validate \
  --name validate-cloudtrips-storage-test \
  --resource-group rg-cloudtrips-bicep-test-weu \
  --parameters environments/test.bicepparam \
  --validation-level Provider \
  --query "properties.provisioningState" \
  --output tsv

Provider prüft Vorlage, Ressourcenanbieter und Berechtigungen. Ein erfolgreiches Ergebnis lautet Succeeded, beweist aber noch nicht, dass die Live-Umgebung unverändert bleibt.

Mit der Live-Umgebung vergleichen

Schließe mit What-if ab:

az deployment group what-if \
  --resource-group rg-cloudtrips-bicep-test-weu \
  --parameters environments/test.bicepparam \
  --validation-level Provider

Prüfe jede vorgeschlagene Änderung. Die bekannten Standardwerte des Storage-Anbieters können weiterhin als Rauschen erscheinen. Es darf jedoch keine unerwartete Erstellung, Löschung, Ersetzung oder Änderung an SKU, Containern oder Tags geben.

Erfolgreiche Azure-Preflight-Validierung und geprüftes What-if-Ergebnis für CloudTrips TEST

CloudTrips besitzt nun drei getrennte Prüfungen: Der Snapshot erkennt unbeabsichtigte Codeänderungen, Preflight prüft die Annahme der Bereitstellung durch Azure und What-if vergleicht den genehmigten Code mit Live-Ressourcen. Ein späterer Automatisierungs-Trip kann dieselben Prüfungen für jeden Pull Request ausführen.