Young Leaves

Desired State Configuration 拡張機能でAzure Windows VM 作成時にセットアップをする

今回はAzure Windows VM のDesired State Configuration (DSC) 拡張機能を利用し、Azure VM のセットアップをストレージアカウント内のDSC 構成ファイルで行う方法について説明します。

実施環境

OS

Windows Server 2025 Datacenter Gen2

Azure CLI

2.67.0

Azure Desired State Configuration 拡張機能

2.83.5

前提条件

本記事のAzure リソース作成はWSL 上よりAzure CLI を実行して作成します。簡単に試したい場合はCloudShell よりBash を選択してコマンドを実行してください。

Azure VM のPowerShell Desired State Configuration (DSC) 拡張機能

Desired State Configuration (以下DSC) は主にWindows Server の構築時に利用される宣言型の構成プラットフォームです。DSC はWindows Server で有効化したい機能や設定したい内容などを記述した構成ファイルを用いて、Windows Server の構築を行います。従来の複雑なPowerShell スクリプトより抽象的な記述が可能なため、構成内容を把握しやすく管理面も優れています。

DSC は構成 (Configuration)、ノード構成データで構成されています。構成はDSC 構成ドキュメントを表しており、主にどのような構成を表すかを記述します。ノードはDSC を適用するターゲットサーバーを記述します。Azure VM のDSC 拡張機能では常にAzure VM がノードとなります。ノードの中にどのような機能を有効化するか、など設定を記述していきます。構成データは構成の環境データを含むpsd1 ファイルです。本番環境、ステージング環境など環境ごとに構成を分けたいときに利用します。以下の構成ファイル例はWindows Server にIIS をインストールする内容となります。

configuration IISInstall
{
  node "localhost" 
  { 
    WindowsFeature IIS 
    { 
      Ensure = "Present"
      Name = "Web-Server"
    } 
  } 
}

DSC はWindows Server 以外にLinux 用もありますが、2024年9月12日にGitHub のリポジトリがアーカイブとなっており新規のIssue やPull Request は受け付けられていません。

https://github.com/microsoft/PowerShell-DSC-for-Linux

Azure Windows VM ではPowerShell Desired State Configuration (DSC) 拡張機能として提供されています。Azure VM の拡張機能で利用する場合、拡張機能の有効時にストレージアカウントのZIP 化したDSC 構成ファイルを利用し構成を適用します。そのため、DSC 拡張機能を利用する場合はストレージアカウントが必要となります。DSC 拡張機能はAzure Portal だけでなくARM などの記述でまとめて実行できるため、Azure Windows VM 作成とDSC 構成適用の自動化も可能です。

DSC 構成ファイルの記述方法に関するリファレンスは以下リンクを参照してください。

PSDscResources

また、DSC 構成ファイルは拡張モジュールを利用することで様々な処理を行うことができます。詳細は割愛しますが、確認したい方は以下リンクより検索してください。

PowerShell Gallery

今回の構成

今回はストレージアカウント内にあるDSC 構成ファイルを含むZIP ファイルを使い、Azure Windows VM にDSC 拡張機能を導入します。

リソースグループ、Azure Windows VM の作成

初めに今回のAzure リソース用のリソースグループを作成します。複数回利用するリソース名は変数で利用します。ストレージアカウント名が重複する場合は任意のストレージアカウント名をつけてください。

# 変数を定義する
RESOURCE_GROUP_NAME=rg-dsctest
LOCATION=japaneast
VIRTUAL_NETWORK_NAME=vnet-dsctest
NETWORK_SECURITY_GROUP_NAME=nsg-dsctest
SUBNET_NAME=sub-vm
PUBLIC_IP_NAME=pip-dsctest
VIRTUAL_NIC_NAME=nic-dsctest
VIRTUAL_MACHINE_NAME=vm-dsctest
STORAGE_ACCOUNT_NAME=sadsctest551
BLOB_CONTAINER_NAME=dscconf

# リソースグループを作成する
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION

リソースグループ作成後、NSG、仮想ネットワーク、サブネット、パブリックIP アドレス、仮想NIC を作成します。NSG 規則のIP アドレス部分はRDP 接続したい端末のIP アドレスを設定してください。

# NSGを作成する
az network nsg create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $NETWORK_SECURITY_GROUP_NAME

# 指定したIPアドレスのみRDPを許可するNSG規則を作成する
az network nsg rule create \
    --resource-group $RESOURCE_GROUP_NAME \
    --nsg-name $NETWORK_SECURITY_GROUP_NAME \
    --name AllowRDPRule \
    --priority 100 \
    --direction Inbound \
    --access Allow \
    --protocol Tcp \
    --source-address-prefixes <RDP接続する端末のIPアドレス> \
    --source-port-ranges '*' \
    --destination-address-prefixes '*' \
    --destination-port-ranges 3389 \
    --description "Allow RDP from specific IP address"

# ストレージアカウント用にHTTPSを許可するNSG規則を作成する
az network nsg rule create \
    --resource-group $RESOURCE_GROUP_NAME \
    --nsg-name $NETWORK_SECURITY_GROUP_NAME \
    --name AllowHTTPSRule \
    --priority 100 \
    --direction Outbound \
    --access Allow \
    --protocol Tcp \
    --source-port-ranges '*' \
    --destination-address-prefixes '*' \
    --destination-port-ranges 443 \
    --description "Allow HTTPS"

# 仮想ネットワークを作成する
az network vnet create \
    --name $VIRTUAL_NETWORK_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --address-prefix 10.0.0.0/16 \
    --subnet-name $SUBNET_NAME \
    --subnet-prefix 10.0.0.0/24 \
    --network-security-group $NETWORK_SECURITY_GROUP_NAME

# パブリックIPアドレスを作成する
az network public-ip create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $PUBLIC_IP_NAME \
    --sku Standard

# 仮想NICを作成する
az network nic create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VIRTUAL_NIC_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --subnet $SUBNET_NAME \
    --public-ip-address $PUBLIC_IP_NAME

仮想ネットワークの作成後、Windows Server 2025 のVM を作成します。動作確認時のRDP でパブリックIP アドレスが必要となるためメモしておきます。今回は動作確認のためにパスワードをハードコードしていますが、実際に作成する際はEntra ID の認証など強固な認証を設定してください。

# Windows Server 2025 DatacenterのVMを作成する
az vm create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VIRTUAL_MACHINE_NAME \
    --image MicrosoftWindowsServer:WindowsServer:2025-datacenter-g2:26100.2605.241207 \
    --admin-username azureuser \
    --admin-password crd7-e=sGZ1n \
    --size Standard_D2s_v3 \
    --os-disk-name osdisk-dsctest \
    --nics $VIRTUAL_NIC_NAME

ストレージアカウント、Blob コンテナーの作成

VM 作成後、DSC 構成ファイルを格納するストレージアカウント、Blob コンテナーを作成します。

# ストレージアカウントを作成する
az storage account create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --sku Standard_LRS \
    --kind StorageV2

# Blobストレージを作成する
az storage container create \
    --name $BLOB_CONTAINER_NAME \
    --account-name $STORAGE_ACCOUNT_NAME

DSC 構成ファイルの作成

ストレージアカウント作成後、DSC 構成ファイルを作成します。今回はWindows Server 2025 にIIS のインストールを実施します。

configuration IISInstall
{
  node "localhost" 
  {
    # IISをインストールする
    WindowsFeature IIS 
    { 
      Ensure = "Present"
      Name = "Web-Server"
    }
  } 
}

DSC 構成ファイルを作成後、ZIP で圧縮します。WSL 上でzip コマンドが無い場合は sudo apt install zip コマンドでインストールをしておいてください (Azure CloudShell ではデフォルトでインストールされています)。

# DSC構成ファイルをZIPに圧縮する
zip iisinstall.ps1.zip iisinstall.ps1.zip

DSC 構成ファイルのアップロード、アクセス用SAS の作成

DSC 構成ファイル作成後、ZIP 形式のDSC 構成ファイルをBlob コンテナにアップロードします。

# DSC構成ファイルをアップロードする
az storage blob upload \
    --account-name $STORAGE_ACCOUNT_NAME \
    --container-name $BLOB_CONTAINER_NAME \
    --name iisinstall.ps1.zip \
    --file ./iisinstall.ps1.zip

ファイルのアップロード後、Blob 内のDSC 構成ファイルへ一時的にアクセスするためのSAS を作成します。SAS の有効期限は YYYY-MM-DDThh:mm:ssZ の形式で実行に応じた日付を設定してください。

# DSC構成ファイルへの一時的なアクセス権限を作成する(SAS)
az storage blob generate-sas \
    --account-name $STORAGE_ACCOUNT_NAME \
    --container-name $BLOB_CONTAINER_NAME \
    --name iisinstall.ps1.zip \
    --permissions r \
    --expiry <SASの有効期限> \
    --https-only \
    --output tsv

SAS 作成後、トークンが出力されるためメモしておきます。

DSC 拡張機能のインストール、適用

DSC 構成ファイルのアップロード後、Azure VM にDSC 拡張機能をインストールします。URL 部分は先ほど作成したSAS トークンを設定してください。

# DSC拡張機能をインストールする
az vm extension set \
    --resource-group $RESOURCE_GROUP_NAME \
    --vm-name $VIRTUAL_MACHINE_NAME \
    --name DSC \
    --publisher Microsoft.Powershell \
    --version 2.83 \
    --protected-settings '{}' \
    --settings '{ \
        "configuration": { \
            "url": "https://sadsctest551.blob.core.windows.net/dscconf/iisinstall.ps1.zip?<SASトークン>", \
            "script": "iisinstall.ps1", \
            "function": "IISInstall", \
        } \
    }'

DSC 拡張機能インストール後、VM を再起動します。

設定確認

VM 再起動後、Azure VM にRDP 接続し設定内容を確認します。Windows Server 2025 のAzure VM にIIS が導入されたことを確認します。

リソースのクリーンアップ

設定確認後、リソースをクリーンアップします。

# リソースグループを削除する
az group delete --name rg-dsctest

まとめ

  • DSC は構成ファイルを使い従来の複雑なPowerShell スクリプトを抽象的にし、管理・保守に優れている
  • Azure VM でDSC 拡張機能を使うことで、拡張機能有効またはVM 作成時の構築を自動化できる
  • DSC 拡張機能ではストレージアカウントを利用するため、ストレージアカウントの作成とAzure VM へのアクセス権限が必要

参考資料