Bicep触ってみる3(パラメータファイル)


パラメータを渡したい

前回は「リソースグループを作成し、そのリソースグループの中に仮想ネットワークを作成する」コードを作成したが、仮想ネットワークのIPアドレス範囲が固定のため、リソースグループ間の仮想ネットワークがピアリングできないという警告が出ていた。
開発環境などの作成であればネットワークは分離していてもよいので問題はないが、他のリソースを作ることも考えるとこのような値はデプロイのたびに変更できることが望ましいと思われる。
もちろんBicepでもパラメータ化は対応しているし、これを外部ファイルにまとめてデプロイ時に渡すこともできる。今回はこれをやっていく。

パラメータの書き方

パラメータはparamの後に名前と型と値を設定するだけ。型だけ少し取っつきにくいかもしれないが、string(文字列)、int(整数)、bool(true/false)ぐらいは頑張って覚えよう。そもそもサポートされている型も少ない(少数とかもない)し、だいたいの言語で書式は違えど似た概念なので一度覚えるとずっと役に立つ。

VNETの設定をパラメータにする

パラメータは実は既にリージョンで使っている。
3行目のlocationがパラメータ名(実線部)、stringが型(点線部)、'japaneast'が値(破線部)となる。値については外部からパラメータが渡されなかった場合に設定される既定値なのでなくてもよい(その場合は等号も不要)
パラメータは水色のハイライト、文字列はオレンジ色のハイライトになっていることに注意。パラメータを使う箇所(7行目)では同じ色になるように記載する。

noteのコードだと上手くハイライトしてくれないので画像です

設定ごとに適当な名前を付けてパラメータにする。個人的には少々長くても中身や参照先が分かる名前にすることが多い。元の値を一応既定値に設定しておくが、それは好みで。
vnet.bicepを書き換えたものの一部が下記。まだデプロイ試してないけどリンターに怒られてないからたぶん大丈夫。

targetScope = 'resourceGroup'

// リージョン
param location string = 'japaneast'

// ハブVNETのパラメータ
param hubvnetIpAddressPrefixes string = '172.16.0.0/16'
param hubStepSubnetIpAddressPrefix string = '172.16.0.0/24'
param hubBastionSubnetIpAddressPrefix string = '172.16.1.0/24'
param hubGatewaySubnetIpAddressPrefix string = '172.16.2.0/24'

// スポークVNET1のパラメータ
param spokevnet01IpAddressPrefixes string = '172.17.0.0/16'
param spoke1WebappSubnetIpAddressPrefix string = '172.17.0.0/24'



resource hubvnet 'Microsoft.Network/virtualNetworks@2021-01-01' = {
  name: 'vnet-hub-01'
  location: location // こことか
  properties: {
    addressSpace: {
      addressPrefixes: [
        hubvnetIpAddressPrefixes // ここで
      ]
    }
    subnets: [
      {
        name: 'snet-step-01'
        properties: {
          addressPrefix: hubStepSubnetIpAddressPrefix // パラメータを
        }
      }
      {
        name: 'AzureBastionSubnet'
        properties: {
          addressPrefix: hubBastionSubnetIpAddressPrefix // 参照して
        }
      }
      {
        name: 'GatewaySubnet'
        properties: {
          addressPrefix: hubGatewaySubnetIpAddressPrefix // いるよ
        }
      }      
    ]
  }
}

// 以下略

パラメータファイルを作る

パラメータにするとデプロイ時に渡すことができるが、パラメータが多いと全部渡すのは大変だ、ということで渡す際にはパラメータファイルというパラメータの値が列挙されたファイルで渡す。
これは一から書いてもいいんだけど、VS CodeのBicep拡張でも作成できる。

bicepファイル上で右クリック>Generate Parameters Fileを選択

拡張子を選択する。jsonはARMテンプレート用なので必ずbicepparamを選ぶこと。

Bicepファイルからjsonのパラメータファイル作ることある?

パラメータファイルに転記されるパラメータを選択する。
requiredonlyは既定値が設定されておらずデプロイ時に必須(required)のパラメータのみ。
allはパラメータ全部。
色々と既定値を設定しているので、allを選択する。

requiredonlyを選ぶとほぼ空のファイルになってしまう

上記を指定すると「vnet.bicepparam」ファイルが作られる。既定値もそのまま持ってきてくれるのでこれで完成。
値を変えたければデプロイ前にこちらを変更する。

デプロイしてみる

デプロイごとに値が変更できることを確認するため、172.16.0.0/15を使っていたのを10.16.0.0/15に変更する。

using './vnet.bicep'

param location = 'japaneast'
param hubvnetIpAddressPrefixes = '10.16.0.0/16'
param hubStepSubnetIpAddressPrefix = '10.16.0.0/24'
param hubBastionSubnetIpAddressPrefix = '10.16.1.0/24'
param hubGatewaySubnetIpAddressPrefix = '10.16.2.0/24'
param spokevnet01IpAddressPrefixes = '10.17.0.0/16'
param spoke1WebappSubnetIpAddressPrefix = '10.17.0.0/24'

vnet.bicepに戻り、右クリック>Deploy Bicep File…で新規リソースグループを作りつつデプロイする(vnet名などが被っているので同じリソースグループにはデプロイできないよ)
最後にパラメータファイル指定でvnet.bicepparamを選択する。

実はキャプチャ撮り直した

ポータルで確認する。

リソースグループ問題なし
仮想ネットワーク問題なし
アドレス空間がちゃんと変わっている

問題ないですね。

まとめ

設定値をパラメータとして定義し、デプロイ時にパラメータファイルを渡すことでデプロイごとに値を変更したリソースを作成することができた。

課題

main.bicepからモジュールとしてvnet.bicepを呼び出す際にvnet.bicepparamを渡したいんだけど、ドキュメントのどこを見ても渡し方が書いていない。
loadTextContentとかでbicepparamファイルを読み込んでむにゃむにゃすればできるのかもしれないけれど、今回は断念。
おそらくmain.bicepの方にも同様のパラメータとして定義してmain.bicepparamから渡してやればいいんだろうけど、モジュールが増えてきた時に管理が大変そうだなぁと思う。
この辺りの深掘りはまた今度(ちゃんとやったらQiitaに書くかも)

コード

vnet.bicep

targetScope = 'resourceGroup'

// リージョン
param location string = 'japaneast'

// ハブVNETのパラメータ
param hubvnetIpAddressPrefixes string = '172.16.0.0/16'
param hubStepSubnetIpAddressPrefix string = '172.16.0.0/24'
param hubBastionSubnetIpAddressPrefix string = '172.16.1.0/24'
param hubGatewaySubnetIpAddressPrefix string = '172.16.2.0/24'

// スポークVNET1のパラメータ
param spokevnet01IpAddressPrefixes string = '172.17.0.0/16'
param spoke1WebappSubnetIpAddressPrefix string = '172.17.0.0/24'



resource hubvnet 'Microsoft.Network/virtualNetworks@2021-01-01' = {
  name: 'vnet-hub-01'
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        hubvnetIpAddressPrefixes
      ]
    }
    subnets: [
      {
        name: 'snet-step-01'
        properties: {
          addressPrefix: hubStepSubnetIpAddressPrefix
        }
      }
      {
        name: 'AzureBastionSubnet'
        properties: {
          addressPrefix: hubBastionSubnetIpAddressPrefix
        }
      }
      {
        name: 'GatewaySubnet'
        properties: {
          addressPrefix: hubGatewaySubnetIpAddressPrefix
        }
      }      
    ]
  }
}

resource spokevnet01 'Microsoft.Network/virtualNetworks@2021-01-01' = {
  name: 'vnet-spoke-01'
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        spokevnet01IpAddressPrefixes
      ]
    }
    subnets: [
      {
        name: 'snet-webapp-01'
        properties: {
          addressPrefix: spoke1WebappSubnetIpAddressPrefix
        }
      }
    ]
  }
}

resource peer_hub2spoke 'Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2021-01-01' = {
  name: 'peer_hub2spoke'
  parent: hubvnet
  properties: {
    allowVirtualNetworkAccess: true
    allowForwardedTraffic: true
    allowGatewayTransit: false
    useRemoteGateways: false
    remoteVirtualNetwork: {
      id: spokevnet01.id
    }
  }
}

resource peer_spoke2hub 'Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2021-01-01' = {
  name: 'peer_spoke2hub'
  parent: spokevnet01
  properties: {
    allowVirtualNetworkAccess: true
    allowForwardedTraffic: true
    allowGatewayTransit: false
    useRemoteGateways: false
    remoteVirtualNetwork: {
      id: hubvnet.id
    }
  }
}

vnet.bicepparam

using './vnet.bicep'

param location = 'japaneast'
param hubvnetIpAddressPrefixes = '10.16.0.0/16'
param hubStepSubnetIpAddressPrefix = '10.16.0.0/24'
param hubBastionSubnetIpAddressPrefix = '10.16.1.0/24'
param hubGatewaySubnetIpAddressPrefix = '10.16.2.0/24'
param spokevnet01IpAddressPrefixes = '10.17.0.0/16'
param spoke1WebappSubnetIpAddressPrefix = '10.17.0.0/24'

おまけ

今回触ってみたbicepだが、実はいくつかのリソースのものはモジュールとして公開されている。Terraformと比べても種類は少ないが、公式でも数が少ない点は自覚しているようで、Bicep使ってる人が少ないというのが現状のようだ。

なお、今回作成した仮想ネットワークについては公開済みで、ピアリングだけでなくリソースロックや診断設定、RBACなども設定できるようになっているので興味があれば参考にしてほしい。

https://github.com/Azure/bicep-registry-modules/tree/main/modules/network/virtual-network

この記事が参加している募集

最近の学び

この記事が気に入ったらサポートをしてみませんか?