💪

Bicep 0.5がリリースされました

2022/04/09に公開

概要

2022/4/9に待望のBicep 0.5が出たので少し使ってみた。今回の注目の更新は、Bicep Public Registry[1]。これを、既存のテンプレートで使ってみる。

現時点で、公開されてるモジュールは、ソースがBicep Registry Modulesにある。まだまだ数が少ないがVNetがあったので、これをazure-bastion01に入れて試してみた。

VNetモジュールに入れかる

変更前、下記ようなbicepでVNetを定義している。

resource vnet 'Microsoft.Network/virtualNetworks@2020-06-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
    subnets: subnets
  }
}

これを、public module の最小限のパラーメータの例、Virtual Networks module(下記)で入れ替える。module のname が被らないように工夫されているなどあるが、ただ入れ替えただけで概ね行けそうな気がする。

module vnet 'br/public:network/virtual-network:1.0' = {
  name: '${uniqueString(deployment().name, 'WestEurope')}-minvnet'
  params: {
    name: virtualNetworkName
    addressPrefixes: [
      '10.0.0.0/16'
    ]
  }
}

これを、bicepに通してみると、早速エラーになった、残念。

$ bicep build ./vnet.bicep
vnet.bicep(10,13) : Error BCP192: Unable to restore the module with reference \
  "br:mcr.microsoft.com/bicep/network/virtual-network:1.0": The module does not exist in the registry.
vnet.bicep(22,26) : Error BCP062: The referenced declaration with name "vnet" is not valid.

エラーは、The module does not exist in the registry。どうやら、レポジトリにモジュールが無いらしいので、mcr に存在するかを確認する。日頃から、この手の問題が起きたときには、Microsoft Container Registry (MCR)に書いてある方法を使って調べている。あまり便利では無いが、まあ事足りる。

まず、そもそもレポジトリに登録されているかを調べる。どうやら登録されているらしい。

curl -s https://mcr.microsoft.com/v2/_catalog | grep bicep
    "bicep/samples/hello-world",
    "bicep/samples/array-loop",
    "bicep/compute/availability-set",
    "bicep/deployment-scripts/import-acr",
    "bicep/network/virtual-network",

そうなると、tagが違うのかもしれないので、タグを見る。1.0というのは無くて、1.0.1になっているのがわかる。

$ curl -s https://mcr.microsoft.com/v2/bicep/network/virtual-network/tags/list
{
  "name": "bicep/network/virtual-network",
  "tags": [
    "1.0.1"
  ]
}

これを使うことにして、モジュールのパスを 'br/public:network/virtual-network:1.0.1' に変更する。subnetの定義を入れると、こんな感じ(下記)になる。

module vnet 'br/public:network/virtual-network:1.0.1' = {
  name: '${uniqueString(deployment().name, location)}-vnet'
  params: {
    name: virtualNetworkName
    location: location
    addressPrefixes: [
      addressPrefix
    ]
    subnets: subnets
  }
}

subnetの定義を合わせる

もう1つ変更がある。このVNetのモジュールでは、subnetで受け付ける形式が、ARM ネイティブと少し違う。もともとは、properties.addressPrefixのようになってた部分を、properties を省略して1つレベルを上げて書く。これは、vnet public module の実装に依存するが、おそらくデザインパターンとして統一しているのでは無いかと思う。このあたりは、未確認。[2]

"name": "subnet",
"properties": {
  "addressPrefix": "10.1.0.0/24",

vnet public moduleの場合

"name": "subnet",
"addressPrefix": "10.1.0.0/24",

こんな感じで修正すればデプロイできる。

最後に

ちょっとドキュメントの更新が追いついていないのか初見殺しの部分があるが、VSCodeのプラグインでレポジトリのブラウズができるようにするなどの工夫で十分使えるようなりそうに思う。まだモジュールの数が少ないので、もっと増えるのを期待している。それまでは、Common Azure Resource Modules Libraryを有効利用することになるだろう。
オレオレdevcontainer0.5.6に更新した。

脚注
  1. Public module registryの公式ドキュメントは、docs.microsoft.com/Public module registry にある。 GitHub Bicep #62 とか GitHub Bicep #2128 あたりも参考になると思う。 ↩︎

  2. propertiesの中に入っているのを、フラット化(上に上げる?)話は、このあたりでディスカッションされてるようだ。 GitHub Bicep #2052 当然のように「名前がぶつかることがあるよね」って話が出ている。 ↩︎

GitHubで編集を提案

Discussion