
皆様、いかがお過ごしでしょうか。
私は以前から Azure の IaC ツールである Bicep についてよく触っているのですが、最近以下のようなことを感じていました。
- 自分が作った Bicep のモジュールを他の人(チーム)に展開したい場合ってどうするの?
- 展開したいけど、バージョン管理ってどうするの?
- Bicep って Java でいう Maven Central Repository、JavaScript でいう npm Registry みたいなパッケージ管理ツールってないの?
- そもそも Bicep ってどういう単位でバージョン管理するのがいいの?
という疑問を持ったわけです。
今回はそんな同じような課題を抱えている方や、Bicep を学んでいる方に対して少しでもお役に立てればと、Bicep のバージョン管理方法について検討していこうと思います。
その前に、Azure の IaC って他に何があるの?そこから知りたい! という方は、以下の記事を出したためこちらもご覧いただけると大変嬉しいです。
先程、Azure の IaC ツールについては私の以前の記事を掲載しましたが、Bicep については本記事でも簡単に紹介しておきます。
Bicep は、ARM Template の後継として Microsoft が提供している新しい DSL(Domain Specific Language)ベースの IaC ツールです。
ARM Template とは異なり、Bicep は JSON ではなく、独自のより簡潔な構文を提供しており、これにより Azure リソースの管理を容易にしています。
Bicep のコードは ARM Template にコンパイルされるため、同様に ARM REST API を通じて Azure リソースに対する操作を行います。
これにより、ARM Template と同等の Azure リソースのサポートと、新サービスや機能の迅速なサポートを実現しています。
本題に入る前に、Bicep にはモジュールという機能があります。
モジュールとは、Bicep ファイルを別の Bicep ファイルから参照し、特定のリソースや構成を再利用するための単位です。モジュール化し、複数回呼び出したり異なるパラメーターを渡したりすることで、基本的なリソース構築のパターンを統一することができます。
例えば、仮想ネットワーク(VNet)を作成する専用のテンプレートをモジュール化すれば、別々のファイルからそのモジュールを呼び出すことで仮想ネットワークを簡単に作成することができ、設定を変更したい時はそのモジュールだけを編集すれば呼び出している全てのファイルに変更を反映できます。
以下のようなフォルダ構成の場合を想定します。
├── main.bicep # メインのBicepファイル
├── vnetModule.bicep # VNet構成用のモジュール
この時、vnetModule.bicep
は以下のような仮想ネットワークを作成する Bicep ファイルです。
vnetModule.bicep
@description('仮想ネットワークのリソース名')
param vnetName string
@description('仮想ネットワークのIPアドレスプレフィックス')
param addressPrefix string
resource vnet 'Microsoft.Network/virtualNetworks@2024-05-01' = {
name: vnetName
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
addressPrefix
]
}
}
}
output vnetId string = vnet.id
main.bicep
ファイルでは、module
と宣言することで先程の vnetModule.bicep
を読み込み、仮想ネットワークを作成することができます。
main.bicep
@description('仮想ネットワークのリソース名')
param vnetName string = 'myVnet'
@description('仮想ネットワークのIPアドレスプレフィックス')
param addressPrefix string = '10.0.0.0/16'
module vnet 'vnetModule.bicep' = { // `vnetModule.bicep` を読み込んで仮想ネットワークを作成する
name: 'vnetDeployment'
params: {
vnetName: vnetName
addressPrefix: addressPrefix
}
}
output vnetId string = vnet.outputs.vnetId
このように、パラメータ(vnetName
, addressPrefix
)を変更するだけで、別々のファイルから仮想ネットワークを作成することができます。
モジュールは他の言語でいう関数のようなもので Bicep コードの再利用性や保守性を高める重要な機能です。
モジュールを効果的に使用することで、複雑な構築プロセスを簡素化し、プロジェクトの一貫性を保つことができます。
それでは本題に移ります。
今回は以下のようなケースを考えます。
- 「A」Git リポジトリで Bicep のモジュール集を作成する
- そのモジュールを他のプロジェクト(以下でいう「B」Git リポジトリ)で使用する
Bicep のモジュール化に記載した通り、Bicep はファイル単位で読み込むことができるため、バージョン管理をする単位として、以下の 2 通りが挙げられます。
バージョン管理単位 | 説明 | バージョン管理方法 |
---|---|---|
リポジトリ単位 |
Git リポジトリ全体でバージョン管理する リポジトリ全体としてバージョンが統一されるが、変更がないファイルも一緒にバージョンが上がってしまう |
Git サブモジュール の機能を利用して他の Git リポジトリに組み込む |
ファイル単位 |
Git リポジトリの各 Bicep ファイルごとにバージョン管理する 各ファイルごとにバージョンを定められるため柔軟ではあるが、どのファイルがどのバージョンなのかという管理が煩雑 |
Azure Container Registry を利用して Bicep ファイルを管理する |
Git サブモジュールを利用し、リポジトリ単位でバージョニングする
この方法は、リポジトリ全体でバージョニングを行い、Git サブモジュールの機能で他のリポジトリに組み込む方法です。イメージは以下のようになります。
以下に詳細な手順を記載します。
まず、B リポジトリを git clone
し、以下のコマンドで A リポジトリをサブモジュールとして追加します。
すると B リポジトリにサブモジュールとして A リポジトリと、 .gitmodules
ファイルが追加されます。
もし Tag でバージョン管理をしている場合は、以下のように .gitmodules
に Tag 名を指定しておくと、現在取り込まれているサブモジュールのバージョンが明確になります。
.gitmodules
[submodule ""]
path =
url =
tag = v1.0.0 # ここに取り込みたいバージョンを記載する
取り込んでいる A リポジトリのバージョンを更新したい場合は、.gitmodules
の tag
を新しいバージョンに変更した上で以下のコマンドを実行します。
Terminal
git submodule update --remote
以上が、リポジトリ単位でバージョン管理する方法となります。
Azure Container Registry を利用し、ファイル単位でバージョニングする
この方法は、ファイル単位でバージョニングを行い、そのファイルを Azure Container Registry に保存しておく方法です。イメージは以下のようになります。
そもそも Azure Container Registry ってコンテナイメージのレジストリだよね?と思う方もいらっしゃるかと思いますが、Bicep ファイルも管理することが可能です。
Azure Container Registry を使用するには、以下のバージョンが必要になりますので、ご注意ください。
- Bicep CLI :0.4.1008 以降
- Azure CLI で使用する場合:2.31.0 以降
- Azure PowerShell で使用する場合:7.0.0 以降
以下に詳細な手順を記載します。私は今回 Azure CLI を使用します。
まず、Azure Container Registry を作成します。料金プランはどれでも構いませんが、プライベートエンドポイントを利用したい場合は Premium である必要があります。
次に、デプロイする Bicep ファイルを用意します。今回は Bicep のモジュール化で用意した vnetModule.bicep
を使用します。
まず、デプロイする前に Azure Container Registry へ認証するために、Azure CLI をログイン状態にしておきます。
次に、以下のコマンドで Bicep ファイルをデプロイします。
Terminal
az bicep publish --file vnetModule.bicep --target br:.azurecr.io/bicep/modules/vnet:
az bicep publish
のリファレンスについては、こちらをご参照ください。
すると、Azure Container Registry に以下のように保存されていることが確認できます。
マニフェストは以下のようになっています。
次に、この保存したモジュールを main.bicep
ファイルから呼び出します。
main.bicep
@description('仮想ネットワークのリソース名')
param vnetName string = 'myVnet'
@description('仮想ネットワークのIPアドレスプレフィックス')
param addressPrefix string = '10.0.0.0/16'
- module vnet 'vnetModule.bicep' = {
+ module vnet 'br:myazurecontainerregisry.azurecr.io/bicep/modules/vnet:v1.0.0' = { // Azure Container Registry の URL にする
name: 'vnetDeployment'
params: {
vnetName: vnetName
addressPrefix: addressPrefix
}
}
output vnetId string = vnet.outputs.vnetId
また余談ですが、もし Bicep のパラメータファイル(.bicepparam
)にこのファイルを指定したい場合は、以下のように using
句でも指定可能です。
main.bicepparam
using 'br:myazurecontainerregisry.azurecr.io/bicep/modules/vnet:v1.0.0'
Bicep のパラメータファイルについてはこちらをご参照ください。
以上が、Azure Container Registry を用いてファイル単位でバージョニングする方法となります。
いかがでしたでしょうか。今回は Bicep のバージョン管理について記事にしてみました。
Bicep には、Maven Central Repository や npm Registry のように公開されているパッケージ管理ツールはないものの、Azure Container Registry を利用すれば、自組織に簡単に Bicep ファイルを配布することができます。
Azure Container Registry を使う場合はタグを打ったら自動的にデプロイされる、といったような CI/CD パイプラインを構築することになりそうですね。
リポジトリ単位でバージョン管理するか、ファイル単位でバージョン管理するかはプロジェクト次第になるとは思いますが、皆様もサブモジュールや Azure Container Registry を利用して、Bicep の共通化を促進していきましょう!
最後まで読んでくださり、ありがとうございました。
Views: 0