[AWS] EC2ルートボリュームを無停止で交換してみた[ダウンタイムあり]

4月に[EC2でルートボリュームを交換することにより、迅速な復元とトラブルシューティングが可能に]という発表がありましたね。

簡単に記事をまとめると、
EC2インスタンスが不健全な状態になった場合などに、スナップショットからルートボリュームを復元することができるようになりました。

その際にはインスタンスを停止する必要がないので、インスタンスストアのデータもきちんと保持されるようです。

ということで、早速以下の2点を確認してみることにします。
 1, ルートボリュームの復元を試す
 2, x86インスタンスにarmのルートボリュームを復元するとどうなるか

↑ 2,に関してはそれ以前に問題でできませんでした。

検証準備

今回検証したいことは、
・ルートボリュームの復元の挙動とインスタンスストアが保持されることの確認
・異なるアーキテクチャのルートボリュームを復元できるのか
です。


ということで早速x86で作成したスナップショットとarmのスナップショットをそれぞれ用意しました。


検証用のインスタンスのルートボリュームにはテスト用のファイルも設置しておきます。


検証用のインスタンスにインスタンスストアをマウントして、テスト用のファイルを設置しておきます。
ルートボリューム復元の際に、インスタンスストア内のデータが消滅しないか確認するためです。

ルートの置き換え


EC2コンソールから復元したいインスタンスを選択します。
[ストレージ]タブを押すと[ルートボリュームを置き換える]というボタンが表示されていることがわかります。


復元に使うスナップショットを選択できます。
ここで気がついたのですが、復元に使うスナップショットは選択しているEC2インスタンスから作られたものでなければダメな雰囲気です。


設定が完了すると、ルートの置き換えが行われていることがコンソールから確認できます。

このタイミングで、sshログインから追い出されました。
また、該当のサーバーからの応答も無くなりました。

おそらく再起動が実行されているのだと思います。
OSなどのシステムファイルがインストールされているボリュームが変わるのですから、当たり前ですね。

ルートの置き換え後の確認


ルートの置き換えにはおよそ1分程度のダウンタイムが発生しました。
※ このダウンタイムはルートボリュームの大きさやインスタンスサイズによって変動する可能性があるので、参考にはしないようにしてください。

ルートボリュームの中を確認すると、検証のためにルートボリュームに設置しておいたテストファイルがなくなっていることがわかります。
これはスナップショットの内容に復元されたためです。


続いてインスタンスストアの中身ですが、きちんと残っていました。
ただ、ルートボリュームを復元した際にマウントの設定が外れてしまっていたので、マウントをやり直すところから行う必要がありました。

AWS CLIでの実行


AWS CLIでも以下のコマンドで実行することができます。

$ aws ec2 create-replace-root-volume-task --instance-id i-xxxxxxxxxxxx --snapshot-id snap-yyyyyyyyyyy

こういうちょっとしたコマンドを試したい時にAWSのCloudShellは便利なのですが、ルートボリュームの置き換えはCLI v2からサポートされている機能なので、CloudShellのデフォルトのバージョンだとエラーになってしまいます。


正常に実行すると、上記のようになります。

異なるスナップショットで復元はNG

・異なるアーキテクチャのルートボリュームを復元できるのか
これについてですが、後からドキュメントをきちんと読んでみると

ボリュームを特定のスナップショットに復元する場合は、そのルートボリュームから取得したスナップショットを選択する必要があります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-restoring-volume.html#replace-root

と記述がありました。

そもそもアーキテクチャ以前の問題で、復元したいインスタンスから作成したスナップショットしか利用できません。

試しにAWS CLIで異なるスナップショットを指定してみると

Invalid snapshot for root volume for virt i-04afe648743084a79. The snapshot should be of one of the root volumes attached to the instance in the past.

というエラーメッセージが返却されました。

よくよく考えてみたらそりゃそうか。

おわりに

まとめると、
・ルートボリュームの置き換えはインスタンス無停止でできる
・再起動が発生するのでダウンタイムが生じる
・再起動なのでインスタンスストアのデータは残る
・復元には対象のインスタンスで作成したスナップショットしか使えない
 (スナップショットを取ってなかったら復旧できない)

って感じでした。

インスタンスが壊れた時に、AMIからいちいち立ち上げ直す必要が無くなりますね
ルートボリュームさえ差し替えて直る場合に限りますが・・・。

結局のところスナップショットがないとルートボリュームの置き換えは行えないので、定期的なバックアップ自体は必要になるため注意が必要ですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)