Bicep でループを使い複数のサブネットとストレージアカウントを作成する
Bicep で複数のリソースを作成したり、仮想ネットワーク内のサブネットをまとめて作成したい場合があります。一つ一つ定義しても作成可能ですが可視性や保守性が低下してしまいます。Bicep ではループを使い複数のAzure リソースを作成できる機能があるため、今回はこちらを使い、仮想ネットワーク内に複数のサブネットと複数のストレージアカウントを作成します。

実施環境
Azure CLI | 2.61.0 |
|---|---|
Bicep CLI | 0.28.1 |
前提条件
- Azure CLI 実行用のCloud Shell が作成済みであること
Bicep のループについて
Bicep でAzure リソースを作成する時、複数のリソースを同時に作成したい時があります。例えば、仮想ネットワークに複数のサブネットを作成したい、複数の仮想マシンを作成したい、複数のストレージアカウントを作成したい、など様々なケースがあります。Bicep でresource を一つ一つ宣言すればもちろん作成可能ですが、冗長な記述となってしまい、可読性や保守性の低下を招いてしまいます。
resource storageAccount1 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: 'sastorageaccount001'
location: 'japaneast'
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}
resource storageAccount2 'Microsoft.Storage/storageAccounts@2023-05-01' = { name: 'sastorageaccount002' location: 'japaneast' sku: { name: 'Standard_LRS' } kind: 'Storage'}
<省略>Bicep ではこのような冗長な記述とならないためにfor 構文を用いたループがあります。変数やAzure リソース作成時にこのループを利用することで、可読性などを落とさず複数のAzure リソースを作成・管理できます。
今回の構成
今回はBicep パラメーターファイルで複数の仮想ネットワークの設定を行い、ストレージアカウント名をゼロ埋めの連番で作成します。ファイル構成は以下の通りとなります。
.├── main.bicep└── main.bicepparamリソースグループの作成
初めにBicep デプロイ用のリソースグループを作成します。
# リソースグループを作成するaz group create --name rg-biceplooptest --location japaneastBicep パラメーターファイルの作成
リソースグループ作成後、仮想ネットワークとストレージアカウント用のパラメーターファイルを作成します。後続のストレージアカウント作成時に名前重複のエラーが発生する場合、storageAccountName を一意のリソース名となるよう修正してください。
using 'main.bicep'
@description('Azureリソースのリージョン')param location = 'japaneast'
@description('仮想ネットワーク名')param virtualNetworkName = 'vnet-biceplooptest'
@description('仮想ネットワークのアドレスプレフィックス')param virtualNetworkAddressPrefix = '10.0.0.0/16'
@description('仮想ネットワークのサブネット')param networkSubnet = [ { name: 'frontend' subnetPrefix: '10.0.0.0/24' } { name: 'backend' subnetPrefix: '10.0.10.0/24' } { name: 'data' subnetPrefix: '10.0.20.0/24' }]
@description('ストレージアカウント名')param storageAccountName = 'sabiceplooptest'
@description('ストレージアカウントの数')param itemCount = 3Bicep テンプレートファイルの作成
Bicep パラメーターファイル作成後、仮想ネットワークとストレージアカウントを作成するテンプレートファイルを作成します。
@description('Azureリソースのリージョン')param location string
@description('仮想ネットワーク名')param virtualNetworkName string
@description('仮想ネットワークのアドレスプレフィックス')param virtualNetworkAddressPrefix string
@description('仮想ネットワークのサブネット')param networkSubnet array
@description('ストレージアカウント名')param storageAccountName string
@description('ストレージアカウント数')param itemCount int
@description('ストレージアカウント名の連番配列')var storageAccountNumberList = [for count in range(1, itemCount) : padLeft(string(count), 3, '0')]
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-11-01' = { name: virtualNetworkName location: location properties: { addressSpace: { addressPrefixes: [ virtualNetworkAddressPrefix ] } subnets: [for subnet in networkSubnet: { name: subnet.name properties: { addressPrefix: subnet.subnetPrefix } }] }}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = [for number in storageAccountNumberList: { name: '${storageAccountName}${number}' location: location sku: { name: 'Standard_LRS' } kind: 'Storage'}]Bicep テンプレートファイルのデプロイ、確認
パラメーターファイルとテンプレートファイルを作成後、リソースグループにデプロイします。
# Bicepテンプレートファイルのデプロイ結果を確認するaz deployment group what-if --resource-group rg-biceplooptest --template-file main.bicep --parameters main.bicepparam
リソースグループにデプロイする
az deployment group create --resource-group rg-biceplooptest --template-file main.bicep --parameters main.bicepparamデプロイ後、Azure Portal より仮想ネットワークおよびサブネット、ストレージアカウントが3つ作成されたことを確認します。


リソースをクリーンアップ
Azure リソース確認後、Azure リソースをクリーンアップします。
# Azureリソースをクリーンアップするaz group delete --name rg-biceplooptestまとめ
- Bicep でループを利用する場合、for 構文を利用する
- Bicep のループは親リソースだけでなく子リソースにも利用できる
- Bicep でゼロ埋めの文字列を作成する場合、padLeft 関数での文字列加工が必要
