Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menunjukkan kepada Anda cara menggunakan sintaks for untuk mengiterasi item dalam koleksi. Fungsionalitas ini didukung mulai dari v0.3.1 dan seterusnya. Anda dapat menggunakan perulangan untuk menentukan beberapa salinan sumber daya, modul, variabel, properti, atau output. Gunakan perulangan untuk menghindari sintaks berulang dalam file Bicep Anda dan untuk secara dinamis mengatur jumlah salinan yang akan dibuat selama penyebaran. Lihat Mulai Cepat: Membuat beberapa instans sumber daya di Bicep untuk panduan cepat tentang cara menggunakan berbagai sintaks untuk membuat beberapa instans sumber daya di Bicep.
Untuk menggunakan perulangan untuk membuat beberapa sumber daya atau modul, setiap instans harus memiliki nilai unik untuk properti name. Anda dapat menggunakan nilai indeks atau nilai unik dalam array atau koleksi untuk membuat nama.
Sintaks perulangan
Perulangan dapat dideklarasikan dengan:
Menggunakan indeks bilangan bulat. Opsi ini berfungsi ketika skenario Anda adalah: "Saya ingin membuat instans sebanyak ini." Fungsi rentang membuat array bilangan bulat yang dimulai pada indeks awal dan berisi jumlah elemen yang ditentukan. Dalam perulangan, Anda dapat menggunakan indeks bilangan bulat untuk mengubah nilai. Untuk informasi selengkapnya, lihat Indeks bilangan bulat.
[for <index> in range(<startIndex>, <numberOfElements>): { ... }]Menggunakan item dalam array: Opsi ini berfungsi saat skenario Anda adalah, "Saya ingin membuat objek untuk setiap elemen dalam array." Dalam perulangan, Anda dapat menggunakan nilai elemen array saat ini untuk memodifikasi nilai lainnya. Untuk informasi selengkapnya, lihat Elemen array.
[for <item> in <collection>: { ... }]Menggunakan item dalam objek kamus: Opsi ini berfungsi saat skenario Anda adalah, "Saya ingin membuat instans untuk setiap item dalam objek." Fungsi item mengonversi objek menjadi array. Dalam perulangan, Anda dapat menggunakan properti pada objek untuk menghasilkan nilai. Untuk informasi selengkapnya, lihat Objek kamus.
[for <item> in items(<object>): { ... }]Menggunakan indeks bilangan bulat dan item dalam array: Opsi ini berfungsi saat skenario Anda adalah, "Saya ingin membuat instans untuk setiap elemen dalam array, tetapi saya juga memerlukan indeks saat ini untuk membuat nilai lain." Untuk informasi selengkapnya, lihat Pengulangan array dan indeks.
[for (<item>, <index>) in <collection>: { ... }]Menambahkan penyebaran kondisional: Opsi ini dapat digunakan ketika skenario Anda adalah, "Saya ingin membuat beberapa instans, tetapi saya hanya ingin menyebarkan setiap instans ketika kondisinya benar." Untuk informasi selengkapnya, lihat Perulangan dengan kondisi.
[for <item> in <collection>: if(<condition>) { ... }]
Batas perulangan
Menggunakan perulangan di Bicep memiliki batasan berikut:
- Perulangan Bicep hanya berfungsi dengan nilai yang dapat ditentukan pada saat memulai penyebaran.
- Perulangan perulangan tidak boleh berupa angka negatif atau melebihi 800 iterasi.
- Karena sumber daya tidak dapat berulang dengan sumber daya anak yang bertingkat, ubah sumber daya anak menjadi sumber daya tingkat atas. Untuk informasi selengkapnya, lihat Perulangan untuk sumber daya anak.
- Untuk mengulang beberapa tingkat properti, gunakan fungsi lambda
map.
Indeks bilangan bulat
Untuk contoh sederhana menggunakan indeks, buat variabel yang berisi array string:
param itemCount int = 5
var stringArray = [for i in range(0, itemCount): 'item${(i + 1)}']
output arrayResult array = stringArray
Output menghasilkan array dengan nilai-nilai berikut:
[
"item1",
"item2",
"item3",
"item4",
"item5"
]
Contoh berikutnya membuat jumlah akun penyimpanan yang ditentukan dalam storageCount parameter . Ini mengembalikan tiga properti untuk setiap akun penyimpanan:
param location string = resourceGroup().location
param storageCount int = 2
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, storageCount): {
name: '${i}storage${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
output storageInfo array = [for i in range(0, storageCount): {
id: storageAcct[i].id
blobEndpoint: storageAcct[i].properties.primaryEndpoints.blob
status: storageAcct[i].properties.statusOfPrimary
}]
Perhatikan bahwa indeks i digunakan dalam membuat nama sumber daya akun penyimpanan.
Contoh berikutnya menyebarkan modul tersebut berulang kali:
param location string = resourceGroup().location
param storageCount int = 2
var baseName = 'store${uniqueString(resourceGroup().id)}'
module stgModule './storageAccount.bicep' = [for i in range(0, storageCount): {
name: '${i}deploy${baseName}'
params: {
storageName: '${i}${baseName}'
location: location
}
}]
output storageAccountEndpoints array = [for i in range(0, storageCount): {
endpoint: stgModule[i].outputs.storageEndpoint
}]
Elemen-elemen dalam array
Contoh berikut membuat satu akun penyimpanan untuk setiap nama yang disediakan dalam storageNames parameter . Perhatikan properti nama untuk setiap instans sumber daya harus unik:
param location string = resourceGroup().location
param storageNames array = [
'contoso'
'fabrikam'
'coho'
]
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for name in storageNames: {
name: '${name}${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
Contoh berikutnya berulang melalui array untuk menentukan properti. Ini membuat dua subnet dalam jaringan virtual. Perhatikan bahwa nama subnet harus unik:
param rgLocation string = resourceGroup().location
var subnets = [
{
name: 'api'
subnetPrefix: '10.144.0.0/24'
}
{
name: 'worker'
subnetPrefix: '10.144.1.0/24'
}
]
resource vnet 'Microsoft.Network/virtualNetworks@2025-01-01' = {
name: 'vnet'
location: rgLocation
properties: {
addressSpace: {
addressPrefixes: [
'10.144.0.0/20'
]
}
subnets: [for subnet in subnets: {
name: subnet.name
properties: {
addressPrefix: subnet.subnetPrefix
}
}]
}
}
Array dan indeks
Contoh berikut menggunakan elemen array dan nilai indeks saat menentukan akun penyimpanan:
param storageAccountNamePrefix string
var storageConfigurations = [
{
suffix: 'local'
sku: 'Standard_LRS'
}
{
suffix: 'geo'
sku: 'Standard_GRS'
}
]
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2025-06-01' = [for (config, i) in storageConfigurations: {
name: '${storageAccountNamePrefix}${config.suffix}${i}'
location: resourceGroup().location
sku: {
name: config.sku
}
kind: 'StorageV2'
}]
Contoh berikutnya menggunakan elemen array dan indeks untuk menghasilkan informasi tentang sumber daya baru:
param location string = resourceGroup().location
param orgNames array = [
'Contoso'
'Fabrikam'
'Coho'
]
resource nsg 'Microsoft.Network/networkSecurityGroups@2025-01-01' = [for name in orgNames: {
name: 'nsg-${name}'
location: location
}]
output deployedNSGs array = [for (name, i) in orgNames: {
orgName: name
nsgName: nsg[i].name
resourceId: nsg[i].id
}]
Objek kamus
Untuk mengulangi elemen dalam objek kamus, gunakan items fungsi , yang mengonversi objek menjadi array. Gunakan properti value untuk mendapatkan properti pada objek. Perhatikan bahwa nama sumber daya nsg harus unik.
param nsgValues object = {
nsg1: {
name: 'nsg-westus1'
location: 'westus'
}
nsg2: {
name: 'nsg-east1'
location: 'eastus'
}
}
resource nsg 'Microsoft.Network/networkSecurityGroups@2025-01-01' = [for nsg in items(nsgValues): {
name: nsg.value.name
location: nsg.value.location
}]
Perulangan dengan kondisi
Untuk sumber daya dan modul, Anda dapat menambahkan if ekspresi dengan sintaks perulangan untuk menyebarkan koleksi secara kondisional.
Contoh berikut menunjukkan perulangan yang dikombinasikan dengan pernyataan kondisi. Dalam contoh ini, satu kondisi diterapkan ke semua instans modul:
param location string = resourceGroup().location
param storageCount int = 2
param createNewStorage bool = true
var baseName = 'store${uniqueString(resourceGroup().id)}'
module stgModule './storageAccount.bicep' = [for i in range(0, storageCount): if(createNewStorage) {
name: '${i}deploy${baseName}'
params: {
storageName: '${i}${baseName}'
location: location
}
}]
Contoh berikutnya menunjukkan cara menerapkan kondisi yang khusus untuk elemen saat ini dalam array:
resource parentResources 'Microsoft.Example/examples@2024-06-06' = [for parent in parents: if(parent.enabled) {
name: parent.name
properties: {
children: [for child in parent.children: {
name: child.name
setting: child.settingValue
}]
}
}]
Melakukan penyebaran dalam kelompok
Sumber daya Azure disebarkan secara paralel secara default. Saat Anda menggunakan perulangan untuk membuat beberapa instans jenis sumber daya, semua instans tersebut disebarkan secara bersamaan. Urutan pembuatannya tidak dijamin. Tidak ada batasan jumlah sumber daya yang disebarkan secara paralel selain batas total 800 sumber daya dalam file Bicep.
Anda mungkin tidak ingin memperbarui semua instans jenis sumber daya secara bersamaan. Misalnya, saat memperbarui lingkungan produksi, Anda mungkin ingin menjadwalkan pembaruan bertahap agar hanya sejumlah tertentu yang diperbarui pada satu waktu. Anda dapat menentukan subset instans yang akan di-batch bersama dan disebarkan secara bersamaan. Instans lain menunggu batch tersebut sampai selesai.
Untuk menyebarkan instans sumber daya secara serial, tambahkan batchSize dekorator. Atur nilainya ke jumlah instans untuk disebarkan secara bersamaan. Dependensi dibuat selama instans sebelumnya dalam perulangan, sehingga tidak memulai satu batch hingga batch sebelumnya selesai.
param location string = resourceGroup().location
@batchSize(2)
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, 4): {
name: '${i}storage${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
Untuk penyebaran berurutan, atur ukuran batch ke 1.
Dekorator batchSize berada di namespace sys. Jika Anda perlu membedakan dekorator ini dari item lain dengan nama yang sama, awali dekorator dengan sys: @sys.batchSize(2)
Iterasi untuk sumber daya anak
Untuk membuat lebih dari satu instans sumber daya anak, kedua file Bicep berikut mendukung tugas ini:
Sumber daya anak tertanam
param location string = resourceGroup().location
resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
name: 'examplestorage'
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
resource service 'fileServices' = {
name: 'default'
resource share 'shares' = [for i in range(0, 3): {
name: 'exampleshare${i}'
}]
}
}
Sumber daya anak tingkat atas
resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
resource service 'Microsoft.Storage/storageAccounts/fileServices@2025-06-01' = {
name: 'default'
parent: stg
}
resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2025-06-01' = [for i in range(0, 3): {
name: 'exampleshare${i}'
parent: service
}]
Mereferensikan kumpulan sumber daya/modul
Fungsi templat Azure Resource Manager (templat ARM) references mengembalikan array objek yang mewakili status runtime kumpulan sumber daya. Karena tidak ada fungsi eksplisit references dalam Bicep dan penggunaan pengumpulan simbolis digunakan secara langsung, Bicep menerjemahkannya ke templat ARM yang menggunakan fungsi templat references ARM saat kode dihasilkan. Untuk fitur terjemahan yang menggunakan references fungsi untuk mengubah koleksi simbolis menjadi templat ARM, perlu memiliki Bicep CLI versi 0.20.X atau yang lebih tinggi. Selain itu, dalam file bicepconfig.json , symbolicNameCodegen pengaturan harus disajikan dan diatur ke true.
Hasil dari dua sampel dalam indeks Bilangan Bulat dapat ditulis sebagai:
param location string = resourceGroup().location
param storageCount int = 2
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, storageCount): {
name: '${i}storage${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
output storageInfo array = map(storageAcct, store => {
blobEndpoint: store.properties.primaryEndpoints
status: store.properties.statusOfPrimary
})
output storageAccountEndpoints array = map(storageAcct, store => store.properties.primaryEndpoints)
File Bicep ini ditranspilasi ke dalam templat ARM JSON berikut yang menggunakan references fungsi :
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"languageVersion": "1.10-experimental",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"storageCount": {
"type": "int",
"defaultValue": 2
}
},
"resources": {
"storageAcct": {
"copy": {
"name": "storageAcct",
"count": "[length(range(0, parameters('storageCount')))]"
},
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-04-01",
"name": "[format('{0}storage{1}', range(0, parameters('storageCount'))[copyIndex()], uniqueString(resourceGroup().id))]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage"
}
},
"outputs": {
"storageInfo": {
"type": "array",
"value": "[map(references('storageAcct', 'full'), lambda('store', createObject('blobEndpoint', lambdaVariables('store').properties.primaryEndpoints, 'status', lambdaVariables('store').properties.statusOfPrimary)))]"
},
"storageAccountEndpoints": {
"type": "array",
"value": "[map(references('storageAcct', 'full'), lambda('store', lambdaVariables('store').properties.primaryEndpoints))]"
}
}
}
Catatan dalam templat ARM JSON sebelumnya, languageVersion harus diatur ke 1.10-experimental, dan elemen sumber daya adalah objek alih-alih array.
Langkah selanjutnya
Untuk mempelajari cara membuat file Bicep, lihat Struktur dan sintaks file Bicep.