Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 5 Min.

Dynamik mit Schleifen und Bedingungen

Dieser Beitrag zeigt zwei Varianten der „for“-Expression und erläutert, wie der Index zusätzlich genutzt werden kann und worauf bei der Steuerung der Parallelität geachtet werden sollte.
Bicep_Schleifen.jpg
© Gemini

Sobald mehrere gleichartige Ressourcen entstehen sollen, etwa drei Storage-Accounts für unterschiedliche Teams oder eine Reihe von Subnetzen, wird das Kopieren einzelner Ressourcenblöcke schnell unübersichtlich. Bicep löst dieses Problem über die for-Expression, die in zwei Varianten auftritt: eine zählende Schleife über einen Zahlenbereich mit range() und eine for-each-Schleife über eine bestehende Auflistung wie ein Array.

Grundprinzip der for-Expression

Zunächst das for-each über eine Auflistung: Diese häufigere Variante iteriert direkt über die Elemente eines Arrays:

 

resource storageAccounts 'Microsoft.Storage/storageAccounts@2023-05-01' = [for name in storageAccountNames: {
  name: '${name}${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

 

Für jedes Element im Array storageAccountNames entsteht eine eigenständige Ressourceninstanz – anstelle mehrerer manuell geschriebener Ressourcenblöcke genügt eine einzige, klar lesbare Definition.

Die zweite Variante ist eine zählende Schleife über range(): Steht statt einer Werteliste nur eine Anzahl fest, etwa „drei gleichartige Instanzen“, eignet sich die zählende Variante mit range(start, count). Sie liefert ein Array fortlaufender Zahlen, über das wie gewohnt iteriert wird:

 

resource numberedStorageAccounts 'Microsoft.Storage/storageAccounts@2023-05-01' = [for i in range(0, storageAccountCount): {
  name: take('stnum${i}${uniqueString(resourceGroup().id)}', 24)
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

 

Hier liefert range(0, storageAccountCount) fortlaufende Zahlen ab 0, die direkt in den Ressourcennamen einfließen – passend, wenn nur die Anzahl relevant ist, nicht aber die individuellen Namen pro Instanz.

Zugriff auf den Index

Neben dem reinen Wert steht in vielen Fällen auch der Index einer Schleife zur Verfügung. Das ist hilfreich, wenn Ausgaben pro Instanz referenziert werden müssen.

 

output deployedNames array = [for (name, i) in storageAccountNames: storageAccounts[i].name]

 

Die Syntax (name, i) liefert sowohl den aktuellen Wert als auch die laufende Position innerhalb des Arrays. Damit lassen sich Outputs, Referenzen oder abhängige Ressourcen präzise einer bestimmten Instanz zuordnen.

Steuerung der Parallelität mit batchSize

Standardmäßig versucht Azure Resource Manager, alle Instanzen einer Schleife parallel bereitzustellen. Bei Ressourcen mit Abhängigkeiten untereinander oder bei API-Limits ist das nicht immer gewünscht. Der Decorator @batchSize begrenzt die Anzahl gleichzeitig laufender Deployments.

 

@batchSize(1)
resource storageAccounts 'Microsoft.Storage/storageAccounts@2023-05-01' = [for name in storageAccountNames: {
  ...
}]

 

Mit @batchSize(1) werden die Instanzen nacheinander statt gleichzeitig bereitgestellt, was insbesondere für Testszenarien und Ressourcen mit strikten Ratenlimits sinnvoll ist.

Bedingungen: if und der Ternary-Operator

Neben Schleifen gibt es in Bicep ein zweites Werkzeug für dynamische Templates: Bedingungen. Eine Ressource oder ein Modul wird nur dann bereitgestellt, wenn ein vorangestelltes if zu true auswertet – häufig miteinander kombiniert.

 

resource backupStorage 'Microsoft.Storage/storageAccounts@2023-05-01' = if (deployBackupAccount) {
  name: 'stbackup${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: 'Standard_GRS'
  }
  kind: 'StorageV2'
}

 

Hat deployBackupAccount den Wert false, entsteht eine Ressourceninstanz, ohne dass der Ressourcenblock selbst entfernt oder auskommentiert werden muss.

Für einfache, bedingte Werte anstelle ganzer Ressourcen eignet sich der Ternary-Operator, bekannt aus vielen Programmiersprachen in der Form Bedingung ? WertWennWahr : WertWennFalsch:

 

var storageSku = environment == 'prod' ? 'Standard_GRS' : 'Standard_LRS'

 

Terraform kennt kein eigenes if: Konditionalität läuft dort über dieselbe count-Eigenschaft wie Wiederholungen, etwa count = var.deploy_backup ? 1 : 0. Bicep trennt beide Konzepte bewusst – for für Wiederholung, if für Bedingung –, wodurch die Absicht im Code sofort erkennbar ist.

Vollständiges Beispiel

Das folgende Beispiel demonstriert, wie man mehrere Azure-Storage-Accounts effizient über ein Array erstellt und deren finale Namen als Ausgabe zurückgibt:

 

param location string = resourceGroup().location
param storageAccountNames array = [
  'stloopdemoa'
  'stloopdemob'
  'stloopdemoc'
]
@batchSize(1)
resource storageAccounts 'Microsoft.Storage/storageAccounts@2023-05-01' = [for name in storageAccountNames: {
  name: '${name}${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]
output deployedNames array = [for (name, i) in storageAccountNames: storageAccounts[i].name]

Warum ist das wichtig?

Schleifen verhindern, dass strukturell identischer Code mehrfach im Template auftaucht, und reduzieren damit das Risiko, dass bei einer späteren Änderung eine Kopie vergessen wird. Anpassungen an der Ressourcenlogik erfolgen nur an einer Stelle und wirken sich automatisch auf alle Instanzen aus.

Best Practices

  • Arrays für Schleifen erhalten aussagekräftige Namen, die den Zweck der Instanzen erkennen lassen.
  • @batchSize wird bewusst gesetzt, wenn Abhängigkeiten oder Ratenlimits eine sequenzielle Bereitstellung erfordern.
  • Der Index wird nur dann verwendet, wenn er tatsächlich benötigt wird, um die Lesbarkeit zu erhalten.
  • Schleifen werden klein und fokussiert gehalten; verschachtelte Strukturen werden nur bei klarem Mehrwert eingesetzt.

Häufige Fehler

  • Fehlende Eindeutigkeit im Namen führt bei global eindeutigen Ressourcen wie Storage-Accounts zu Konflikten.
  • Sehr tief verschachtelte Schleifen erschweren die Nachvollziehbarkeit erheblich, ähnlich wie bei Modulen.
  • Parallele Deployments ohne @batchSize können bei abhängigen Ressourcen zu Race Conditions führen.
  • Arrays werden über das Azure CLI ohne korrekte Quotierung übergeben, was zu Parsing-Fehlern führt.

Fazit

Schleifen und Bedingungen sind ein zentrales Werkzeug, um wiederkehrende Ressourcenstrukturen kompakt und wartbar zu beschreiben. In Kombination mit Parametern und Variablen, die der vorangegangene zweite Teil dieser Serie zu Infrastructure as Code mit Azure Bicep vorgestellt hat, entsteht damit bereits ein sehr flexibles Grundgerüst.

Der nächste Teil der Serie widmet sich Funktionen, mit denen sich wiederkehrende Logik zusätzlich kapseln und testen lässt.

Neueste Beiträge

Von Vibe Coding zur verlässlichen Anwendung - Was KI-generierte Anwendungen für den produktiven Einsatz brauchen
Der Beitrag zeigt, wie Spec-Driven Development natürliche Sprache mit verbindlichen Anforderungen an Qualität, Verantwortung und langfristige Wartbarkeit verbindet.
8 Minuten
9. Nov 2026
Review von KI-generiertem Code - Projektanforderungen an Entwickler in Zeiten von KI, Teil 3
Der Code kompiliert. Die Tests sind grün. Der Pull Request sieht sauber aus. Und trotzdem ist er falsch. Fünf Fehlermuster zeigen, worauf die Reviewer beim KI-generierten Code achten müssen, weil Syntax-Korrektheit längst nicht Geschäftslogik-Korrektheit bedeutet.
6 Minuten
Game-Boy-Emulation in C# – ROM-Dumping - Retro-Hardware mit .NET in Software nachbilden, Teil 2
Ohne Spiele kein Emulator – wie man echte Cartridges mit einem Arduino und etwas C# zum Reden bringt.
7 Minuten
4. Nov 2026

Das könnte Dich auch interessieren

Laufzeitgewinn messen - Schnellere .NET-CI-Pipelines mit Test Sharding, Teil 4
Mehr Shards können das Feedback beschleunigen, aber auch zugleich die CI-Kosten erhöhen. Ein Vergleich mit zwei Referenzläufen zeigt, wo sich zusätzliche Runner lohnen. Ebenso wichtig ist der Nachweis, dass weiterhin alle vorgesehenen Tests laufen.
6 Minuten
GitLab CI mit Testreports einrichten - Schnellere .NET-CI-Pipelines mit Test Sharding, Teil 3
GitLab liefert die Shard-Nummern direkt an Meziantou.ShardedTest. Für aussagekräftige Ergebnisse im Merge Request braucht es zusätzlich passende Reports. Bei Integrationstests entscheidet die Trennung der Testdaten über zuverlässige Parallelläufe.
6 Minuten
Setup per CLI oder als Stand-alone-Runtime - Infrastructure as Code mit Azure Bicep, Teil 1
Dieser Beitrag erklärt, was Bicep ist, wie das Bicep CLI als zugrunde liegende Engine installiert wird, aus welchen Grundbausteinen ein Template besteht und wie VS Code mit der passenden Erweiterung den Einstieg erleichtert.
5 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige