はじめに
Azure Virtual Desktop(以下 AVD)には、ホストプール内のセッションホスト(仮想マシン)を需要に合わせて自動的にスケールさせ、
運用コストを最適化できる 自動スケーリング機能(スケーリングプラン)があります。
AVD は セッションホストの稼働時間に応じて課金される仕組みとなっておりますので、
この機能を使うことで あらかじめ設定したスケジュールや利用状況に応じて セッションホストの稼働台数を調整し、
特に夜間や休日など利用が少ない時間帯の無駄な稼働を抑えることができます。
自動スケーリングのスケーリング方法は「電源管理の自動スケーリング」と「動的自動スケーリング」の2つがあります。
前者は ホストプール内にあるセッションホストの電源 ON/OFF(起動・停止)によって 余分なコストが発生しないように調整するというもの、
後者は 電源の ON/OFF だけでなく セッションホスト自体を新規で作成したり 削除したりすることができるというものです。
後者に関しては 現在プレビュー機能となっておりますので、本記事では「電源管理の自動スケーリング」の挙動に絞って検証します。
スケーリングプランとは
AVD で自動スケーリングを実現するには「スケーリングプラン」というリソースを作成する必要があります。
スケーリングプランとは、
ホストプール内のセッションホストの稼働台数を時間帯や利用状況に応じて どのように調整するかを設定するルールのようなもの です。
Azure Portal 上で Azure Virtual Desktop のページを開くと画面左側に表示される 「スケーリングプラン」のメニューから作成することができ、
作成したスケーリングプランは ホストプールに対して割り当てます。

また、スケーリングプラン は 1つ以上の「スケジュール」から構成されています。
スケジュール は 曜日 を基準にして、
利用開始時刻に向けたセッションホストの起動 ~ ピークタイムのセッションホストの台数調整 ~ 利用終了時刻に向けたセッションホストの停止
までのパターンを設定したものです。
スケーリングプラン自体には 複数のスケジュールを追加することができますが、
1つのホストプールに設定できるのは 1つのスケーリングプランのみ となる点には注意が必要です。
(スケーリングプランを複数作成することは可能ですが、割り当てることができるのは 1つのみです。)

「スケジュール」 設定の仕組み
スケーリングプランを構成する「スケジュール」は、以下の4つのフェーズで構成されています。
- ランプアップ
- ピーク時間
- ランプダウン
- ピーク時以外の時間
各フェーズで設定項目は異なりますが、軸となるポイントは
「今、ホストプール内で使用可能なセッションの総数はいくつか?」
「ホストプール内で使用可能なセッションの総数のうち、実際のユーザーセッション数(AVDに接続するユーザー数)が何割を占めているか?」
という点です。
詳細はこの後説明しますが、実際のユーザーセッションがホストプール内で使用可能なセッションの総数に占める実際のユーザーセッション数が
一定のラインを超えた場合にはセッションホストを追加で起動し、
一定のラインを下回る場合にはセッションホストを停止することで台数調整を行う という仕組みとなっています。
この 一定のラインは「容量のしきい値」と呼ばれます。
各フェーズの位置づけと設定項目
1. ランプアップ
利用開始時刻に向けて、セッションホストを起動する段階です。
例えば、始業時刻の9:00に 多くのユーザーが一斉にログインするような環境では
セッションホストが停止したままだと 起動待ちでログインが遅れる、接続エラーが発生しやすくなるなどの問題が発生しやすくなります。
ランプアップで事前にセッションホストを起動しておくことで、スムーズに接続が可能となり、接続後のパフォーマンス低下を防ぐことができます。
このように、ランプアップは AVDの利用開始に備えて セッションホストの起動する段階となるため、セッションホストが停止されることはありません。
ランプアップのフェーズにおける設定項目は 以下4つです。
①開始時刻:ランプアップ フェーズの開始時刻を設定します。 例)08:00 AM
②負荷分散アルゴリズム:起動済みのセッションホストに対して、どのようにユーザーを分散するかを設定します。 幅優先 or 深さ優先
■ 幅優先と深さ優先について
ホストプール内のセッションホスト6台のうち、起動済みのセッションホストが2台ある環境でユーザーが3名接続してきた場合(ユーザーセッション数 3)…
幅優先 = 起動済みの2台のセッションホストに均等にユーザーが分散される
深さ優先 = 起動済みの2台のうち、1台のセッションホストが最大のセッション数★に達するまで 同じセッションホストにユーザーが分散される
③ホストの最小割合(%):ホストプール内のセッションホストのうち、何台のセッションホストをランプアップで起動するかを設定します。
例)ホストプール内のセッションホスト6台のうち 2台起動させたい場合 → 30%
※小数の場合 最も近い整数に切り上げされます。
④容量のしきい値(%):ホストプール内の使用可能なセッションの総数に占める 実際のユーザーセッション数が何%を超えたときに追加でセッションホストを起動(スケールアップ)するかを設定します。
例)容量のしきい値 30% の場合
→ ホストプール内の総セッション数が10 の場合は 4名のユーザーがAVDへ接続すると(ユーザーセッション数 4) 追加で1台 セッションホストが起動
■ ホストプール内の使用可能なセッションの総数について
ホストプールで設定される 各セッションホストのセッション数の上限★ × 起動済みのセッションホストの台数 で計算します。
ホストプールで設定される 各セッションホストのセッション数の上限 = 5、起動済みのセッションホスト = 2 の場合… 10
■ホストプールで設定される各セッションホストのセッション数の上限について(★)
ホストプールのデプロイ時に設定する値の一つです。
設定が必須な項目ではありませんが、自動スケールを構成する場合、ホストプールのデプロイ時に深さ優先の負荷分散を選択する場合には 設定が必要です。
幅優先を選択してデプロイした場合 セッション数の上限は 既定では 999999 に設定されます。
2. ピーク時間
AVDへの接続が最も多い時間帯です。
ランプアップ フェーズでは セッションホストの起動のみを行い、停止されることはありませんでしたが
ピーク時間では ホストプール内のユーザーセッション数に応じて セッションホストの起動と停止によって台数の調整を行います。
ピーク時間 のフェーズにおける設定項目は 以下の3つです。
①開始時刻:ピーク時間 フェーズの開始時刻を設定します。 例)09:00 AM
②負荷分散アルゴリズム:起動済みのセッションホストに対して、どのようにユーザーを分散するかを設定します。 幅優先 or 深さ優先
■ 負荷分散アルゴリズムの上書きについて
上で触れた通り、ホストプールのデプロイ時 及び スケーリングプランの各フェーズにおいて 負荷分散アルゴリズムを設定します。
ホストプールのデプロイ時に設定する負荷分散アルゴリズムはベースライン設定であり、
自動スケーリングを構成した場合 スケーリングプランの各フェーズの負荷分散アルゴリズムによって上書きされます。
③容量のしきい値(%):ランプアップ フェーズでの設定値を引き継ぎます。
セッションホストの追加起動(スケールアップ)は、ランプアップと同様に ユーザーセッション数が容量のしきい値を超えた場合に機能します。
セッションホストの停止(スケールダウン)は、以下の条件をすべて満たす場合に機能します。
・ユーザーセッション数が容量のしきい値を下回る場合
・セッションホストの台数を減らしても 容量のしきい値を超えない場合
・そのセッションホストに誰も接続していない(ユーザーセッションがない)場合
3. ランプダウン
利用終了時刻に向けて、セッションホストを順次停止していく段階です。
ピーク時間の場合は ユーザーセッションがないという条件を満たしていないと セッションホストは停止されませんでしたが、
ランプダウンの場合 ユーザーのサインアウトを強制する(⑤)を有効にすると たとえ ユーザーセッションがあるセッションホストでも
以下の条件を満たしていれば 停止される点がポイントです。
・ユーザーセッション数が容量のしきい値を下回る場合
・セッションホストの台数を減らしても 容量のしきい値を超えない場合
ランプダウン のフェーズにおける設定項目は 以下の7つです。
①開始時刻:ピーク時間 フェーズの開始時刻を設定します。 例)06:00 PM
②負荷分散アルゴリズム:起動済みのセッションホストに対して、どのようにユーザーを分散するかを設定します。 幅優先 or 深さ優先
③アクティブホストの最小パーセンテージ:ランプアップ フェーズの「ホストの最小割合」と同様に、ホストプール内のセッションホストのうち、
何台のセッションホストを起動した状態としておくかを設定します。
④容量のしきい値(%):ランプアップ、ピーク時間の容量のしきい値と意味は同じです。
ホストプール内の使用可能なセッションの総数に占める 実際のユーザーセッション数が何%を超えたときに追加でセッションホストを起動(スケールアップ)するかを設定します。
ピーク時間はランプアップの設定を引き継ぎましたが、ランプダウンでは 新たに値を設定することができます。
⑤ユーザーのサインアウトを強制する:セッションホスト停止(スケールダウン)の条件を満たす場合にユーザーセッションがあるセッションホストを停止するかを設定します。 はい or いいえ
⑦
⑥
VM にアクティブまたは切断されたセッションはありません:以下のどちらにも該当しない場合
・ユーザーがセッションホストに接続・サインインしている(アクティブなセッション)
・ユーザーのセッションホストへの接続は切れているが、サインアウトはしていない(切断されたセッション)
VM にはアクティブなセッションがありません:以下に該当している場合(切断されたセッションが残っている場合も停止)
4. ピーク時以外の時間
AVDへの接続が最も少ない時間帯です。
ピーク時以外の時間 フェーズの設定項目は 以下3つです。
①開始時刻:ピーク時間 フェーズの開始時刻を設定します。 例)10:00 PM
②負荷分散アルゴリズム:起動済みのセッションホストに対して、どのようにユーザーを分散するかを設定します。 幅優先 or 深さ優先
検証してみる
では、ここまで解説した 自動スケーリング機能が 以下のケースの場合に実際にどう機能するかを見ていきます。
検証環境について

既に作成済みのホストプール(isoda-hostpool02)を利用します。
このホストプールには 3台のセッションホストが存在します。
ホストプールの種類は Pooled、負荷分散アルゴリズムは 幅優先 を選択して作成しています。
アプリケーショングループの種類は Desktop で、
Entra Connect によって Active Directory から Entra ID へ同期されたユーザー1名(isodatest)が割り当てられています。
※自動スケーリングの機能なので 本来であれば AVDのユーザーが複数名存在する場合に利用されるものですが、
今回は検証環境の兼ね合いにより、AVDのユーザーは 1名の状態でスケーリングプランの挙動を検証しました。分かりづらく恐縮ですが ご容赦ください。
まずは サブスクリプションにロールを付与する
自動スケーリングは人の代わりにAVDが セッションホストの電源をON/OFFしてくれるという機能です。
そのため、Azure Virtual Desktop の サービスプリンシパルに対して、ロールを付与する必要があります。
サービスプリンシパルとは、人間の代わりにAzure上のサービスが使う身分証のようなものです。
自動スケーリング機能を利用するには Desktop Virtualization Power On Off 共同作成者 ロール を
Azure Virtual Desktop サービスプリンシパル(アプリケーションID: 9cdead84-a844-4324-93f2-b2e6bb768d07)に対して付与します。
この手順は以下の Microsoft Learn の記事に記載されています。
Azure Virtual Desktop サービス プリンシパルに Azure RBAC ロールまたはMicrosoft Entra ロールを割り当てる – Azure Virtual Desktop | Microsoft Learn
※この作業を行うユーザーには 所有者 または ユーザーアクセス管理者 ロールが必要です。
Pooled 型のホストプールは MaxSessionLimit を設定する
MaxSessionLimit とは 先程のスケーリングプランの説明における
「ホストプールで設定される各セッションホストのセッション数の上限について(★)」のことです。
ホストプールには 複数ユーザーで1台のセッションホストを共有する「Pooled型」と
1人のユーザーが1台のセッションホストを占有する「Personal型」がありますが、
前者の場合 1台のセッションホストに対するセッション数の上限は既定で 999999 に設定されます。
そして、先程説明した通り この値は セッションホストの台数調整の判断軸として利用されるため
Pooled型の場合は 既定値のままになっていないか確認し、値を設定する必要があります。
MaxSessionLimit の値は
Azure Portal > Azure Virtual Desktop > 概要 > JSON ビュー から確認可能です。


検証で利用するホストプールは規定値のままであった為、以下のコマンドで変更します。
今回の検証では 「1」 を設定します。
Update-AzWvdHostPool `
-Name “isoda-hostpool02” `
-ResourceGroupName “【リソースグループ名】” `
-MaxSessionLimit 1
スケーリングプランを作成する
ロールの付与とMaxSessionLimitの設定が完了したら、続いてはスケーリングプランの作成です。
Azure Portal > Azure Virtual Desktop > スケーリングプラン と進み、「+作成」をクリックします。

まずは 基本情報 の設定です。ポイントとなる点を取り上げて説明します。
①スケーリングプラン名
スケーリングプランは Azure Portal上で 1つのAzureリソースとして表示されるため、
識別しやすい名前を設定します。
②場所(リージョン)
ホストプールと同じリージョンを選択します。
③タイムゾーン
(UTC+9:00)大阪、札幌、東京 を選択します。
④ホストプールの種類
今回は Pooled型のホストプールに適用するため、プール を選択します。
⑤スケーリング方法
今回は 電源管理の自動スケーリングを選択します。

続いて、スケジュール の作成です。
「+スケジュールを追加する」をクリックし、スケジュールの スケジュール名、繰り返す曜日 を設定していきます。
今回は 検証目的であり、動作確認をする日が水曜日であった為「Wednesday」のみを設定しています。

ここからは 各フェーズの設定です。今回は 以下のように設定しました。
<ランプアップ>
①開始時刻(12時間制):09:00 AM
②負荷分散アルゴリズム:幅優先
③ホストの最小割合(%):33
④容量のしきい値(%):99

■ ランプアップ 設定のねらい(動作検証ポイント)
今回 isoda-hostpool02 には 3台のセッションホストが存在しますが、
動作確認にて ランプアップ フェーズで うち1台が起動することを確認したいです。
ホストの最小割合を 33% とすることで
ホストプール内のセッションホスト台数(3)× ホストの最小割合(33)= 0.99 となり、
小数が切り上げられるため ランプアップフェーズの開始時刻 9:00 に1台のセッションホストが起動する想定です。
また、容量のしきい値は 99% で設定していますが、動作確認の際 検証用ユーザー(isodatest)はランプアップの時間帯ではAVDに接続せず、
ピーク時間(10:00~13:00)に接続させます。
そのため ランプアップの時間帯(9:00~10:00)では ユーザーセッション数は 0 であり、
ホストプール内の使用可能なセッション総数(ホストプールで設定される各セッション数の上限 1 × 起動済みのセッションホスト 1 = 1)
を超えない為、セッションホストの追加は行われず、9:00に起動した1台のままです。
※動作検証結果は 後ほどまとめます。
<ピーク時間>
①開始時刻(12時間制):10:00PM
②負荷分散アルゴリズム:幅優先

■ ピーク時間 設定のねらい(動作検証ポイント)
ピーク時間(10:00~13:00)に 検証用ユーザー(isodatest)を AVDに接続させます。
そうすることで、ユーザーセッション数は 1 となります。
ピーク時間の容量のしきい値は ランプアップで設定した値が引き継がれるため 99% であり、
ホストプール内の使用可能なセッション総数(ホストプールで設定される各セッション数の上限 1 × 起動済みのセッションホスト 1 = 1)
に占めるユーザーセッション数(1)は 100% であるため、容量のしきい値を超えます。
よって、ピーク時間で 追加でもう1台のセッションホストが起動し、合計 2台のセッションホストが起動している状態となる想定です。
追加で1台セッションホストが起動することで、
ホストプール内の使用可能なセッション総数は ホストプールで設定される各セッション数の上限 1 × 起動済みのセッションホスト 2 = 2 となり、
対するユーザーセッション数は 1(50%)であるため 容量のしきい値 99% を超さない形となります。
そのため、ピーク時間において 3台のセッションホストが起動することはありません。
<ランプダウン>
①開始時刻(12時間制):01:00 PM
②負荷分散アルゴリズム:幅優先
③アクティブホストの最小パーセンテージ(%):0
④容量のしきい値(%):99
⑤ユーザーのサインアウトを強制する:はい
⑥ユーザーをログアウトしてVMをシャットダウンするまでの遅延時間(分):30
⑦通知メッセージ:30分でログオフされます。作業内容を保存してください。

■ ランプダウン 設定のねらい(動作検証ポイント)
ランプダウンにて アクティブホストの最小パーセンテージを 0% としている為、
ランプダウンの時間帯(13:00~16:00)に ピーク時間の段階で起動していた2台のセッションホストは順次電源OFFとなる想定です。
ユーザーのサインアウトを強制する を「はい」で設定している為、
ピーク時間にAVDへ接続した検証ユーザー(isodatest)には 通知メッセージが送られる想定です。
<ピーク時以外の時間>
①開始時刻(12時間制):04:00 PM
②負荷分散アルゴリズム:幅優先

全てのフェーズの設定が完了すると、以下のように スケジュールとして追加されます。

作成したスケジュールをホストプールに割り当てます。
「自動スケーリングを有効にする」にチェックを入れます。

任意でタグの設定を行い、デプロイします。

動作検証結果まとめ
今回、スケーリングプランの作成は火曜日の夕方に、自動スケーリングの動作検証を 水曜日の一日を通して実施しました。
■ スケーリングプランのデプロイ後のセッションホストの状態
スケーリングプランの作成から30分後くらいで 起動済み状態であった セッションホスト3台は 自動で電源オフとなりました。

スケーリングプランをホストプールに割り当てる際に「自動スケーリングを有効にする」にチェックを入れたため、
スケーリングプランのデプロイ後 その時の時間帯に合わせて セッションホストの状態が変更されたと考えられます。
※ スケーリングプランのデプロイを行ったのは 動作検証日の前日の夕方(ピーク時以外の時間)でした。
■ 動作検証日のランプアップ開始時刻のセッションホスト起動
9:02 頃に 1台のセッションホストの状態が 割り当て解除済み → 実行中、正常性状態が シャットダウン → 使用可能 に変わりました。(想定通り)

■ ピーク時間に検証用ユーザーでAVD接続した後の挙動
10:45 に 検証用ユーザーでAVDへ接続すると、起動済みのセッションホストのセッション数が 0 → 1 に変わりました。

これによって、ホストプール内の使用可能なセッション総数(ホストプールで設定される各セッション数の上限 1 × 起動済みのセッションホスト 1 = 1)
に占めるユーザーセッション数(1)は 100% となり、ピーク時間の容量のしきい値は 99% を超えるため、セッションホストが追加されます。
実際に 11:20 頃に確認したところ セッションホストが追加で 1台起動されていました。

■ ランプダウンのセッションホストの停止
ランプダウンにて アクティブホストの最小パーセンテージを 0% としている為、
ランプダウンの時間帯(13:00~16:00)に ピーク時間の段階で起動していた2台のセッションホストは順次電源OFFとなる想定でしたが…
ここについては 想定通りにはいかず、ランプダウンの時間帯を過ぎても セッションホストが停止されず、起動されたままとなってしまいました。

ランプダウンで セッションホストを停止(スケールアウト)する条件として 以下2つがありました。
・ユーザーセッション数が容量のしきい値を下回る場合
・セッションホストの台数を減らしても 容量のしきい値を超えない場合
想定通りセッションホストが停止されなかった原因は 赤字で表示している2つ目の条件を満たしていないことにありました。
ランプダウンでは アクティブホストの最小パーセンテージを0%としている為、起動中のセッションホストがすべて停止されるように考えてしまいますが…
起動中のセッションホスト2台のうち1台を停止すると
ホストプール内の使用可能なセッションは 各セッションホストのセッション数の上限 1 × 起動済みのセッションホスト 1 で 1 となり、
ホストプール内の使用可能なセッション(1)に占める ユーザーセッション数(1) は 100% となります。
これは 容量のしきい値として設定した 99% を超えてしまう為、結果として セッションホストは2台とも停止されない ということになります。
ちなみに、ランプダウンの容量のしきい値を 100% に設定していた場合でも セッションホストは2台とも停止されない結果となります。
容量のしきい値 == ホストプール内の使用可能なセッションの総数に占める 実際のユーザーセッション数 の場合は
スケールアウトもスケールインもどちらも行われません。
容量のしきい値の評価アルゴリズムに関しては 以下の記事に詳しく記載されています。
AVD スケーリングプランの動作について | Microsoft Japan Windows Technology Support Blog
参考資料まとめ
Azure Virtual Desktop の自動スケーリング プランを作成して割り当てる – Azure Virtual Desktop | Microsoft Learn
Azure Virtual Desktop での自動スケーリング プランとシナリオの例 – Azure Virtual Desktop | Microsoft Learn
AVD スケーリングプランの動作について | Microsoft Japan Windows Technology Support Blog
Azure Virtual Desktop の導入は パーソルクロステクノロジーまでご相談ください!
弊社では Azure Virtual Desktop の導入支援の実績が多数ございます。
以下のURLから 資料請求 ・ お問い合わせ が可能です。是非ご検討ください!


(←参考になった場合はハートマークを押して評価お願いします)