Windows EC2インスタンスのハイバネーション(休止)を試してみた

2019.10.31

これまでEC2インスタンスのハイバネーション(休止)はAmazon LinuxとUbuntuインスタンスがサポート対象でしたが、今月中旬からWindowsインスタンスもサポートされる様になりました。

というわけで実際に試してみることにしました。

前提条件

Windowsインスタンスでハイバネーションを実行するには以下の前提条件を満たす必要があります。

  • サポートされているインスタンスファミリー - C3、C4、C5、M3、M4、M5、R3、R4、および R5
  • インスタンス RAM サイズ - 上限は 16 GB です。
  • インスタンスサイズ - ベアメタルインスタンスにはサポートされていません。
  • サポートされる AMI (休止状態をサポートする HVM AMI である必要があります):
    • Windows Server 2012 AMI (2019 年 9 月 11 日以降にリリース)
    • Windows Server 2012 R2 AMI (2019 年 9 月 11 日以降にリリース)
    • Windows Server 2016 AMI (2019 年 9 月 11 日以降にリリース)
    • Windows Server 2019 AMI (2019 年 9 月 11 日以降にリリース)
  • ルートボリュームタイプ - インスタンスストアボリュームではなく、Amazon EBS ボリュームにする必要があります。
  • Amazon EBS ルートボリュームサイズ - RAM の内容を保存し、OS またはアプリケーションなど、予想される使用量に対応できる大きさである必要があります。休止を有効にすると、RAM を保存するために起動時にルートボリュームでスペースが割り当てられます。
  • Amazon EBS ルートボリュームの暗号化 - 休止を使用するには、休止時にメモリにある機密性の高いコンテンツを保護するため、ルートボリュームを暗号化する必要があります。
  • 起動時に休止を有効にする - 既存のインスタンス (実行中または停止状態) で休止を有効にすることはできません。
  • 購入オプション - この機能は オンデマンドインスタンス および リザーブドインスタンス でのみ使用できます。

( 休止の前提条件 より引用 )

ざっくりしたところでは

  • 所定のインスタンスタイプであること
  • 2019年9月11日以降のAMI
  • Windows Server 2012以降のOS
  • 暗号化され、それなりの容量(RAMサイズ相当)を持つEBSルートボリューム
  • 「休止を有効にする」状態で起動されている

を満たしていればよさそうです。

試してみた

本記事では以下のスペックのWindows Server 2019で試してみました。

  • 執筆時点最新のAMI : ami-0b085cfcf6f1304fd (Windows_Server-2019-Japanese-Full-Base-2019.10.09)
  • インスタンスタイプ : c5.large
  • ルートボリューム : 50GiB (デフォルトキーで暗号化)

マネジメントコンソールから作成する場合は、下図の様に「停止動作に休止動作を追加する」の設定を有効にします。

そしてハイバネーションを有効にしている場合はルートボリュームの暗号化も促されます。

暗号化の設定を追加することでこの警告も消えます。

ハイバネーションの実行

ハイバネーションを実行するにはマネジメントコンソールのメニューから、「インスタンスの状態 -> 停止 - 休止」を選びます。

確認ダイアログが表示されるのでそのまま実行すればOKです。

するとEC2インスタンスが停止(休止)されます。
マネジメントコンソール上では「停止」の表記ですが実際には休止しています。

ちなみにハイバネーションを確認するために下図の様にメモ帳を開いた状態で実行しています。

ハイバネーションからの復帰

ハイバネーションからの復帰は簡単でインスタンスを「開始」するだけです。

あとはインスタンスが起動し休止状態から復帰します。
復帰後デスクトップに接続してみるとご覧の様に開いていたメモ帳もそのままで復帰してくれます。

実装について

折角なのでWindows EC2インスタンスにおける休止の仕組みについても調べてみました。
以下はWindows Server 2019における内容です。

初回起動時

初回起動時はEC2ConfigおよびEC2Launchによる初期化処理が実行されます。
Windows Server 2019(EC2Launch)ではこの初期化処理の中でインスタンスメタデータからハイバネーションが有効にされているかを取得し、ハイバネーションが有効な場合は

# Set-HibernateOnSleep.ps1 より転記
powercfg /hibernate /size 100

を実行してOSのハイバネーションを有効にします。
(※本記事では紹介しませんがEC2Configにおいても概ね同様の処理がなされます)

休止呼び出し時

マネジメントコンソールなどから休止が実行された場合はAWSの基盤からEC2インスタンスに対してスリープが呼び出される様です。
以下の様なイベントログ(ハードウェアボタンクリックによるスリープリクエスト)が検出されており、OSのスリープ処理が実行され休止に至っています。

スポットインスタンスにおけるハイバネーション

最初に本記事を公開した際に「よくわからなかった点」として記載したのですが、EC2 WindowsインスタンスのCドライブ(C:\Program Files\Amazon\Hibernate\)にあるエージェントプログラムはスポットインスタンスのハイバネーション用でした。

こちらLinux版のエージェントがGitHubでソース公開されており、また、ドキュメントに使用方法も記載されています。

Windows版エージェントの使い方は以下のドキュメントに記載されています。

エージェント自体は幾つかの引数を持っていましたが、通常利用においては単純に引数無しでユーザーデータから起動すればよい様です。

<powershell>."C:\Program Files\Amazon\Hibernate\EC2HibernateAgent.exe"</powershell>

あとはこのエージェントがスポットインスタンスの中断をポーリングし、中断時によしなに処理をしてくれます。

参考情報

最後に参考情報としてこれまでのハイバネーションに関連する記事を紹介して終わりにします。