Common Azure Resource Modules Libraryを使って更にカンタンにinfrastructure as codeを推し進めてみる

目次

はじめに

Azure Resource Manager Template(ARM Template)をより書きやすくするアプローチとしてBicepがありますが、このBicepもモジュール化機能を利用してAzureの個々のリソース毎の汎用モジュールが開発中でした。

Common Azure Resource Modules Library

これはなにか

Wikiのページを軽く読みましたが、誤解を恐れずにこのCommon Azure Resource Modules Library(以下ResourceModules)を説明すると

  • 再利用可能なbicepのモジュールライブラリ
  • ローカルデプロイの他、(Bicepの機能で)Azure Container RegistryやAzure Resource Manager Template Spec上にモジュールライブラリ一式を置いてデプロイ可能
  • 全てのリソースに現状対応しているわけではない (Available Resource Modules)

といった感じです(もっといろいろ書いてありますが)

とりあえず使ってみる

wikiのOrchestrate deploymentの章にはとりあえずACRとTemplate Specにあるモジュールライブラリを利用して、「リソースグループ」「Network Security Group」「Virtual Network」をデプロイするサンプルがあったのでそれをベースに仮想マシンをデプロイするモジュールを追加してみます。

ResourceModulesはgit cloneでローカルにコピーしてきて、まずはローカル環境からのデプロイです。

実際に作ったmain.bicepは以下に公開しました。

https://github.com/katakura/bicep-resource-modules-sample

見ていただくと判るのですが、呼び出したいモジュール(Azureリソース)のdeploy.bicepを指定して、そのモジュールの呼び出しに必要なパラメータを設定しているだけです。

パラメータがシンプルなものであれば、直接string型などで値を渡せますが、Virtual NetworkのSubnetだったり、Virtual Machineに必要なNICや、NIC内のipconfigなど複数指定可能なものは、配列でオブジェクトを渡す必要があり、やっぱりそこは変わることはないんだなぁという印象。

以下はVirtual Machineを作成するところの抜粋です。

// Virtual Machine
module vm '../ResourceModules/arm/Microsoft.Compute/virtualMachines/deploy.bicep' = {
  name: 'module_vm'
  scope: resourceGroup(resourceGroupName)
  params: {
    name: vmName
    adminUsername: adminUsername
    adminPassword: adminPassword
    vmSize: 'Standard_B2s'
    osType: 'Linux'
    imageReference: {
      publisher: 'Canonical'
      offer: '0001-com-ubuntu-server-focal'
      sku: '20_04-lts'
      version: 'latest'
    }
    nicConfigurations: [
      {
        nsgId: nsg.outputs.networkSecurityGroupResourceId
        nicSuffix: '-nic01'
        ipConfigurations: [
          {
            name: 'ipconfig01'
            subnetId: vnet.outputs.subnetResourceIds[0]
            pipConfiguration: {
              publicIpNameSuffix: '-pip01'
              skuName: 'Basic'
            }
          }
        ]
      }
    ]
    osDisk: {
      createOption: 'fromImage'
      diskSizeGB: 30
      managedDisk: {
        storageAccountType: 'StandardSSD_LRS'
      }
    }
  }
}

全てVMを作成する為には必要最低限のパラメータで済んでいます。そこはうれしいのですが、「nicConfigurations」やその中の「ipConfigurations」「pipConfiguration」の構造把握のためには、個々のモジュールライブラリ内のreadme.mdを読み、それでも不明な場合は実際のdeploy.bicepファイル内を確認する必要がありました。無論ドキュメントが充実してくれば解決する話だとは思います。

Public IPはVMの前に作る必要があるのかな?と最初思っていたのですが、nicConfigurations[].ipConfigurations[].pipConfiguration.publicIpNameSuffixがパラメータに指定されていると、モジュールライブラリ内にて自動で指定したサフィックスで作成してくれました。ここは便利だと思います。

おわりに

もう少し使ってみないとわかりませんが、ファーストインプレッションとしては前述の感想でした。

サンプルコードが充実してくれば、よいですねぇ。