Cloud can be tricky sometimes. Find out what scenarios we've ran into that are worth being mentioned and explained.
Azure Bicep’s looping functionality allows for cleaner, more efficient infrastructure deployments. By using loops, you can dynamically deploy multiple resources, iterate over arrays, and simplify parameterized configurations.
In this guide, we’ll cover:
✔ Basic looping syntax and structure
✔ Using loops for resources, modules, and outputs
✔ Filtering loops with conditions
✔ Using loop indices for structured naming
✔ Nested loops for complex deployments
✔ Batch size control for sequential execution
1. Basic Loops: Deploying Multiple Resources
The for-loop expression iterates over arrays, allowing multiple resources to be created dynamically.
Example: Creating Multiple Log Analytics Workspaces
Bicep
var logAnalyticsWorkspaces = [
{
name: 'monitoring-east'
location: 'eastus'
}
{
name: 'monitoring-west'
location: 'westus'
}
]
resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-06-01' = [for workspace in logAnalyticsWorkspaces: {
name: workspace.name
location: workspace.location
properties: {}
}]
Bicep
var gateways = [
{
name: 'app-gateway-east'
location: 'eastus'
}
{
name: 'app-gateway-west'
location: 'westus'
}
]
module appGateway 'modules/applicationGateway.bicep' = [for gateway in gateways: {
name: '${gateway.name}-deploy'
params: {
gatewayName: gateway.name
location: gateway.location
}
}]
Bicep
var gateways = [
{
name: 'app-gateway-east'
location: 'eastus'
enabled: true
}
{
name: 'app-gateway-west'
location: 'westus'
enabled: false
}
]
resource applicationGateways 'Microsoft.Network/applicationGateways@2021-06-01' = [for gateway in gateways: if (gateway.enabled) {
name: gateway.name
location: gateway.location
properties: {}
}]
Bicep
resource publicIPs 'Microsoft.Network/publicIPAddresses@2021-06-01' = [for i in range(1, 4): {
name: 'public-ip-${i}'
location: resourceGroup().location
properties: {
publicIPAllocationMethod: 'Static'
}
}]
Bicep
var storageAccounts = [
{
name: 'storageeast'
location: 'eastus'
containers: [
{ name: 'logs' }
{ name: 'data' }
]
}
{
name: 'storagewest'
location: 'westus'
containers: [
{ name: 'backups' }
]
}
]
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = [for account in storageAccounts: {
name: account.name
location: account.location
properties: {}
resource containers 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-06-01' = [for container in account.containers: {
name: container.name
}]
}]
Bicep
@batchSize(2)
resource sqlDatabases 'Microsoft.Sql/servers/databases@2021-05-01' = [for i in range(1, 6): {
name: 'sqldb-${i}'
location: resourceGroup().location
properties: {
collation: 'SQL_Latin1_General_CP1_CI_AS'
}
}]
Bicep
output storageAccountIds array = [for (account, i) in storageAccounts: {
name: storageAccount[i].name
id: storageAccount[i].id
}]
Bicep
var vmPrefixes = ['web', 'api', 'db']
var vmNames = [for (prefix, i) in vmPrefixes: {
id: i+1
fullName: '${prefix}-vm-${i+1}'
}]