🙆

Windows 10 Pro な Azure VM を AVD セッション ホストに変える

2024/07/04に公開

TL;DR

  • Windows 10 Pro な Azure VM を Azure Virtual Desktop のセッション ホストに変え隊
  • SxSStackListenerCheck が Success にならない事象にこまっていたが、Windows Enterprise を使っていないのが原因だった
  • hibernate + Start VM on Connect でコスト最適化の 余地が残されていない 状態に

はじめに

ちょっと社外の方に環境を社内 (につながる環境) をお貸しすることになって、そのために一旦 Azure VM として Windows 10 Pro を立てて使っていただいておりました。
が、せっかくなので Azure Virtual Desktop (AVD) の hibernate 使ってコスト最適化したいな☆、と思い立ち、でも一応データそのまま持っていけたらいいよな、ということでその Azure VM をセッション ホストに変えることにしました。

今さら Windows 10 かよー、というご意見もあるかもですが、はい、まぁそのうち、なんとか。

AVD の session host にするためには

RDAgent と RDAgentBootLoader のインストールが必要です。
ホスト プールにセッション ホストを追加するAVDエージェントサイレントインストール手順について を参考に以下のようなコマンドを実行します。
<RegistrationToken> のところは、Azure Portal の Azure Virtual Desktop > Host pool から、Registration key をコピーしてきてください。

powershell to install RDAgent and RDAgentBootLoader
Invoke-WebRequest -Uri https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RWrmXv -OutFile .\Microsoft.RDInfra.RDAgent.Installer-x64.msi
Start-Process msiexec.exe -Wait -ArgumentList '/I Microsoft.RDInfra.RDAgent.Installer-x64.msi /quiet REGISTRATIONTOKEN=<RegistrationToken>'
Remove-Item .\Microsoft.RDInfra.RDAgent.Installer-x64.msi

Invoke-WebRequest -Uri https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RWrxrH -OutFile .\Microsoft.RDInfra.RDAgentBootLoader.Installer-x64.msi
Start-Process msiexec.exe -Wait -ArgumentList '/I Microsoft.RDInfra.RDAgentBootLoader.Installer-x64.msi /quiet'
Remove-Item .\Microsoft.RDInfra.RDAgentBootLoader.Installer-x64.msi

SxSStackListenerCheck が Success にならない

RDAgent と RDAgentBootLoader のインストールが完了しても、セッション ホストの Health check status を見ると SxSStackListenerCheck だけが Success になりませんでした。
何度か再起動しても変わらず、、と思っていたら、docs に記載がありました。

サイドバイサイド スタックは、Windows Enterprise または Windows Server SKU でのみサポートされています。つまり、Pro VM などのオペレーティング システムはサポートされません。 Enterprise や Server SKU がない場合、スタックは VM にインストールされますが、アクティブ化されないため、コマンド ラインで qwinsta を実行したときに表示されません。
Azure Virtual Desktop エージェントに関する問題をトラブルシューティングする - Azure

ということで、適切にライセンスをつけたユーザーがいることを確認しつつ、プロダクト キーを入れ替え、Windows 10 Pro から Windows 10 Enterprise に変更しました。
プロダクト キーは Windows Server および Windows のキー管理サービス (KMS) クライアントのライセンス認証とプロダクト キー にあるので、今回は「NPPR9-FWDCX-D2C8J-H872K-2YT43」にしておきます。

その他

細かいところを設定していきます。

Scaling plan

Personal でも Scaling plan が使えるようになっており、「スケーリング」というニュアンスとはちょっと違いますが、要はユーザーのログイン・ログオフ・アイドル時間などを契機にセッション ホストを起動・停止できます。
んで、最近、hibernate というのが追加されましたので、こちらを使って設定しておきます。

注意点としては以下のような点でしょうか。(実際ハマった)

  • Azure VM の SKU に制限がある
    • v5 シリーズにしておけば大体大丈夫
  • 仮想メモリ (Virtual memory) が C:\ に無いと有効化できない
    • 一時ディスク (D:\) がついている Azure VM の場合、Virtual memory は既定で D:\ に設定されているため、設定を変更し、再起動する必要があります
    • {"code":"VMExtensionProvisioningError","message":"VM has reported a failure when processing extension 'AzureHibernateExtension' (publisher 'Microsoft.CPlat.Core' and type 'WindowsHibernateExtension'). Error message: 'Page file is in temp disk. Please move it to OS disk to enable hibernation.'. More information on troubleshooting is available at https://aka.ms/vmextensionwindowstroubleshoot. "} っていうエラーが出ます、分かりやすい

詳細は、休止状態の概要 - Azure Virtual Machines を見ていただければと思います。

仮想メモリ (Virtual memory) の設定変更

念のためスクショを張っておきます。
手元の Windows 11 のマシンでの設定画面ですが、Windows 10 でも大体同じかと思います。

コントロール パネル の システム みたいなところをクリックします。

Control panel - System
Control panel - System

Windows 11 だとこっから 設定 (Settings) アプリに飛ばされますが、システムの詳細設定 (Advanced system settings) をクリックします。

Settings app - System > About
Settings app - System > About

んで、少し深いところに設定項目があります。
ここは Performance の枠の中の Settings をクリックします。

Control panel - System properties
Control panel - System properties

Virtual memory の中の Change をクリックします。

Control panel - Performance options
Control panel - Performance options

この画面では Automatically - (自動でうんぬん) になっていて、これでもいいですし、C:\ ドライブに System managed size とかにしておいてもいいかなと思います。

Control panel - Virtual memory
Control panel - Virtual memory

設定変更した場合には、反映のため再起動が求められます。

動作確認

ということで、いい感じに hibernate されるとこんな感じに見えます。

Azure Virtual Desktop - session host - hibernated
Azure Virtual Desktop - session host - hibernated

この状態であれば Azure VM として 割り当て解除 (deallocated) と同じ状態になり、Azure VM の部分の課金が止まります。
また、Start VM on Connect にも対応しているので、翌朝接続しようと試みたその瞬間に、数分待っていただければ、オンデマンドに Azure VM が起動します。
hibernate を利用しているので、開いていたアプリケーションもあらやだそのまま戻ってきます。

まとめ

あんまりやらないケースだとは思いますが、取り合えず Windows Pro な Azure VM を立てて踏み台がてら使っていたが、せっかくだし AVD に変えてみるか、という方には参考になるかもしれません。
通常の Azure VM であればコスト最適化は Start/Stop VMs v2 の概要 などを使うことがありますが、こちらはオンデマンドの起動には対応していません。
今日はちょっと早くから仕事しようかな、、に対応できるのは AVD の Start VM on Connect のメリットの 1 つです。

一応ちゃんと Windows Enterprise のライセンスを持っている前提なので問題ないかとは思いますが、どこかからダメだよ、って突っ込まれたら直します。。

参考

  • Azure Virtual Desktop のライセンス

https://learn.microsoft.com/azure/virtual-desktop/licensing

  • ホスト プールにセッション ホストを追加する

https://learn.microsoft.com/azure/virtual-desktop/add-session-hosts-host-pool?tabs=portal%2Ccmd#register-session-hosts-to-a-host-pool

  • AVDエージェントサイレントインストール手順について

https://jpwinsup.github.io/blog/2023/02/27/RemoteDesktopService/AVD/AVD-Agent-SilentInstall/

  • Azure Virtual Desktop エージェントに関する問題をトラブルシューティングする - Azure

https://learn.microsoft.com/azure/virtual-desktop/troubleshoot-agent#error-operating-a-pro-vm-or-other-unsupported-os

  • Windows Server および Windows のキー管理サービス (KMS) クライアントのライセンス認証とプロダクト キー

https://learn.microsoft.com/windows-server/get-started/kms-client-activation-keys

  • 休止状態の概要 - Azure Virtual Machines

https://learn.microsoft.com/azure/virtual-machines/hibernate-resume

  • Start/Stop VMs v2 の概要

https://learn.microsoft.com/azure/azure-functions/start-stop-vms/overview

  • Microsoft x おれたちのコスト最適化バトル (改)

    コスト最適化についてイベント登壇したときのスライドもぜひ

https://speakerdeck.com/skmkzyk/cost-optimization-battle

  • AVD RdAgent とかを再インストールする PowerShell Cmdlet (2024/04 版)

https://zenn.dev/skmkzyk/articles/avd-rdagent-reinstall-202404

  • VM の Hibernate を AVD の個人型ホストプールのスケーリングプランで利用する

    zukako-san の書いてるここら辺の記事も参考になります、hibernate とかはこちらの方が詳細に書いてある

https://zenn.dev/zukako/articles/e017890e0ce876

  • Azure Virtual Desktopの個人型ホストプールにおける電源管理をスケーリングプランにより実現する

https://zenn.dev/zukako/articles/8b76d3ab77d497

Discussion