【Bicep 入門 #11】Bicep で仮想マシンを作成する

この記事の内容

  • Azure Template Explorer を活用して VM 作成に必要なリソース構成を把握する方法を解説します
  • ストレージアカウント・NSG・NIC など VM に付随する各リソースを Bicep で定義していきます
  • 仮想マシンリソースのプロパティ(ハードウェア・OS・ストレージ・ネットワークプロファイル)の書き方を学びます
  • パラメーターを活用してテンプレートを再利用しやすい構成にする方法を紹介します
  • CI/CD パイプラインを使って Azure へデプロイし、動作確認するところまで実演します

VM 作成で必要なリソースを把握する

仮想マシン(VM)を Bicep で作成しようとすると、VM 本体だけでなく多くの関連リソースが必要になります。実際に既存の VM を Azure Portal で確認すると、ハードウェアプロファイル・OS プロファイル・OS ディスクなど、さまざまなプロパティが必要であることがわかります。

いきなりすべてを自分で書くのはハードルが高いため、今回は「Azure Template Explorer」を活用してクイックスタートテンプレートを参照しながら記述していく方針をとります。


Azure Template Explorer でテンプレートを探す

Azure Template Explorer は、Microsoft が公開しているクイックスタートテンプレートをフィルタリングして検索できるサービスです。VS Code の拡張機能として利用でき、Virtual Machine などのキーワードで絞り込むと、VM を含む多数のテンプレートが見つかります。

今回はシンプルな Windows VM を 1 台デプロイするテンプレート(simple-windows-vm 相当)を参照します。該当テンプレートの main.bicep を開き、必要なリソース定義を確認しながら自分のテンプレートに反映させていきます。


ストレージアカウントの定義

VM の診断設定(Boot Diagnostics)に使用するストレージアカウントを定義します。アカウント名はパラメーターとして受け取る形にします。

param storageAccountName string

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: storageAccountName
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
}

SKU は Standard_LRS、ロケーションはリソースグループのロケーションに合わせます。


Network Security Group(NSG)の定義

仮想ネットワークにサブネットを作成する際、NSG は実質的に必須となります。名前をパラメーター化して受け取ります。

param nsgName string

resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2021-02-01' = {
  name: nsgName
  location: resourceGroup().location
  properties: {}
}

仮想マシンリソースの定義

VM リソースは、大きく以下の 4 つのプロファイルで構成されます。

ハードウェアプロファイル

VM のサイズを指定します。既定値を設定しておき、パラメーターで上書きできる形にします。

param vmSize string = 'Standard_D2s_v3'

hardwareProfile: {
  vmSize: vmSize
}

OS プロファイル

管理者ユーザー名とパスワードを設定します。パスワードは @secure() デコレーターを付けたパラメーターとして受け取ることで、ログ等に平文で出力されないようにします。

@secure()
param adminPassword string
param adminUsername string

osProfile: {
  computerName: vmName
  adminUsername: adminUsername
  adminPassword: adminPassword
}

注意: パスワードをパラメーターで直接渡す方法はデモ用途に限られます。本番環境では Azure Key Vault と連携してシークレットを取得する構成を推奨します。

ストレージプロファイル

OS ディスクのイメージとディスクタイプを指定します。OS バージョンはパラメーターで受け取り、既定値を設定しておきます。

param osVersion string = '2019-Datacenter'

storageProfile: {
  imageReference: {
    publisher: 'MicrosoftWindowsServer'
    offer: 'WindowsServer'
    sku: osVersion
    version: 'latest'
  }
  osDisk: {
    createOption: 'FromImage'
    managedDisk: {
      storageAccountType: 'StandardSSD_LRS'
    }
  }
}

ネットワークプロファイル

あらかじめ作成済みのネットワークインターフェイス(NIC)の ID を参照します。Bicep のシンボリック参照を使うことで、NIC リソースの ID を簡潔に取得できます。

networkProfile: {
  networkInterfaces: [
    {
      id: nic.id
    }
  ]
}

診断プロファイル

Boot Diagnostics を有効にし、先ほど作成したストレージアカウントを指定します。

diagnosticsProfile: {
  bootDiagnostics: {
    enabled: true
    storageUri: storageAccount.properties.primaryEndpoints.blob
  }
}

CI/CD パイプラインでのデプロイ

今回は前回構築した CI/CD パイプラインを活用してデプロイを行います。コードをコミットしてリポジトリにプッシュすると、パイプラインが自動でキックされ Azure へのデプロイが実行されます。

ggiittcpoumsmhit-m"AddVMandrelatedresources"

デプロイが完了すると、Azure Portal のリソースグループに以下のリソースが作成されていることが確認できます。

  • 仮想マシン
  • 仮想ネットワーク
  • ネットワークインターフェイス(NIC)
  • パブリック IP アドレス
  • Network Security Group
  • ストレージアカウント

デプロイ結果の確認

Azure Portal から対象のリソースグループを確認すると、VM が「実行中」の状態になっていることが確認できます。OS ディスクも指定したイメージから正常に作成されています。

なお、今回はプライベート IP のみの構成(パブリック IP は別途作成済みの構成)のため、直接 RDP 接続を行うには踏み台サーバーや VPN が必要になります。


まとめ

今回は Bicep を使って仮想マシンとその関連リソースを一括デプロイする方法を解説しました。

  • VM 作成には多くの関連リソース(NSG・NIC・ストレージ等)が必要なため、Azure Template Explorer でクイックスタートテンプレートを参照しながら作業を進めるのが効率的です
  • VM リソースは ハードウェア・OS・ストレージ・ネットワークの 4 つのプロファイルで構成されます
  • パスワードなどの機密情報は @secure() パラメーターで受け取り、本番環境では Key Vault と連携することを検討してください
  • CI/CD パイプラインと組み合わせることで、コミットするだけで自動デプロイされる開発環境を構築できます

次のステップとして、パスワードを Key Vault から安全に取得する構成や、複数環境へのデプロイ分岐なども検討してみましょう。