新しくリリースされた Bicep 0.17.1 のCIDR 関数を使ってみました
はじめに
皆さん、こんにちは!DWSのアーノルドです。
このブログ記事では、Microsoft Azureネイティブのドメイン固有言語(DSL)である Bicep の新バージョンで新しく登場したネットワーク CIDR 関数について調査し、サンプルの実装を通じてその使い方をご紹介したいと思います。
Bicep とは、Terraform と似たような Infrastructure as Code(IaC)を実現するための言語です。5月上旬に、Bicep のバージョン 0.17.1 がリリースされ、過去のバージョンでは不可能だったネットワーク IP アドレスブロックの自動計算や、サブネットの動的作成が、可能になりました。
Bicep の CIDR 関数の概要
CIDR 関数で利用できる関数には以下のものがあります:
- parseCidr: CIDR表記のIPアドレス範囲を解析し、アドレス範囲のさまざまなプロパティを含むオブジェクトを返します。
- cidrSubnet: CIDR表記で指定されたIPアドレス範囲を新しいCIDR値を持つサブネットに分割し、指定されたインデックスのサブネットのIPアドレス範囲を返します。
- cidrHost: CIDR表記の指定されたIPアドレス範囲において、指定されたインデックスのホストIPアドレスを計算し、使用可能なIPアドレスのみを表示します。
公式ドキュメンテーションは、以下のリンクをご参照ください。
https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/bicep-functions-cidr
サンプルの実装
Azureで複数のサブネットに分割された仮想ネットワーク(VNet)を作成しなければならない、というよくあるシナリオを考えてみましょう。これまでは、Bicepテンプレート内にすべての必要なサブネットを静的に指定するか、半動的にサブネット作成を実現したい場合、パラメータとして配列を渡し、ループで処理するというのが一般的なやり方だったかと思いますが、今回は新たにリリースされた cidrSubnet 関数により、こうした操作がより簡単になりました。cidrSubnet 関数を使用することで、VNetアドレスプレフィックス、希望するサブネットサイズ、サブネット数などのパラメータを渡すだけで、サブネットの IP アドレスを動的に計算し、作成することができるようになりました。
以下は、サンプル実装の Bicep コードです。
@description('VNet name')
param vnetName string = 'myTestVnet'
@description('The CIDR block for the VNet address space.')
param vnetAddressPrefix string = '10.0.0.0/8'
@description('Size of each subnet')
@minValue(16)
@maxValue(29)
param subnetSize int = 16
@description('Number of subnets to be created')
@minValue(1)
param subnetCount int = 5
var subnetPrefixes = [for i in range(0, subnetCount): cidrSubnet(vnetAddressPrefix, subnetSize, i)]
resource vnet 'Microsoft.Network/virtualNetworks@2022-09-01' = {
name: vnetName
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
vnetAddressPrefix
]
}
subnets: []
}
}
@batchSize(1)
resource subnets 'Microsoft.Network/virtualNetworks/subnets@2022-09-01' = [for (prefix, index) in subnetPrefixes: {
parent: vnet
name: '${vnetName}-subnet0${index}'
properties: {
addressPrefix: prefix
}
}]
実装をステップごとに解説しましょう。
- パラメータの定義:
vnetName
:VNetの名前を定義します。デフォルトの値は "myTestVnet" に設定されています。vnetAddressPrefix
:VNet アドレススペースの CIDR ブロックを定義します。デフォルトの値は "10.0.0.0/8" に設定されています。subnetSize
:VNet 内の各サブネットのサイズを指定します。最小値は 16、最大値は 29 に制限されています。デフォルトの値は 16 に設定されています。subnetCount
:VNet 内に作成するサブネットの数を決定します。最小値は 1 に設定されています。デフォルトの値は 5 に設定されています。
- 変数の宣言:
- subnetPrefixes:配列として宣言されます。これは、cidrSubnet関数をforループ内で使用し、VNet アドレスプレフィックスとサブネットサイズに基づいて各サブネットの CIDR プレフィックスを動的に計算します。0 から subnetCount パラメータの値までの値を反復処理し、サブネットのプレフィックスを配列の形で出力します。
- リソースの定義
- VNet:Microsoft.Network/virtualNetworksのリソースタイプを使用し、Azure 仮想ネットワークを表します。リソース名は vnetName パラメータを使用して指定され、リージョンはresourceGroup().location 関数によって対象のリソースグループから動的に取得されます。VNetのリソースには、addressSpace のプロパティも含まれており、VNetのアドレスプレフィックスを設定します。この場合、vnetAddressPrefix のパラメータの値がアドレスプレフィックスとして使用されます。
- サブネット:Microsoft.Network/virtualNetworks/subnets のリソースタイプを使用し、VNet 内に作成されるサブネットを表します。サブネットは、配列オブジェクトであるsubnetPrefixes の変数を反復処理することで作成されます。サブネット名は、vnetName のパラメータと各サブネットのインデックスを使用して動的に生成されます。さらに、batchSize(1) の属性は、各サブネットが一度に1つずつ連続的に作成されることを保証します。これは、Azure APIで起こりうるコンフリクトエラーを回避するためです。
VNetをデプロイしてみましょう
- まず、VSCode で bicep テンプレートを右クリックして "Build ARM template "を選択し、ARMテンプレートに変換します。
- json の ARM テンプレートを Template Specs にアップロードします。
- Azure ポータルから「テンプレートスペック」 を開き、「テンプレートのインポート」を選択し、JSON ファイルを選択します。
- テンプレート名およびバージョンを入力し、テンプレートスペック格納先のリソースグループを選択または作成します。
- 下の「確認および作成」ボタンをクリックすると、テンプレートスペックが作成されます。
- 新しく作成したテンプレートスペックを選択し、「展開」ボタンをクリックします。
- 適切なサブスクリプションとリソースグループを選択し、希望のVNet名、アドレスプレフィックス、サブネットサイズ、数を入力します。ここで例として、192.168.0.0/16 のVNetと、サイズ 19 の 8つのサブネットを作成することにしました。
- デプロイメントが完了したら、新しくデプロイしたVNetを開き、詳細を確認しましょう。以下スクリーンショットの通り、cidrSubnets関数が自動的に正しいCIDR範囲を計算し、配列型のsubnetPrefixesという変数に保存しました。その配列を for ループで処理し、8つのサブネットが正常に作成されています。
結論
このブログ記事では、サンプル実装を通じて Bicep の CIDR 関数の利用法を探求しました。
Bicep の CIDR 関数の導入により、正しいCIDR範囲を持つサブネットを動的に自動計算・作成することが非常に容易になりましたよね。これらの関数を使用することによって、インフラストラクチャのコードをより宣言的で簡潔なものにすることができると思うので、ぜひ Bicep の CIDR 関数をご自身の Azure デプロイに取り入れてみましょう。Happy coding!