Bicepとは?
- Azure の IaC を実現するための基本的な仕組みとして ARM テンプレート があります。
- その ARM テンプレート をよりお手軽に書けるようにと 策定された構文が Bicep です。
- ARMテンプレートは Azureポータルで出力されるようなものだと、あっという間に数千行を超える・・・などザラなので、それがより少ない行数で書けるのはありがたい…です。
- Bicep は Azure CLI などから そのまま指定してデプロイができるようです(= ARMテンプレートと同様にそのまま使える)
- ただし ARM → Bicep への変換(デコンパイル)は完全なもの… にならない可能性あるので要注意です。
- Bicep への ARM テンプレート JSON の逆コンパイル
準備
- 今回は確認のため、Azure CLI を使ったシンプルな準備となります。
- Azure CLI をインストール
az login
を実行しログインしておく- Bicep を書いてみる
- 以下のコマンドを実行
- パラメータをプロンプトで逐一入力
az deployment group create --resource-group <デプロイ先のリソースグループ名> --template-file <ファイル名>
- パラメータをJSONファイルで指定する場合
az deployment group create --resource-group <デプロイ先のリソースグループ名> --template-file <ファイル名> --parameters <ファイル名>
- パラメータをプロンプトで逐一入力
Bicepを書いてみる
基本は Bicep プラグインを使う
- あらかじめ VSCode にて Bicepプラグイン をインストールしておきます。
- これで Bicep のインテリセンス や lint が効くようになるため、非常に便利です!
例えば res-
と入力すると、Azureの各リソースデプロイに必要なスニペット一覧が表示されます
VNet を 払いだすために res-vnet
のスニペットを呼び出すと
上記のように、VNetを払い出すために必要となる Bicep のスニペットが挿入されます。
スニペットをいじってみる
- スニペットはイイ感じに「次に何をすればいいか」が分かるようなものでした。
- その状態から少し 公式のドキュメント を漁りつつ、いじってみます。
- スニペットから必要な部分だけを抽出しつつ、なるべく色々な要素を盛り込もうとし、結果的に以下のようなコードとなりました
// 各リソースのベースとなる名称
param baseName string
@allowed(['japaneast', 'japanwest'])
@description('ロケーションを選択してください(東日本/西日本で限定)')
param location string
@description('アドレスプレフィックスを入力してください。カンマ区切りで複数入力できます(例: 10.0.0.0/16,10.1.0.0/16)')
param addressPrefixStr string
// NOTE: 組織・部門によって決定、任意に部門名を追加
@description('部門名を選択してください')
@allowed(['', 'tech-dep-01', 'cloud-dep-02', 'solution-dep'])
param sectionName string
@description('環境名(開発(dev)・本番疑似(stg)・本番(prod))を選択してください')
@allowed(['dev', 'stg', 'prod'])
param envName string
// リソース名に付与するプレフィックス(組織のルールに従って決める)
var prefix = '${sectionName != '' ? '${sectionName}-' : ''}${envName}-${baseName}'
// VNetの作成
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2019-11-01' = {
name: '${prefix}-vnet'
location: location
properties: {
addressSpace: {
// NOTE: JavaScript 由来の関数が使用可能
addressPrefixes: split(addressPrefixStr, ',')
}
subnets: []
}
}
デプロイしてみる
以下のコマンドを実行し、デプロイをしてみます。
az deployment group create --resource-group <デプロイ先のリソースグループ名> --template-file <ファイル名>
今回はパラメータをファイルとして指定しないため、以下のように問われますので、値を入力していきます
ちなみに @description
デコレータによる説明は、以下のように パラメータ入力で ?
を入力した際に表示されますので、きちんと定義しておくと親切かと思います。
デプロイが完了すると、生成されたリソースをあらわす JSON がコンソールに出力されるので、Azureポータルから、生成された VNet を見てみます。
- プレフィックス設定も正常に反映された状態でデプロイできたようです!
所感
- 従来の ARM テンプレートに比べ、格段に書きやすくなっています。
- JavaScript 由来の構文とみられるため、比較的取っつきやすく、リソース払い出し自動化のハードルもだいぶ下がったのではないか…?と思います。
- 関数、変数、デコレータ、コメント、制御構文、便利な演算子… などなど、使えるだけでだいぶラクな印象…!
- ただし 既に ARM テンプレート が山ほどあり、そこから移行する・・・となるとちょっとコストが高そうです・・・
- 新規で IaC を始めるなら Bicep から始めたほうが良さそうです!