Windows Virtual Desktop で縮退運転を実装する

この記事は更新から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」を構成するようですので、スクリプトをよりセキュアに運用することができそうです。また関数を積極的に使い、冗長的な記載が極端に減っていました。来年あたり、使えるようになっているかもしれませんね。

実際に構築していく!

ざっくりと手順の概要を以下に示します。

  1. Config.jsonファイルのカスタマイズ
    構成ファイルにWVD環境やスケーリングの設定情報を記入していきます。
  2. 資格情報の登録
    Get-Credentialコマンドで資格情報を作成できますよね。これで作成した資格情報をフォルダに保存していきます。
  3. スクリプト実行のテスト
    スケジューラに構成する前に、テストを実施します。
  4. タスクスケジューラに登録する
    テストで無事に動いたのであれば、タスクスケジューラにスクリプトを構成していきます。環境によっては、タスクスケジューラから実行すると失敗する場合がありますが、詳しくは後程解説します。

それでは、実際に構築していきましょう。

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.資格情報の登録

  1. まずPowershell ISEを管理者権限で起動します。
  2.  
    編集ウィンドウにて「Function-PSStoredCredentials.ps1」ファイルを開き、F5を押して実行します。
  3. 「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

  4. 編集した3行を選択し、F8を押して実行します。
        Set-Variable -Name KeyPath -Scope Global -Value <LocalScalingScriptFolder>
        New-StoredCredential -KeyPath $KeyPath
        Get-StoredCredential -List # -KeyPath 
     
  5. 資格情報の入力を求められるので、Config.jsonファイルの「WVDScale.Azure.AADApplicationID」「WVDScale.Deployment.UserName」で指定した資格情報を入力します。それぞれ違う資格情報の場合は、4をもう一度実行し、両方の資格情報を保存します。
    スクリプトの保存場所(C:\scaling)に資格情報ファイルが保存されていれば成功です。
  6. 先ほど編集した行の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支援など対応しておりますので、導入にお困りでしたらお気軽にご連絡ください。

いいね (この記事が参考になった人の数:8)
(↑参考になった場合はハートマークを押して評価お願いします)
読み込み中...

注意事項・免責事項

※技術情報につきましては投稿日時点の情報となります。投稿日以降に仕様等が変更されていることがありますのでご了承ください。

※公式な技術情報の紹介の他、当社による検証結果および経験に基づく独自の見解が含まれている場合がございます。

※これらの技術情報によって被ったいかなる損害についても、当社は一切責任を負わないものといたします。十分な確認・検証の上、ご活用お願いたします。

※当サイトはマイクロソフト社によるサポートページではございません。パーソルプロセス&テクノロジー株式会社が運営しているサイトのため、マイクロソフト社によるサポートを希望される方は適切な問い合わせ先にご確認ください。
 【重要】マイクロソフト社のサポートをお求めの方は、問い合わせ窓口をご確認ください