本記事では、Azureのリソース管理ツールであるBicepを活用し、ネットワーク基盤をコード化してデプロイ(構築)する過程をご紹介します。
私自身、Bicepの実装は手探りからのスタートでしたが、その中で得られた構築プロセスを整理してまとめました。
Bicepをこれから触ってみたいと思っている方の、参考になれば嬉しいです。
Bicepとは
Bicepは、宣言型の構文を用いてAzureリソースをデプロイするためのドメイン固有言語(DSL)です。
従来のARMテンプレート(JSON形式)と比較して可読性が高く、VS Code拡張機能による型補完やエラーチェックを活用することで、構築ミスを未然に防ぎながら少ないコード量で記述できる点が特徴です。
Bicepのより詳細な仕様や最新情報については、以下の公式サイトを参照ください。
今回作成するリソース
今回は、Azureインフラの土台となる「ネットワーク基本セット」を構築します。
複数のサブネットで共通のセキュリティポリシーやルーティングを適用する、実務でもよくある構成を想定しています。
作成するリソース
①仮想ネットワーク (VNet) × 1
2つのサブネットを含みます(今回は同じ役割のサブネットとして構築)。
②ネットワークセキュリティグループ (NSG) × 1
共有設定として両方のサブネットへ紐付けます。
③ルートテーブル (RT) × 1
共有設定として両方のサブネットへ紐付けます。
事前準備:開発環境を整える
Bicepの作成をスムーズに進めるために、以下の3つのツールを準備します。
①Visual Studio Code (VS Code)
コードの作成・編集に使用するメインエディタです。
②Bicep 拡張機能 (VS Code内)
VS Codeにインストールすることで、コードの自動補完(型補完)や、記述ミスを教えてくれるエラーチェックが有効になります。
③Azure CLI
作成したBicepファイルを、手元のPCからAzure環境へデプロイするために使用します。
Bicepコードを書いてみる
Bicepには、複雑な構成を小さく管理しやすい単位に分割する「モジュール」という仕組みがあります。
今回は、将来の拡張性や再利用性を考慮し、単一のファイルにすべてを記述するのではなく、「全体を制御するメインファイル」と「各リソースを定義するモジュール」を分ける構成を採用しました。
ファイル構成
.
├── main.bicep # 全体の司令塔(各モジュールを呼び出す)
├── main.bicepparam # パラメータファイル(環境ごとの設定値)
└── modules/ # リソース定義を格納するフォルダ
└── network.bicep # ネットワークリソースの定義
この構成の大きなメリットは、管理がしやすい点にあります。
今後、ストレージやデータベースなど構築対象のリソースが増えていく場合も、
modules/ フォルダの中に storage.bicep や database.bicep といった形でファイルを追加していくことで、
シンプルに構成を拡張していくことが可能です。
構築コード
以下の通り、コードを記述いたしました。
network.bicep(モジュール)
ここでは、ネットワークの基盤となるリソースを定義します。
@description('リソースを配置するリージョンを指定します。')
param location string
@description('作成する仮想ネットワーク(VNet)の名前を指定します。')
param vnetName string
@description('VNet全体のアドレス空間(CIDR)を指定します。')
param vnetAddressPrefix string
@description('サブネット名の配列。各サブネットの名称とアドレスプレフィックスを含めます。')
param subnetConfigs array
@description('共通で適用するネットワークセキュリティグループ(NSG)の名前です。')
param nsgName string
@description('共通で適用するルートテーブル(RT)の名前です。')
param rtName string
// 1. ネットワークセキュリティグループ (NSG) の定義
resource nsg 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
name: nsgName
location: location
properties: {
securityRules: []
}
}
// 2. ルートテーブル (RT) の定義
resource rt 'Microsoft.Network/routeTables@2023-11-01' = {
name: rtName
location: location
properties: {
disableBgpRoutePropagation: false
routes: []
}
}
// 3. 仮想ネットワーク (VNet) の定義
resource vnet 'Microsoft.Network/virtualNetworks@2023-11-01' = {
name: vnetName
location: location
properties: {
addressSpace: {
addressPrefixes: [ vnetAddressPrefix ]
}
subnets: [for subnet in subnetConfigs: {
name: subnet.name
properties: {
addressPrefix: subnet.addressPrefix
// 作成したNSGとRTのIDを各サブネットに紐付け
networkSecurityGroup: { id: nsg.id }
routeTable: { id: rt.id }
}
}]
}
}
main.bicep(メイン)
司令塔となるこのファイルでは、network.bicep モジュールを呼び出します。
具体的なパラメータの値は直接書かず、後述するパラメータファイルから受け取った値をモジュールへ渡す役割を担います。
targetScope = 'resourceGroup'
@description('デプロイ先のリージョン。デフォルトはリソースグループの場所を引き継ぎます。')
param location string = resourceGroup().location
@description('VNetの名称を指定します。')
param vnetName string
@description('VNetのアドレス空間を指定します(例: 10.0.0.0/16)。')
param vnetAddressPrefix string
@description('サブネット構成情報のリストです。')
param subnetConfigs array
@description('共通NSGの名称です。')
param nsgName string
@description('共通ルートテーブルの名称です。')
param rtName string
// ネットワークモジュールの呼び出し
module network './modules/network.bicep' = {
name: 'networkDeployment'
params: {
location: location
vnetName: vnetName
vnetAddressPrefix: vnetAddressPrefix
subnetConfigs: subnetConfigs
nsgName: nsgName
rtName: rtName
}
}
main.bicepparam(パラメータファイル)
環境ごとの設定値(リソース名やIPアドレス範囲など)を記述します。
Bicepのパラメータファイルには、従来の「.json」形式と、新しい「.bicepparam」形式の2種類があります。
公式ドキュメントではどちらの形式もサポートされているため、既存の運用に合わせて選択して問題ありません。
今回は.bicepparamで記述いたします。
using 'main.bicep'
// --- ネットワーク基本設定 ---
param vnetName = 'vnet-test-001'
param vnetAddressPrefix = '10.0.0.0/16'
// --- サブネット定義(同じ役割を担う2つのセグメント) ---
param subnetConfigs = [
{
name: 'snet-test-001'
addressPrefix: '10.0.1.0/24'
}
{
name: 'snet-test-002'
addressPrefix: '10.0.2.0/24'
}
]
// --- 共通リソース設定 ---
param nsgName = 'nsg-test--001'
param rtName = 'rt-test--001'
Bicepの記述に関する詳細な情報は公式サイトに多数掲載されており、以下に一部を抜粋いたします。
デプロイの実行と結果の確認
リソースグループの作成
今回は最も一般的な「リソースグループレベル」でのデプロイを行うため、
デプロイを実行する前に、まずはリソースを格納するための「リソースグループ」をあらかじめ作成します。
# リソースグループの作成
az group create --name [リソースグループ名] --location japaneastBicepファイルのデプロイ
リソースグループが準備できたら、作成した main.bicep を展開します。
パラメータファイルを使用する場合は、コマンドの引数に –parameters を追加します。
# Bicepファイルのデプロイ実行
az deployment group create \
--resource-group [リソースグループ名] \
--template-file main.bicep \
--parameters main.bicepparam実行結果の確認
デプロイ完了後、Azureポータルで対象のリソースグループを確認してみましょう。
画面を確認すると、VNet、NSG、ルートテーブルが1つのリソースグループ内に正しく作成されていることがわかります。
さらにVNetのサブネット設定を開くと、あらかじめ定義した通り、両方のサブネットに同じNSGとルートテーブルが紐づいた状態で出来上がっています。
まとめ
実際にBicepを触ってみて、これまでポータルで一つずつ行っていた作業がコマンド一発で完了する点に、自動化ならではの効率の良さを実感しました。
また、VS Codeの補完機能やAIを活用することで、詳細なリファレンスを読み込まずともスムーズに実装ができました。
IaC化によって管理のしやすさも向上するため、今後は他のリソースも順次コンポーネント化を進めていきたいと考えています。
Bicepに興味がある方は、まずは手近なリソースから触れてみることをおすすめします。




