こんにちは。今回初めてAzureを触った薮谷です。AWS CloudFormationを利用してAWSのリソースをIaCで構築したことはありましたが、AzureのリソースをIaCで構築したのは初めてでした。
同じOSイメージを使用しAzureVMを複数たてるために、Bicepファイルを使用し、IaCで自動展開することで、設定漏れをなくし、手動で1つずつVMを作成するよりも作業時間を短縮することができます。
AzureはAWSと違い参考になる記事が少なく、経験年数の少ない自分は周りの優秀な先輩に不明点を聞きながら構築を行いました。
Microsoft公式ページにもBicepを使用したVMのIaC構築のやり方は記載がありますが、Azure初心者がこんな感じで構築を行ったというのが別のAzure初心者の方の参考に少しでもなればうれしいです。
はじめに
今回は以下の構成を実現します。
リソースグループ/VNET/サブネットは手動で予め作成した上で、同じOSイメージを使用したVM1[yabu-vm-1]とVM2[yabu-vm-2]をBicepファイルを使い、デプロイします。
OSはWindows11を使用し、グループポリシーや言語設定などがVM1とVM2にも引き継がれていることがゴールとなります。
1.Bicep拡張機能のインストール
IaCのテキストエディタとしてVisual Studioコードを使用します。
未インストールの場合はこちらからインストールしてください。
Visual Studioコードをインストール済の場合は以下➀~④のソフトウェアをインストールしてください。
➀AzureCLI
Bicep の開発およびデプロイ環境のセットアップ – Azure Resource Manager | Microsoft Learn
②Bicep(Bicepコードが正しく作成されていることを検証できる便利ツール)
Bicep – Visual Studio Marketplace
③Japanese Language Pack for Visual Studio Code(コメントアウトに日本語を利用できるようになる)
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja
④Azure Account(これがないとコードをデプロイできない)
Azure Account – Visual Studio Marketplace
2.マスターVMの作成(イメージ準備)
マスターVMを手動で作成します。
今回上の図で作成するVM1とVM2のイメージを作成するためにマスターVM(vm-master)を1台作成しますが、こちらのマスターVMは一般化(※後述の手順で説明します)すると起動できなくなってしまいます。
以下に今回行う設定を記述しますが、要件にあった設定を各々行ってください。
※赤字の設定は同じ設定を行ってください。
VMの手動作成方法が不明の場合はこちらを参考に実施してください。
クイック スタート – Azure Portal で Windows VM を作成する – Azure Virtual Machines | Microsoft Learn
[基本]タブの設定箇所
➀仮想マシン名:vm-master(マスターVM名、命名は適当で大丈夫です)
②セキュリティの種類:Standard(こちらを選択しないと今回の手順ではイメージ作成ができなくなります。)
イメージ:Windows 11 Pro, version 23H2 – x64 Gen2
③ユーザ名、パスワード名:任意の値を設定します
[ネットワーク]タブの設定箇所
仮想ネットワーク:作成済の「vnet-yabutani(10.101.0.0/24)」を選択
サブネット:WindowsVMSubnet(今回は10.101.0.0/25のIPで事前作成済)を選択
今回他に設定したい箇所はないので最下部の、「確認および作成」を選択します。
検証に成功しました、の表示を確認し「作成」を選択します。
3.マスターVMのOS設定
Bastionの作成
➀OSログインのためにBastion経由で接続できるようにします。
作成したマスターVM「vm-master」に移動し、「Bastion」を選択します。
②「Bastionのデプロイ」を選択します。
※時間がかかります。数分ほどお待ちください。
Bastionですが使用していなくても1時間あたり課金されてしまうので使用後は削除するのを忘れないでください。
Azure Bastion Basicでも1時間あたり30円課金されてしまうので、注意。
※画像は2024年7月31日時点のものです。最新の情報は下記URLからご確認ください。
価格 – Azure Bastion | Microsoft Azure
③VMの作成時、[基本]タブの設定箇所-③で設定したユーザ名/パスワードを入力し、「接続」を選択します。
④OSログインでき、Windowsのデスクトップ画面が表示されます。
OS設定
今回設定する箇所として、以下3点とします。
・タイムゾーン
・言語設定
・グループポリシー
➀タイムゾーン
[Setting]-[Time&Language]-[Date&time]-[Time zone]へ移動し、「(UTC+09:00)Osaka,Sapporo,Tokyo)」を選択する。
②言語設定
[Setting]-[Time&Language]-[Language&region]へ移動し、「Add a language」を選択する。
検索窓に’ja’と入力すると「日本語」が表示されるので、選択し「Next」を選択する。
[Optional language features]で以下を選択し、「Install」を選択する。
・Language pack(言語パック)
・Text-to-speech(基本の入力)
※ダウンロードが完了するまで数分かかります。
[Setting]-[Time&Language]-[Language&region]へ移動し、[Windows diaplay language]を「日本語」へ変更する。
③グループポリシー
[Local Group Policy Editor(ローカルグループポリシーエディター) ]-[Windows Settings(Windowsの設定)]-[Security Settings(セキュリティの設定)]-[Account Policies(アカウントポリシー)]-[Password Policies(パスワードのポリシー)]へ移動し、以下の要件へ変更する。
・Minumum password length(パスワードの長さ):8
・Minumum password length audit(パスワードの最小文字数の監査):10
➀~③の設定が完了した後再起動し、設定が反映されていることを必ず確認してください。
4.マスターVMのSysprep
Sysprep(OSの操作)
PCそれぞれに割り振られる固有情報を削除し、複数のPCに対して一貫したデータ展開を可能にするためSysprepを行います。
エクスプローラーの「C:\Windows\System32\Sysprep」に移動し、「Sysprep」をダブルクリックします。
シャットダウンオプションにて「シャットダウン」を選択し、「OK」を選択します。
PCの接続が切断されます。
Sysprep(Azureコンソールの操作)
CloudshellからVMを一般化します。
Cloudshellを使用するにはストレージアカウントが必要なので、使用できるストレージアカウントがない場合は以下を参考に作成してください。
永続的なストレージを使った Azure Cloud Shell の概要 | Microsoft Learn
以降、既にストレージアカウントを作成済の前提で手順を記載します。
➀コンソール右上の>_のようなマークがCloudshellのターミナルになります。クリックしてCloudshellのターミナルを開いてください。
②「切り替え先PowerShell」を選択し、BashからPowerShellに切り替えます。
③PowerShellのターミナルが立ち上がります。少し経つとプロンプトがかえってくるので、以下の一般化コマンドを実行します。
>>Set-AzVm -ResourceGroupName “リソースグループ名” -Name “先ほどSysprepしたVM名” -Generalized
成功するとStatus:Succeededと応答が返ってきます。
④「最新の状態に更新」をクリックすると、マスターVMが開始できなくなります。
イメージ作成
起動できなくなったマスターVMからイメージを作成します。
➀[キャプチャ]-[イメージ]を選択します。
②「Azure コンピューティング ギャラリーにイメージを共有する」を「いいえ、マネージド イメージのみをキャプチャします。」の項目に変更して「確認および作成」を選択します。
③「検証に成功しました」と表示されたことを確認し「作成」を選択します。
④通知に「仮想マシンが一般化されました」という表示がされます。これで一般化が完了したことがわかります。
「リソースに移動」を選択します。
⑤[設定]-[プロパティ]に移動し、「リソースID」をコピーします。
こちらでコピーしたリソースIDを使用し、この後イメージをBicepで展開していきます。
5.Bicepファイルを使用したVMの展開※対象:yabu-vm-1 ※対象:yabu-vm-1
Bicepを用いてマスターVMのイメージからVM1[vm-yabu-1]とVM2[vm-yabu-2]をデプロイします。
VM作成に必要なBicepはMSの公式ページを参考にしてください。
クイックスタート: Bicep ファイルを使用した Windows VM の作成 – Azure Virtual Machines | Microsoft Learn
今回は以下のコードを使用します。
➀作成するリソースを記載したmain_test.bicep
②各リソース内の変数をパラメータとして外だしし記載したtest.bicepparam
➀main_test.bicepを記述(エディター:Visual Studio Code)
- // targetScope = ‘resourceGroup’ // リソースグループ(デフォルト)レベルでデプロイする場合は省略可
- // 全般設定
- param location string = ‘japaneast’ // デプロイするリージョン
- // VMの設定
- param vmName string // VMの名前
- param adminUsername string // VMの管理者ユーザー名
- @secure()
- param adminPassword string // VMの管理者パスワード
- param vmSize string // VMのサイズ
- param vmHostName string
- param osDiskName string // OSディスク名
- param osDiskSize int //OSディスクのサイズ
- param osDiskType string // OSディスクの種類
- param customImageId string // カスタムイメージのリソースID
- // ネットワークインターフェースの設定
- param nicName string //NIC名
- param nicPrivateIP string //指定したいプライベートIPアドレス
- param ipConfigName string //IP構成名
- // 参照する既存リソース
- param existingVnetName string // 既存VNet
- param existingSubnetName string // 既存サブネット
- param existingRgName string // 参照する既存リソースの所属リソースグループ
- //参照する既存リソース
- resource existingVnet ‘Microsoft.Network/virtualNetworks@2023-06-01’ existing = {
- name: existingVnetName
- scope: resourceGroup(existingRgName)
- }
- resource existingSubnet ‘Microsoft.Network/virtualNetworks/subnets@2023-06-01’ existing = {
- name: existingSubnetName
- parent: existingVnet
- }
- // ネットワークインターフェースのリソース
- resource networkInterface ‘Microsoft.Network/networkInterfaces@2023-06-01’ = {
- name: nicName
- location: location
- properties: {
- ipConfigurations: [
- {
- name: ipConfigName
- properties: {
- subnet: {
- id: existingSubnet.id
- }
- privateIPAllocationMethod: ‘Static’
- privateIPAddress: nicPrivateIP
- }
- }
- ]
- }
- }
- // 仮想マシンのリソース
- resource virtualMachine ‘Microsoft.Compute/virtualMachines@2023-09-01’ = {
- name: vmName
- location: location
- zones: [‘1’]
- properties: {
- hardwareProfile: {
- vmSize: vmSize
- }
- osProfile: {
- computerName: vmHostName
- adminUsername: adminUsername
- adminPassword: adminPassword
- windowsConfiguration: {
- enableAutomaticUpdates: false
- }
- }
- storageProfile: {
- imageReference: {
- id: customImageId // カスタムイメージを使用する場合に使用。
- }
- // OSディスクの設定
- osDisk: {
- name: osDiskName
- createOption: ‘FromImage’
- diskSizeGB: osDiskSize
- managedDisk: {
- storageAccountType: osDiskType
- }
- }
- }
- networkProfile: {
- networkInterfaces: [
- {
- id: networkInterface.id
- }
- ]
- }
- }
- }
②test.bicepparamを記述(エディター:Visual Studio Code)
- using ‘./main_test.bicep’ //ここでmain_test.bicepを参照している記述を記載
- // 全般設定
- param location = ‘Japan East’ // デプロイするリージョン
- // VMの設定
- param vmName = ‘yabu-vm-1’ // VMの名前(VMごとに変更)
- param adminUsername = ‘azureuser’ // VMの管理者ユーザー名
- param adminPassword = ‘abcdefg’ // VMの管理者パスワード
- param vmSize = ‘Standard_F4s_v2’ // VMのサイズ(VMごとに変更)
- param vmHostName = ‘yabu-vm-1’
- param osDiskName = ‘osdisk-yabu-name’ // OSディスク名(VMごとに変更)
- param osDiskSize = 127 //OSディスクのサイズ(VMごとに変更)
- param osDiskType = ‘StandardSSD_LRS’ // OSディスクの種類
- // カスタムイメージのリソースID
- param customImageId =’サブスクリプションID/resourceGroups/rg-technologyservice-1/providers/Microsoft.Compute/images/vm-master-image-20240801154224′//4-⑤でコピーしたイメージのリソースIDを記載する
- // ネットワークインターフェースの設定
- param nicName = ‘nic-yabu-name’ //NIC名(VMごとに変更)
- param nicPrivateIP = ‘10.101.0.11’ //指定したいプライベートIPアドレス(VMごとに変更)
- param ipConfigName = ‘Ipconfig-name’ //IP構成名
- // 参照する既存リソース
- param existingVnetName = ‘vnet-yabutani’ // 既存VNet(事前手動作成)
- param existingSubnetName = ‘WindowsVMSubnet’ // 既存サブネット(事前手動作成)
- param existingRgName = ‘rg-technologyservice-1’ // 参照する既存リソースの所属リソースグループ(事前手動作成)
③それぞれのファイルをエクスプローラーの同じフォルダ内に配置し、VisualStudioCodeからファイルを開く
④コード右上の表示される雲マークをクリックします。
test.bicepparamのファイルから選択してください。
⑤[Deploy]をクリックします。
画面では前回リプレイスした際の情報(サブスクリプション、リソースグループ)が残っていますが、初めてデプロイする場合はAzureサインインを求められます。Azureテナントにサインインした上でVMをデプロイしたいサブスクリプション、リソースグループを選択してください。
⑥デプロイ成功
RESULT:Succeededと帰ってきたらyabu-vm-1のデプロイ成功です。
6.Bicepファイルを使用したVMの展開※対象:yabu-vm-2 ※対象:yabu-vm-2
➀test.bicepparamを記述(エディター:Visual Studio Code)
yabu-vm-1をデプロイした際に使用したコードをそのまま流用します。test.bicepparamファイルはyabu-vm-1と2で分けて記載した方が良いです。書き換えている部分だけ赤字にしています。
※main_test.bicepファイルの内容は変更しません。
- using ‘./main_test.bicep’ //ここでmain_test.bicepを参照している記述を記載
- // 全般設定
- param location = ‘Japan East’ // デプロイするリージョン
- // VMの設定
- param vmName = ‘yabu-vm-2‘ // VMの名前(VMごとに変更)
- param adminUsername = ‘azureuser’ // VMの管理者ユーザー名
- param adminPassword = ‘abcdefg’ // VMの管理者パスワード
- param vmSize = ‘Standard_F4s_v2’ // VMのサイズ(VMごとに変更)
- param vmHostName = ‘yabu-vm-2‘
- param osDiskName = ‘osdisk-yabu-name-2‘ // OSディスク名(VMごとに変更)
- param osDiskSize = 127 //OSディスクのサイズ(VMごとに変更)
- param osDiskType = ‘StandardSSD_LRS’ // OSディスクの種類
- // カスタムイメージのリソースID
- param customImageId =’サブスクリプションID/resourceGroups/rg-technologyservice-1/providers/Microsoft.Compute/images/vm-master-image-20240801154224′//4-⑤でコピーしたイメージのリソースIDを記載する
- // ネットワークインターフェースの設定
- param nicName = ‘nic-yabu-name2‘ //NIC名(VMごとに変更)
- param nicPrivateIP = ‘10.101.0.12‘ //指定したいプライベートIPアドレス(VMごとに変更)
- param ipConfigName = ‘Ipconfig-name-2‘ //IP構成名
- // 参照する既存リソース
- param existingVnetName = ‘vnet-yabutani’ // 既存VNet(事前手動作成)
- param existingSubnetName = ‘WindowsVMSubnet’ // 既存サブネット(事前手動作成)
- param existingRgName = ‘rg-technologyservice-1’ // 参照する既存リソースの所属リソースグループ(事前手動作成)
コードを書き換えたら、yabu-vm-1と同様の手順(5-③~⑤の手順)を再度実行してyabu-vm-2をデプロイしてください。
②コンソール画面での確認
yabu-vm-1とyabu-vm-2がそれぞれ指定したリソースグループ、サイズ、OS、プライベートIP、VNETにて作成されていることを確認できました。
※コンピュータ名についてはマスターVM(vm-master)の名前が引き継がれてしまいます。OSログインした上でホスト名を手動で任意の名前に変更してください。
7.Bicepファイルを使用したVMにOS設定が複製されているか確認する
3.マスターVMのOS設定にてvm-masterに設定したOSの設定がyabu-vm-1とyabu-vm-2に引き継がれているか確認します。
※今回はyabu-vm-1のみの確認となります。
3-③の手順同様[VM]-[接続]-[Bastion]からyabu-vm-1のBicepで指定したユーザ名とパスワードを入力し、Bastion経由でyabu-vm-1のOSにログインします。
➀タイムゾーン:
②言語設定
・Language pack(言語パック)
・Text-to-speech(基本の入力)
がインストールされており、表示も日本語の状態でデプロイされている。
③グループポリシー
・パスワードの長さ:8文字以上
・パスワードの最小文字数の監査:10文字
上記設定がマスターVM(vm-master)から引き継がれて、他のポリシーはデフォルトのままであることを確認できている。
おわりに
同じOSイメージを使用したVM1[yabu-vm-1]とVM2[yabu-vm-2]をBicepファイルを使い、デプロイすることができました。
マスターVMで設定したOSの各種設定(タイムゾーン/言語設定/グループポリシー)がVM1とVM2にも引き継がれていることを確認することができました。