Young Leaves

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 japaneast

Bicep パラメーターファイルの作成

リソースグループ作成後、仮想ネットワークとストレージアカウント用のパラメーターファイルを作成します。後続のストレージアカウント作成時に名前重複のエラーが発生する場合、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 = 3

Bicep テンプレートファイルの作成

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 関数での文字列加工が必要

参考資料