Azure Virtual Desktop(AVD)のセッションホスト VM に自動シャットダウンを設定したのに、深夜に一度停止したあと勝手に再起動してしまう――この現象は、スケーリング プラン(Autoscale)の設定と VM 側の自動シャットダウン機能が噛み合っていないときに典型的に発生します。本記事では「毎日 1:00 に止めたい」「水曜だけ自動起動させたい」といった要件を例に、原因の整理から Azure ポータルでの具体的な設定方法、ログによる裏取りのやり方、単一ホスト構成ならではのベストプラクティスまで詳しく解説します。
Azure Virtual Desktop セッションホストが「勝手に起動する」事象の整理
まずは、よくある相談パターンを整理します。
- Azure Virtual Desktop(AVD)のセッションホスト VM に、毎日 1:00 の自動シャットダウン(Auto-shutdown)を設定している。
- 1:00 の 30 分前に、Azure から自動シャットダウン予告メールが届いている。
- 実際に VM は1:00 にいったん停止するが、約 10〜15 分後に自動的に起動してしまう。
- アクティビティ ログには
Startのイベントが記録されているが、Started by user/cause: UserInitiatedと表示されることがあるCaller(呼び出し元)が空欄のイベントもある
- AVD ホストプールにはスケーリング プラン(Autoscale)が割り当て済みで、
- ランプダウン時の Minimum percentage of hosts = 10%
- ホストは 1 台のみ(単一ホスト構成)
- 運用上の要件としては、
- 夜間は止めたい(自動起動してほしくない)
- 水曜だけ所定の時間に自動起動させたい
このような条件が揃うと、Auto-shutdown で一度止めたはずの VM が、Autoscale によって再び立ち上げられ、「勝手に起動した」ように見える状況がよく起こります。
Auto-shutdown と AVD スケーリング プラン(Autoscale)の役割の違い
原因を理解するために、まずは VM 側の自動シャットダウン機能と、AVD スケーリング プラン(Autoscale)の役割の違いをおさらいします。
VM の自動シャットダウン(Auto-shutdown)とは
Azure VM の「自動シャットダウン」は、指定時刻に VM を停止(Deallocate)するだけのシンプルな機能です。
- 設定場所:VM リソース >[操作]>[自動シャットダウン]
- 出来ること:
- 指定時刻に VM を停止(Deallocate)
- シャットダウン 15/30 分前の通知メール送信
- (オプション)Webhook への通知
- 出来ないこと:
- 自動的に起動すること
- 曜日別の制御(毎日 or 平日のような単純パターンのみ)
つまり、「夜 1:00 に止める」ことはできても、「翌朝 8:00 に自動で起動する」といった制御は Auto-shutdown 単体ではできません。
AVD スケーリング プラン(Autoscale)とは
一方、Azure Virtual Desktop の「スケーリング プラン(Autoscale)」は、ホストプールに属するセッションホスト VM の台数を、時間帯や負荷に応じて増減させる仕組みです。
- 設定場所:Azure Virtual Desktop >[スケーリング プラン]
- 主な機能:
- 時間帯(ランプアップ / ピーク / ランプダウン / オフピーク)ごとの最小ホスト割合(Minimum percentage of hosts)の指定
- 接続ユーザー数に応じた動的な台数調整
- ユーザーのログオフや強制サインアウトのタイミング制御
- 重要なポイント:不足していると判断した台数の VM を自動で起動する
両者の役割の違いを表にまとめると、次のようになります。
| 項目 | VM 自動シャットダウン | AVD スケーリング プラン(Autoscale) |
|---|---|---|
| 主な目的 | 指定時刻に VM を止める | 時間帯ごとに必要なホスト数を確保する |
| 停止 | 可能(指定時刻に Deallocate) | 不要なホストを順次停止 |
| 起動 | 不可(起動はしない) | 必要に応じて起動する |
| 通知メール | 30 分前メールあり | メール機能はなし |
| 制御単位 | 個別 VM ごと | ホストプール全体(複数 VM) |
このように、Auto-shutdown は「止めるだけ」、Autoscale は「必要なら起動もする」という考え方の違いがあります。両者を同時に使うときは、この動作の違いを前提に設計する必要があります。
根本原因:最小ホスト割合と単一ホスト構成の「切り上げ」
今回のような「勝手に起動する」事象の多くは、スケーリング プランの「最小ホスト割合(Minimum percentage of hosts)」の設定が原因です。特に、ホストプールが1 台構成だと、「割合」の指定がすべて切り上げで解釈されるため注意が必要です。
最小ホスト割合の計算イメージ
スケーリング プランでは、時間帯ごとに「最小ホスト割合」をパーセントで指定します。内部的には次のように解釈されます(概念イメージ)。
- 総ホスト数 × 最小ホスト割合 = 最小ホスト数(小数点は切り上げ)
単一ホスト構成(総ホスト数が 1)の場合を例にすると、次のようになります。
| 総ホスト数 | 最小ホスト割合 | 計算式 | 最小ホスト数 | Autoscale の判断 |
|---|---|---|---|---|
| 1 台 | 0% | 1 × 0% = 0 | 0 台 | ホスト 0 台でもよい(全部止めてよい) |
| 1 台 | 1% | 1 × 1% = 0.01 → 切り上げ | 1 台 | 最低でも 1 台必要(VM を起動させる) |
| 1 台 | 10% | 1 × 10% = 0.1 → 切り上げ | 1 台 | 最低でも 1 台必要(VM を起動させる) |
| 1 台 | 100% | 1 × 100% = 1 | 1 台 | 常に 1 台起動が必須 |
この表から分かるように、単一ホスト構成では「0% 以外はすべて 1 台」として扱われます。
つまり、ランプダウンやオフピークの最小ホスト割合を 10% にしていると、Autoscale から見ると「夜間も最低 1 台は動いていてほしい」という指示になります。そのため、Auto-shutdown により 1:00 に VM が停止しても、数分〜十数分後の Autoscale の評価タイミングで、
- 「現在の起動ホスト数 = 0 台」
- 「最小ホスト数 = 1 台(10% の切り上げ)」
となり、不足している 1 台を補うために VM を自動起動してしまう、というわけです。
解決策:ランプダウン / オフピークの最小ホスト割合を 0% に変更する
この問題を解消するポイントは非常にシンプルで、「夜間は 0 台で構わない」時間帯の最小ホスト割合を 0% にすることです。
- ランプダウン時の Minimum percentage of hosts = 0%
- オフピーク時の Minimum percentage of hosts = 0%
こうすることで、Auto-shutdown により VM が停止した後も、Autoscale 側は「夜間は 0 台でもよい」と判断し、不足分を補うための起動処理を行わなくなります。
Azure ポータルでの設定変更手順(例)
- Azure ポータルで 「Azure Virtual Desktop」 を開く。
- 左メニューから 「スケーリング プラン」 を選択し、対象のスケーリング プランをクリック。
- 「設定」もしくは「スケジュール」タブから、該当のスケジュール(平日用 / 水曜用など)を開く。
- 「ランプダウン」「オフピーク」それぞれの時間帯について、
- Minimum percentage of hosts = 0% に変更する。
- 必要に応じて「強制ログオフまでの猶予時間」「最大セッション数」などを調整する。
- 設定を保存し、しばらくしてから実際の挙動を確認する。
設定変更後は、同じ 1:00 の Auto-shutdown を維持していても、1:00 に停止 → その後は起動してこない挙動になります。
水曜だけ自動起動させたいときのスケジュール設計
「平日は夜間完全停止でいいが、水曜だけは夜に AVD を使えるように自動起動させたい」といった要件では、スケーリング プランの曜日指定(Repeat on)を正しく設計することが重要です。
ポイント:曜日と最小ホスト 0% / 100% の組み合わせ
- 自動でホストを起動させたい曜日(例:水曜)は、該当スケジュールの 「Repeat on」 に水曜のみを指定。
- それ以外の曜日は、
- スケジューリングの対象外にする、もしくは
- 終日 最小ホスト割合 0% とする
- 単一ホスト構成の場合は、
- 「起動させたい時間帯」→ 最小ホスト割合 100%
- 「完全停止でよい時間帯」→ 最小ホスト割合 0%
単一ホスト / 水曜のみ稼働する最小構成例
次のようなスケジュールを例として考えてみます。
| フェーズ | 開始時刻 | 最小ホスト割合 | 想定される挙動 |
|---|---|---|---|
| ランプアップ | 22:00(水曜) | 100% | 22:00 以降、セッションホスト 1 台を必ず起動させる。 |
| ピーク | 22:30(水曜) | 100% | ピーク時間帯も 1 台を維持。負荷に応じて追加する構成なら 2 台以上も可能。 |
| ランプダウン | 23:58(水曜) | 0% | 以降は最小 0 台のため、接続ユーザーがいなくなれば順次停止させる。 |
| オフピーク | 23:59(水曜) | 0% | 夜間は 0 台が許容されるため、Auto-shutdown 後も自動で起動しない。 |
この構成に、VM 側の Auto-shutdown を次のように組み合わせます。
- VM 自動シャットダウン:毎日 1:00(現地タイムゾーン)
こうすると、
- 水曜夜:Autoscale が 22:00〜23:58 の間で VM を起動し、利用者がログオフするとランプダウン〜オフピークで停止へ。1:00 に Auto-shutdown が動いても、その後 Autoscale が「最小 0%」と判断するため、再起動してこない。
- その他の曜日:そもそもスケジュールが適用されない、または終日最小ホスト 0% のため、Auto-shutdown で停止した後はやはり再起動してこない。
ログで裏取り:誰が VM を起動しているのか確認する
「本当に Autoscale が起動させたのか?」「誰かが手動で起動したのでは?」といった疑問を解消するためには、Azure ポータルとゲスト OS のログを合わせて確認するのが有効です。
Azure のアクティビティ ログ
VM リソースやサブスクリプションレベルのアクティビティ ログでは、Start / Deallocate などの操作が記録されています。
- Azure ポータル > VM >[アクティビティ ログ]
- 操作名で
StartやDeallocateをフィルターする - 各イベントの詳細を開き、
- Caller(誰が実行したか)
- Initiated By(システム / ユーザー / マネージド ID など)
Autoscale や自動化ツールによる起動の場合、Caller に人名ではなく、システムアカウントやサービス プリンシパルが表示されたり、場合によっては空欄に見えることもあります。その場合でも、タイムスタンプとパターンを追っていくと、Auto-shutdown 後の一定時間ごとに起動されている、といった傾向が見えてきます。
Resource Health の「UserInitiated」表示の読み方
Resource Health の履歴には、VM の停止や起動が「UserInitiated(ユーザーにより開始された)」と表示されることがありますが、ここでいう「ユーザー」は、人間だけではなくプロセスやサービス プリンシパルを含む広い意味です。
- 手動でポータルから起動した場合
- Azure Automation から起動した場合
- AVD Autoscale の制御で起動した場合
これらはいずれも「UserInitiated」と表示され得るため、「UserInitiated だから人がやった」と短絡的に決めつけないようにしましょう。アクティビティ ログの Caller や、スケーリング プランの実行タイミングと照らし合わせて判断する必要があります。
ゲスト OS 側のイベントログ
Windows のイベントビューア(System ログ)も合わせて確認すると、より精度の高い原因特定ができます。
- イベント ID 1074:ユーザーまたはプロセスによるシャットダウン / 再起動
- イベント ID 6006:クリーンなシャットダウン
- イベント ID 6008:予期しないシャットダウン
- Power-Troubleshooter(イベント ID 1):スリープからの復帰理由など
これらのログを、Azure 側のアクティビティ ログと時刻を突き合わせることで、「1:00 に Auto-shutdown が動き、その 10 分後に Autoscale による起動が走った」といったストーリーを裏取りできます。
Auto-shutdown と Autoscale の「衝突ポイント」を整理する
似たようなトラブルを未然に防ぐために、Auto-shutdown と Autoscale を併用するときに起こりがちな「衝突ポイント」を整理しておきます。
| 症状 | 考えられる原因 | 対策の方向性 |
|---|---|---|
| Auto-shutdown 後 10〜15 分で勝手に起動する | Autoscale の最小ホスト割合が 0% 以外(単一ホスト構成で切り上げが効いている) | 夜間はランプダウン / オフピークの最小ホスト割合を 0% に設定する。 |
| Auto-shutdown の時刻通りに止まらない / ずれる | Auto-shutdown のタイムゾーンが UTC のまま、または期待するタイムゾーンと異なっている | VM の自動シャットダウン設定で タイムゾーンを正しく指定する。 |
| 想定と違う曜日に自動起動してしまう | スケーリング プランの「Repeat on」で複数曜日が選択されている | スケジュールごとに対象曜日を見直し、水曜だけにしたい場合は水曜のみを選択する。 |
| 夜間に完全停止せず、1 台だけ残り続ける | ランプダウン後も最小ホスト割合が 0% になっていない | 「ランプダウン」「オフピーク」の両方の時間帯を確認し、最小ホスト割合 0% を設定する。 |
| Auto-shutdown と別の自動化が二重に動いているように見える | Azure Automation / Logic Apps / Start-Stop v2 / サードパーティ製ツールなどが併用されている | 起動・停止を行う仕組みを棚卸しし、重複する経路を整理・削減する。 |
他に確認しておきたい「勝手に起動」候補
Autoscale 以外にも、VM を「勝手に」起動しているように見える要素はいくつか存在します。トラブルシューティングの際には、次のような点も合わせて確認しておくと安心です。
- Azure Automation / Logic Apps / Start-Stop v2
- スケジュールで起動 / 停止ジョブを走らせていないか
- 過去の運用から残っているジョブが有効のままになっていないか
- サードパーティの管理ツール
- MSP や別部署が導入したクラウド管理ツールが、起動 / 停止を制御していないか
- Windows タスク スケジューラ
- ローカル OS 上に、再起動やスクリプト実行などのタスクが仕込まれていないか
- AVD ホストプールの複数スケジュール
- 同一ホストプールに複数のスケーリング プランが割り当てられていないか
- 別のホストプール用の設定が誤って流用されていないか
- AVD の「接続時起動」的な仕掛け
- ユーザー接続時に VM を起動させるロジックを組んでいないか
「何もしていないのに起動した」というケースでも、棚卸ししてみると、昔試験的に導入した自動化が生きていた、ということは珍しくありません。
単一ホスト AVD 環境のベストプラクティス
特に中小規模の環境では、AVD のセッションホストが 1 台だけ、という構成も多く見られます。この場合、Autoscale の「割合設定」が直感と合わずにトラブルの原因になりがちです。単一ホスト構成向けの設計指針をまとめておきます。
単一ホスト構成での割合指定の考え方
- 基本ルール:1 台構成なら「0%」か「100%」の二択
- 0%:その時間帯は完全停止でもよい(必要ならすべて止める)
- 100%:その時間帯は必ず 1 台起動させておきたい
10% や 20% といった値は、複数台構成では意味がありますが、1 台だけの場合はすべて切り上げで 1 台になるため、意図と異なる結果を生みやすい設定です。
要件別のおすすめ設定パターン
| 要件 | おすすめ設定 |
|---|---|
| 毎日 8:00〜18:00 だけ起動していてほしい | 8:00〜18:00 の時間帯をランプアップ〜ピークとして 最小ホスト 100%、それ以外の時間帯は 0%。 |
| 曜日ごとに起動する日・しない日を分けたい | 曜日ごとにスケジュールを分け、それぞれの「Repeat on」で対象曜日を指定。起動させたい曜日だけ 100%、それ以外は終日 0%。 |
| 夜間は完全停止し、Auto-shutdown を併用したい | 夜間帯(ランプダウン / オフピーク)は 必ず 0% にする。Auto-shutdown の時刻はこの時間帯に含める。 |
| 検証用の短時間スケジュールで動作確認したい | 現在時刻から数時間だけ 100% に設定したテスト用スケジュールを作成し、動作を確認後削除する。 |
検証のコツ:短い間隔でスケジュールを組んでログを確認する
本番運用中の環境でいきなり翌日の結果を待つのは時間がかかります。設定の妥当性を素早く検証するには、一時的にスケジュールを前倒しして短い間隔でテストするのが有効です。
- テスト用に別のスケーリング プラン(またはスケジュール)を作成する。
- 現在時刻から 30〜60 分程度先に「ランプアップ」「ピーク」「ランプダウン」「オフピーク」が順番に来るように設定する。
- ランプアップ / ピークでは最小ホスト 100%、ランプダウン / オフピークでは 0% を指定する。
- VM の Auto-shutdown をテスト用に 10〜20 分先に変更する。
- アクティビティ ログとゲスト OS のイベントログを見ながら、起動・停止のタイミングを確認する。
これにより、「Auto-shutdown で止まった後に Autoscale が起動していないか」「ランプダウン / オフピークの 0% が正しく効いているか」を、短時間で検証できます。本番に反映する前に必ずテストを挟むことで、夜間の想定外起動を防ぎやすくなります。
まとめ:夜間停止と曜日別起動を安定させるチェックポイント
Azure Virtual Desktop のセッションホストが自動シャットダウン後に「勝手に起動する」ように見える問題は、多くの場合、AVD スケーリング プランの最小ホスト割合設定と、単一ホスト構成での切り上げロジックが原因です。
- 原因の要点
- 単一ホスト構成では、最小ホスト割合が 1% でも 10% でも 100% でも、切り上げにより「1 台必要」と解釈される。
- 夜間のランプダウン / オフピークが 10% のままだと、Auto-shutdown で止めても「最小 1 台を確保するためのスケールアウト」として再起動される。
- 対策の要点
- 夜間はランプダウン / オフピークの最小ホスト割合を 0% にする。
- 単一ホスト構成では、起動させたい時間帯は 100%、止めたい時間帯は 0% というシンプルな設計にする。
- 水曜だけ自動起動させたい場合は、該当スケジュールの「Repeat on」を水曜のみにし、それ以外の曜日は最小ホスト 0% で運用する。
- 検証と運用のコツ
- アクティビティ ログ、Resource Health、Windows のイベントログを組み合わせて「誰がいつ起動したか」を裏取りする。
- 一時的な短時間スケジュールで起動・停止パターンを再現し、期待通りに動作するか確認してから本番に適用する。
- Auto-shutdown と Autoscale のほかに、Azure Automation やサードパーティツールなど、起動・停止を触る仕組みがないか棚卸しする。
実際に、ランプダウンとオフピークの最小ホスト割合を 0% に修正し、水曜だけ最小ホスト 100% となるスケジュールを組み直した結果、「1:00 に停止 → 以後自動起動なし」「水曜のみ所定時刻に自動起動し、その後自動停止」という、狙い通りの挙動を再現できた事例も確認されています。
AVD のコスト最適化とユーザー体験を両立させるには、Auto-shutdown と Autoscale を闇雲に併用するのではなく、「どの時間帯に何台必要か」を明確にしたうえで設計することが重要です。本記事のポイントを参考に、自社環境のスケーリング プランと自動シャットダウン設定を見直してみてください。

コメント