この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
こんにちは。パーソルプロセス&テクノロジーの内田です。
WVDを導入するにおいて、月額コストというのは懸念事項の一つかと思います。オンプレミスでのVDI環境と違って、WVDはAzure環境を利用しますので、仮想マシンを起動している時間だけ、コストが発生します。誰も使っていないときには、しっかりと仮想マシンを停止して、コストを抑える仕組みを実装したいですよね。
そういうわけで、今回はWVDの仮想マシン(セッション ホスト)をユーザの利用状況に応じて、自動的に起動・停止する方法をご紹介したいと思います。
動的スケーリングの概要
マイクロソフトがGitHubにて公開している「WVD scaling script」を利用します。次に示す公式ページにてスクリプトの概要、設定手順が記載されています。https://docs.microsoft.com/ja-jp/azure/virtual-desktop/set-up-scaling-script
ドキュメントに記載の内容をざっくりまとめると、次のようになります。
- スクリプトを実行する仮想マシン(スケーラVMと呼びます)でタスクスケジューラを構成し、スクリプトを定期的に実行させる。
- スクリプトは設定ファイルを読み込んで、動作する。
- 設定ファイルには「WVD構成」「ピーク使用時間帯」「閾値」等を記載する。
- ピーク使用時間帯に閾値を超えた場合、あらかじめ待機させておいた仮想マシンが起動する。
- ピーク使用時間外には、設定ファイルで構成したセッションホストの最小台数だけ稼働するように、その他の仮想マシンを停止する。
- 仮想マシンを停止する時に、その仮想マシンにユーザ セッションがある場合は、ユーザにメッセージを通知、設定した待機時間経過後に強制的にサインアウトさせる。
前提条件
さて、実際に構成していく前に前提条件について理解しておく必要があります。
- RDS Contributor権限
スクリプト内でWVDのコンポーネントに対する操作が発生しますので、当該権限が必要です。権限の確認はGet-RdsRoleAssignment、権限の割当はNew-RdsRoleAssignment コマンドで実行できます。 - 共同作成者権限
Azureの仮想マシンを起動・停止するための権限が必要です。共同作成者であれば問題ありません。 - スケーラVMのインターネット接続
スクリプトを実行させるための仮想マシンが1台必要です。そして、Azureの各種コマンドを正常に実行できるように、インターネットへの接続が必要となります。 - AzureRM及びMicrosoft.RDInfra.RDPowerShellモジュールのインストール
Install-Module、Import-Moduleコマンドでインストール、インポートしておきましょう。
つづいて、GitHubよりダウンロードするファイルを以下に赤字で示します。
WVD scaling script
│ Azure WVD Auto-Scaling-v1.docx
│ basicScale-MSI.ps1
│ basicScale.ps1
│ Config-MSI.Json
│ Config-MSI.xml
│ Config.json
│ Config.xml
│ Functions-PSStoredCredentials.ps1
│ README.md
│
├─exit
│
└─PowershellModules
「basicScale.ps1」、「Config.json」、「Functions-PSStoredCredentials.ps1」以上3つのファイルです。今回はスケーラVMのC直下に「scaling」というフォルダを作成し、そこに保存しました。
公式ドキュメントにはxmlファイルを更新する記載がありますが、あれはjsonの間違いです。スクリプトの中でxmlファイルを参照することは一切ありませんので、お気を付けください。
ちょっと蛇足しますが、MSIと記載のファイルは今後展開する新しいスクリプトだと思われます。中身を拝見したところ、「Azure Keyvault」や「システムの割当マネージドID」を構成するようですので、スクリプトをよりセキュアに運用することができそうです。また関数を積極的に使い、冗長的な記載が極端に減っていました。来年あたり、使えるようになっているかもしれませんね。
実際に構築していく!
ざっくりと手順の概要を以下に示します。
- Config.jsonファイルのカスタマイズ
構成ファイルにWVD環境やスケーリングの設定情報を記入していきます。 - 資格情報の登録
Get-Credentialコマンドで資格情報を作成できますよね。これで作成した資格情報をフォルダに保存していきます。 - スクリプト実行のテスト
スケジューラに構成する前に、テストを実施します。 - タスクスケジューラに登録する
テストで無事に動いたのであれば、タスクスケジューラにスクリプトを構成していきます。環境によっては、タスクスケジューラから実行すると失敗する場合がありますが、詳しくは後程解説します。
それでは、実際に構築していきましょう。
1.Config.jsonファイルのカスタマイズ
変数名 | 備考 | |
WVDScale.Azure | AADTenantId | Azure ADのGUID |
AADApplicationId | 仮想マシン起動・停止ができるサービス プリンシパルまたはユーザ名 | |
AADServicePrincipalSecret | 入力の必要なし | |
currentAzureSubscriptionId | Azure サブスクリプションのID | |
tenantGroupName | Default Tenant Group | |
tenantName | WVDのテナント名 | |
hostPoolName | WVDのホストプール名 | |
peakLoadBalancingType | BreadthFirstまたはDepthFirst。 BreadthFirstを選択したら、ピーク時間帯は幅分散、オフピーク時間帯は深さ分散となります。逆も然りです。 |
|
maintenanceTagName | 入力の必要なし | |
WVDScale.Deployment | rdBroker | https://rdbroker.wvd.microsoft.com |
userName | WVDの操作ができるサービスプリンシパルまたはユーザ名 | |
password | 入力の必要なし | |
isWVDServicePrincipal | TrueまたはFalse。userNameでサービスプリンシパルを指定した場合はTrue。 | |
WVDScale.WVDScaleSettings | beginPeakTime | ピーク開始時間 |
endPeakTime | ピーク終了時間 | |
timeDifferenceInHours | +9:00 | |
sessionThresholdPerCPU | 1CPUあたりのセッション数 | |
minimumNumberOfRDSH | 最低稼働台数 | |
limitSecondsToForceLogOffUser | 0だと強制的にログオフさせない。 | |
logOffMessageTitle | ユーザにログオフを促すポップアップのタイトル | |
logOffMessageBody | ユーザにログオフを促すポップアップのメッセジー |
各値をどこで調べるかの手順は割愛します。注意する点としては、
- パスワードを入力する必要がないこと
スクリプト内で構成ファイルのパスワードは参照していません。 - peakLoadBalancingTypeで指定した種類に、構成が勝手に変更されてしまうこと。(オフピークも構成を変更したくない場合は、スクリプトを直接編集する必要があります。)
- limitSecondsToForceLogOffUserで0を指定することで、強制的なログオフを避けることができること。
といったところです。
2.資格情報の登録
- まずPowershell ISEを管理者権限で起動します。
-
編集ウィンドウにて「Function-PSStoredCredentials.ps1」ファイルを開き、F5を押して実行します。
-
「Function-PSStoredCredentials.ps1 」ファイルの最後の4行を次のように編集します。「LocalScalingScriptFolder」には、スクリプトを保存しているフォルダのパスを入力します。 例)c:\scaling
## before ###
# Set-Variable -Name KeyPath -Scope Global -Value $path
# New-StoredCredential -KeyPath $KeyPath
# Get-StoredCredential -List # -KeyPath "c:\scaling"
# Get-StoredCredential -UserName ssa@green10ant.com
### after ###
Set-Variable -Name KeyPath -Scope Global -Value <LocalScalingScriptFolder>
New-StoredCredential -KeyPath $KeyPath
Get-StoredCredential -List # -KeyPath "c:\scaling"
# Get-StoredCredential -UserName ssa@green10ant.com
図1:before図2:after -
編集した3行を選択し、F8を押して実行します。
Set-Variable -Name KeyPath -Scope Global -Value <LocalScalingScriptFolder>
New-StoredCredential -KeyPath $KeyPath
Get-StoredCredential -List # -KeyPath
- 資格情報の入力を求められるので、Config.jsonファイルの「WVDScale.Azure.AADApplicationID」「WVDScale.Deployment.UserName」で指定した資格情報を入力します。それぞれ違う資格情報の場合は、4をもう一度実行し、両方の資格情報を保存します。
スクリプトの保存場所(C:\scaling)に資格情報ファイルが保存されていれば成功です。 -
先ほど編集した行の2行目(New-StoredCredential -KeyPath $KeyPath)をコメントアウトし、スクリプトファイルを保存して閉じます。最終的に次に示すようになります。
Set-Variable -Name KeyPath -Scope Global -Value <LocalScalingScriptFolder>
# New-StoredCredential -KeyPath $KeyPath
Get-StoredCredential -List # -KeyPath "c:\scaling"
# Get-StoredCredential -UserName ssa@green10ant.com
図3:Function-PSStoredCredentials.ps1の最後4行3.スクリプト実行のテスト
設定は以上となりますので、スクリプトを実行して、正常に動作するか確認します。「basicScale.ps1」をPowershell ISEで開き、F5を押して実行してください。
Config.jsonで指定したシナリオ通り動いていますでしょうか?
スクリプトを保存したフォルダにログファイルが生成されますので、そちらを確認してみてください。4.タスクスケジューラに登録する
スクリプトの動作確認が取れたら、最後にタスクスケジューラにスケジュールとして構成します。設定方法は公式ドキュメントの手順をご覧ください。マイクロソフトの推奨では実行間隔は15分です。
https://docs.microsoft.com/ja-jp/azure/virtual-desktop/set-up-scaling-script#configure-the-task-scheduler
もしタスクスケジューラに登録したスクリプトが正常に動作しない場合は、Azureへの認証時に多要素認証が働いている可能性が高いです。その場合はAzure ADサービスプリンシパル(いわゆるシステムアカウント)を作成し、適切な権限を付与した上で実行してみてください。
いかがでしたでしょうか。
どのようにスケーリングするかといった処理内容については、別の機会に説明しようと思います。
ちなみに本ブログ公開時点(11月25日)において、公式ドキュメントに記載の「スケーリング スクリプトの仕組み」通りに動いているわけではないですし、記載していないシナリオでスケーリングすることもございます。。。
もうしばらくすれば、スクリプトの更新と共にドキュメントが整備されるかと思いますので、その機会にご説明したいと思います!
弊社ではWindows Virtual Desktopの設計、構築、PoC支援など対応しておりますので、導入にお困りでしたらお気軽にご連絡ください。