【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 へのデプロイが実行されます。
デプロイが完了すると、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 から安全に取得する構成や、複数環境へのデプロイ分岐なども検討してみましょう。