Azure Bicepを用いたネットワーク構築の実践

本記事では、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 japaneast

Bicepファイルのデプロイ

リソースグループが準備できたら、作成した 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に興味がある方は、まずは手近なリソースから触れてみることをおすすめします。

著者について

入社4年目です。
現在、AWSやGoogle Cloudを用いたインフラ構築業務に取り組みながら、日々勉強中です。

s.e.をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(Azure)は、Azureを最大限活用するためのオールインワンサービスです。40年以上の様々なシステム構築・運用実績で得た業界理解と、Azure構築ナレッジを強みに、クラウドへの移行から運用までトータルでサポートし、お客様のAzure活用を実現します。

Azureクラウド
シェアする
タイトルとURLをコピーしました