EC2インスタンスの休止について試してまとめてみた

※この記事は[AWS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aws)の8日目です。

re:Invent２０１８で発表された内容に絡む何かを試そうと思ったんですが、気になるところは結構[某ブログ](https://dev.classmethod.jp/series/aws-reinvent-2018/)でやってくれちゃってますねｗ
ありがたいことですが、書くネタがないｗ

re:Inventでの発表内容の裏でひっそりとEC2インスタンスが休止（hibernate）に対応していたので、実際に試してみて、普通に停止するのと何が違うのかを軽く書いてみます。
※これも[既に試されています](https://dev.classmethod.jp/cloud/aws/ec2-hibernate/)が気にしない

#そもそも休止（hibernate)って？
Windowsだと通常のシャットダウンの他に休止ができるので、それを見てる人にはある程度馴染みがあるかもしれません。
インスタンスについては、開始(start)、停止(stop)、終了(terminate)がこれまでありましたが、新しく追加されたのが休止（hibernate）です。

シャットダウンと違って、停止する前にメモリが保持している内容をディスクに保存（EC2の場合はSSD）し、次に起動した際にその内容を読み込んでから開始する機能です。
よく「現在の作業状態を保存し、起動時に読み込む」と説明されていますね。

#インスタンスの休止を試してみる

今の所の休止可能な条件をまとめておきます。
## 休止可能な条件
細かくは[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Hibernate.html)
Hibernation Prerequisitesに書いてあります。
日本語にはなってないので、日本語にして書いておきます。まあ、見ればだいたい分かると思いますけれど。
ざっくりなので多少ニュアンス違うかもしれません。
原文は上のリンクを参照で。

* C3, C4, C5, M3, M4, M5, R3, R4, R5のインスタンスが対象(*.metalを除く）
* Amazon Linux AMI 2018.03 released 2018.11.16移行のAMIが対象
    * Amazon Linux2は近日対応
    * HVMのAMIのみが対象
    * 既存のAMIを休止に対応させる方法は[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Hibernate.html#hibernation-enabled-AMI)を見てね！
* ルートボリュームがEBSであること
    * インスタンスストアは不可
* ルートボリュームがOSやアプリケーションなどが使用していたRAMの中身を保存しておくのに十分な容量であること
* ルートボリュームが暗号化されていること
    * ルートボリュームの暗号化については後述
* インスタンスを作成するときにEnable hibernation〜をチェックしていること
    * あとから可能にすることはできない
* オンデマンドインスタンス、リザーブドインスタンスのみで可能
    * スポットインスタンスについては[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-interruptions.html#hibernate-spot-instances)


インスタンスストアが不可なのは、インスタンスストアだとデータを保持しておけないからなんでしょうね。多分。
ルートボリュームを暗号化する方法については[こちら](https://dev.classmethod.jp/cloud/aws/introduce-to-encrypted-boot-volume/)
初回起動時にいきなり暗号化はできず、一回立ち上げたインスタンスから一度AMIを作って、作ったAMIをコピーする際にブートボリュームを暗号化できます。



## 手順

では実際にやってみます。

1. 適当なインスタンスを立ててAMIを作成する   
条件を満たすようなインスタンスを立てます。とりあえず、最新のAmazon Linux（２はまだダメ）を選んで立てました。  
ここではまだEnable hibernationにチェックは入れません（入れても次のストレージの追加から先へ進めません）
1. 作成したAMIをコピーし、EBSを暗号化する  
AMIのコピーを選択して、そのときに暗号化します。  
<img width="403" alt="スクリーンショット 2018-12-08 21.37.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/53386/bc578397-06d3-88d2-513d-b195e1207d30.png">  
マスターキーは、今回は適当でいいのでデフォルトにします。  
<img width="592" alt="スクリーンショット 2018-12-08 21.38.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/53386/b01af03e-70f9-da55-66c9-0880eb4c4eab.png">
1. EBSを暗号化したAMIからインスタンスを作成する
Enable hibernation〜にチェックを入れる
<img width="1169" alt="スクリーンショット 2018-12-08 21.55.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/53386/a330db3e-7d97-f197-0602-da2b75e6d5c9.png">

1. 「インスタンスの状態」から「Stop-Hibernate」を選択する
実際に可能になっていることがわかります。
<img width="377" alt="スクリーンショット 2018-12-08 21.59.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/53386/97118499-6b76-e0f1-8d3b-3b98eb328b3e.png">

インスタンスの状態はstoppedになってますね。
<img width="122" alt="スクリーンショット 2018-12-08 22.07.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/53386/8db7d21d-e902-2f28-4936-8aaa0ed22a58.png">
これだと普通にstopしたのか休止したのかわからないような…。どこで見ればいいんだろう。 


## 制限

これも記載された内容を日本語にしておきます。

以下はサポートされていません（※実行はできるみたいですが…）
* 休止中のインスタンスタイプ、サイズの変更
* 休止可能なインスタンスからのスナップショットやAMIの作成
* 休止されたインスタンスからのスナップショットやAMIの作成

他にも以下のようなことが
* オートスケーリンググループ内のインスタンスやECSで使われているインスタンスは休止不可
    * オートスケーリンググループのインスタンスを休止するとunhealthy扱いになってterminateされる
    * くわしくは[こちら](https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/healthcheck.html)
* 60日以上の休止はサポートしていないので、それ以上休止したい場合は再起動するかstop→startする必要がある
* AWSが当てるパッチと休止中のインスタンスがコンフリクトする可能性がある
    * クリティカルなアップデートではインスタンスの再起動、シャットダウンが必要になるため注意

#所感

料金的には普通に止めるのと変わらなそうなので一時的に止めてすぐ起動したいときとかに使えそうですね。
ただ、制限の部分を見る限り、意外と気をつけないといけないところが多いので、通常のstop,startとは結構違うところが多く、実際に運用に組み込むのは注意が必要そうです。
というか、自分にはあまりいいユースケースが浮かばず。どういうときに使いやすいだろう？