Hart codierte Templates sind nicht wiederverwendbar? Verwende Parameter, Variablen und Outputs

Veröffentlicht am:

Das erste CloudTrips-Template hat ein DEV-Speicherkonto bereitgestellt, einige Entscheidungen waren jedoch weiterhin fest im Code hinterlegt. Eine vollständige Kopie für TEST würde zwei Dateien erzeugen, die voneinander abweichen können.

Überarbeite das Template so, dass der Aufrufer umgebungsspezifische Entscheidungen übergibt, Bicep konsistente Werte berechnet und die Bereitstellung Informationen für nachfolgende Befehle zurückgibt.

In diesem Trip verwendest du eine main.bicep-Datei erneut, um ein CloudTrips-TEST-Speicherkonto bereitzustellen.

Template überarbeiten

Ersetze den aktuellen Inhalt von main.bicep durch:

targetScope = 'resourceGroup'

@description('CloudTrips deployment environment.')
@allowed([
  'dev'
  'test'
  'prod'
])
param environment string

@description('Azure region for the storage account.')
param location string = resourceGroup().location

@description('Storage redundancy option.')
@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_ZRS'
])
param storageSku string = 'Standard_LRS'

@description('Team or person responsible for the resource.')
param owner string

@description('Application name used in resource tags.')
param applicationName string = 'CloudTrips'

var normalizedEnvironment = toLower(environment)
var storageAccountName = 'stct${normalizedEnvironment}${uniqueString(resourceGroup().id)}'
var commonTags = {
  Application: applicationName
  Environment: toUpper(normalizedEnvironment)
  ManagedBy: 'Bicep'
  Owner: owner
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: storageAccountName
  location: location
  tags: commonTags
  sku: {
    name: storageSku
  }
  kind: 'StorageV2'
  properties: {
    allowBlobPublicAccess: false
    minimumTlsVersion: 'TLS1_2'
    supportsHttpsTrafficOnly: true
  }
}

output storageAccountName string = storageAccount.name
output storageAccountId string = storageAccount.id
output blobEndpoint string = storageAccount.properties.primaryEndpoints.blob

Was bedeutet SKU?

SKU steht für Stock Keeping Unit (Bestandseinheit). In Azure bezeichnet sie eine Dienstebene oder Konfiguration, die Funktionen, Ausfallsicherheit und Kosten beeinflusst. Bei Storage ist Standard die Leistungsstufe und der Suffix bestimmt, wie Azure die Daten repliziert:

  • LRSLocally Redundant Storage (lokal redundanter Speicher); die Kopien bleiben innerhalb eines Rechenzentrums, was für diese TEST-Übung und andere ersetzbare Nicht-Produktionsdaten geeignet ist
  • ZRSZone-Redundant Storage (zonenredundanter Speicher); die Kopien werden über Verfügbarkeitszonen einer Region verteilt, damit der Dienst einen Zonenausfall übersteht
  • GRSGeo-Redundant Storage (georedundanter Speicher); Kopien werden zusätzlich asynchron in eine zweite Azure-Region übertragen und erfordern für die Notfallwiederherstellung ein Failover

ZRS und GRS bilden keine einfache Reihenfolge von besser zu schlechter: ZRS schützt die Verfügbarkeit über Zonen, während GRS eine Kopie in einer zweiten Region bereitstellt.

Die drei Konstrukte haben unterschiedliche Aufgaben:

  • param erhält eine Bereitstellungsentscheidung wie test oder Standard_LRS
  • var leitet konsistente Namen und Tags innerhalb des Templates ab
  • output gibt bereitgestellte Werte für Personen, Skripte oder Pipelines zurück

Die @allowed-Listen lehnen nicht unterstützte Umgebungs- und SKU-Werte während der Validierung ab.

Bicep-Datei prüfen

Führe den Bicep-Linter aus:

az bicep lint \
  --file main.bicep

Keine Ausgabe bedeutet, dass der Linter keine Diagnose gefunden hat. Behebe jeden gemeldeten Fehler, bevor du fortfährst.

CloudTrips TEST vorbereiten

Wähle das CloudTrips-TEST-Abonnement:

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

Erstelle die TEST-Ressourcengruppe:

az group create \
  --name rg-cloudtrips-bicep-test-weu \
  --location westeurope \
  --tags Application=CloudTrips Environment=TEST ManagedBy=Bicep

Das Template selbst bleibt unverändert. TEST-spezifische Entscheidungen werden als Parameterwerte übergeben.

TEST-Bereitstellung anzeigen

Führe aus:

az deployment group what-if \
  --resource-group rg-cloudtrips-bicep-test-weu \
  --template-file main.bicep \
  --parameters \
    environment=test \
    storageSku=Standard_LRS \
    owner=DmytroKlymenko@cloudtrips.onmicrosoft.com

Bestätige, dass die Vorschau ein Speicherkonto mit dem Änderungstyp Create enthält. Die Tags müssen Environment: TEST und den übergebenen Owner enthalten.

What-if-Vorschau des wiederverwendeten Bicep-Templates mit dem CloudTrips-TEST-Speicherkonto als neue Ressource

Mit TEST-Werten bereitstellen

Stelle dasselbe Template bereit:

az deployment group create \
  --name deploy-cloudtrips-storage-test \
  --resource-group rg-cloudtrips-bicep-test-weu \
  --template-file main.bicep \
  --parameters \
    environment=test \
    storageSku=Standard_LRS \
    owner=DmytroKlymenko@cloudtrips.onmicrosoft.com \
  --query "properties.{state:provisioningState,outputs:outputs}" \
  --output yaml

Der --query-Ausdruck kürzt nur die Befehlsausgabe. Er zeigt den Bereitstellungsstatus und die mit output deklarierten Werte; die Bereitstellung selbst wird dadurch nicht verändert.

Bestätige:

state: Succeeded
outputs.storageAccountName.value: stcttest...
outputs.storageAccountId.value: /subscriptions/.../storageAccounts/stcttest...
outputs.blobEndpoint.value: https://stcttest....blob.core.windows.net/

Wiederverwendetes Template überprüfen

Kopiere den zurückgegebenen Speicherkontonamen und prüfe die Ressource:

storage_account_name="<storageAccountName-Ausgabe>"

az storage account show \
  --resource-group rg-cloudtrips-bicep-test-weu \
  --name "$storage_account_name" \
  --query "{name:name,sku:sku.name,environment:tags.Environment,owner:tags.Owner,managedBy:tags.ManagedBy}" \
  --output table

Überprüfe, dass das Ergebnis Folgendes enthält:

SKU: Standard_LRS
Environment: TEST
Owner: DmytroKlymenko@cloudtrips.onmicrosoft.com
ManagedBy: Bicep

CloudTrips-TEST-Speicherkonto aus dem wiederverwendbaren Template mit erwarteter SKU und erwarteten Tags

Das Team verfügt nun über ein Template für mehrere Umgebungen. Parameter legen veränderbare Entscheidungen offen, Variablen wenden Benennungs- und Taggingregeln an und Outputs machen das Bereitstellungsergebnis ohne eine Kopie des Templates verfügbar.