Bicep をやってみた
前説
これまでAzureポータルから画面ポチポチでリソースを作ってきた人間が、Bicep という IaC を使って初めてリソースをデプロイする話。
1.Bicep のインストール
インストールするには Azure CLI が必要らしい。
このパソコン、az のバージョンいくつだっけなーと思ったら入ってすらなかったのでインストール。

インストールの仕方は下記 Docs に書いてある。
WindowsにAzure CLIをインストールする | Microsoft Learn
インストール方法は4種類あるが、今回は PowerShell でインストール。

PowerShell(管理者)を起動し、書いてあるコマンドを丸パクリして実行。

で、Bicep をインストール。
az bicep install

あっさり完了した。
2.VSC に拡張機能を入れる
Visual Studio Code (VSC) に Bicep の拡張機能が入れられるらしいので入れてみる。
これかな?Bicepで検索したらすぐに出てくる。

3.Bicep ファイルの準備
次に適当なフォルダを作って「main.bicep」というファイルを作る。

するとこんな感じの画面になるので、「vnet」と入れてみる。

おっ、どうやら vnet と名の付くリソースの候補が出てくるようだ。
試しに「res-vnet」を選んでみる。

どうやら仮想ネットワークのテンプレートが出てくるらしい。すげー!
このファイルを使って試しに仮想ネットワークをデプロイしてみることにする。
name は仮想ネットワークの名前。’name’ はどうかと思うので ‘yk-vnet’ に変更。
location は赤線で構文エラーになっていたので、resourceGroup().location に変更。これでリソースグループと同じリージョンにデプロイしてくれる。

編集したら保存しておく。
※保存せず空ファイルのままデプロイしちゃったら、エラーはなく「Successded」と表示されるが何も作られてなかった。一見、成功したように見えるので紛らわしい。
4.Bicep でデプロイ
まずは az login で Azure にサインイン。
az login

Microsoft へのサインイン画面が出るので、サブスクの所有者権限を持っているアカウントでサインイン。

サブスクは1個しか持ってないので「1」しか出てこない。どの番号のサブスク&テナントを選ぶか聞いてくるので「1」を指定。
次にデプロイ先のリソースグループ「yk-bicep」を Azure ポータルで作っておき、main.bicep ファイルがあるフォルダに移動して下記でデプロイ。
az deployment group create --resource-group yk-bicep --template-file main.bicep

実行結果はこんな感じ。

するとあ~らびっくり!仮想ネットワークができました。

ちゃんとサブネットもできてます。

5.コマンド補足
az deployment group create --resource-group yk-bicep --template-file main.bicep
「group」ってリソースグループって意味だろうけど、次に create ってついているから一見「リソースグループを作るの?」って思ったけど、ここの部分は違う意味だった。
Copilot 君に聞いてみた。


ふむふむ。ここのパラメータは「今作ろうとしているもの」の「1つ上の階層」を指定するようだ。
- 「リソース」を作るときは「リソースグループ(group)」を指定。
- 「リソースグループ」を作るときは「サブスクリプション(sub)」を指定。
- 「サブスクまたぎの設定」を作るときは「管理グループ(mg)」を指定。
6.既存リソースのエクスポート
Azure ポータルの「テンプレートのエクスポート」から既存リソースの Bicep をエクスポートできる。

デプロイしたときの main.bicep と比較してみた。
明らかにエクスポートした Bicep ファイルの方がボリュームが多い。

何が増えているのかを Copilot 君に聞いてみた。
1.API バージョンが違う。
エクスポートは 常に最新に近い API を使う。インポートは自分の API バージョン を使う。
- インポート:Microsoft.Network/virtualNetworks@2019-11-01
- エクスポート:Microsoft.Network/virtualNetworks@2025-05-01
2.「省略できるデフォルト値」が全部展開される。
Azure 内部では 明示されていない設定も実際には存在し、エクスポートすると現在値をすべて吐き出す。
3.リソースの親子関係まで書かれている
「仮想ネットワーク」と「サブネット」。実は ARM 内部では「サブネット」は独立した仮想ネットワークの「子リソース」。
エクスポートすると、その親子関係も完全明示される。人が読む Bicep としてはいらない過剰な情報。
4.id や dependsOn が増える
デプロイ順序を100%保障するために明示される。人が読む Bicep としてはいらない過剰な情報。
補足:location が固定値
location を resourceGroup().location にした部分は実際のリージョン「japaneast」になる。

