EC2のルートボリューム交換を試す。

# はじめに
先日、EC2のルートボリュームを**インスタンス停止無し**で復元できる機能が公開されました。

- [EC2 でルートボリュームを交換することにより、迅速な復元とトラブルシューティングが可能に](https://aws.amazon.com/jp/about-aws/whats-new/2021/04/ec2-enables-replacing-root-volumes-for-quick-restoration-and-troubleshooting/)

通常は以下の様にインスタンスを停止してデタッチ・アタッチで交換しますが、ルートボリュームをインスタンス停止無しで復元できるってどうやっているんだ？っていうことでどういう動作をしているのか確認してみました。

- [以前のスナップショットを使用した Amazon EBS ボリュームの置き換え](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-restoring-volume.html#replace-root)

# 検証準備
今回はインスタンス2台で検証してみようと思います。

1台はルートボリューム交換を試すためのインスタンス、もう1台はボリューム交換するインスタンスから`syslog`を受け取ってログ確認するためのインスタンスを準備してみます。

## syslog転送設定
syslog転送を行うための設定を行います。

送信側syslogは全てのシステムログを転送するため、「### RULES ###」直下に記載しておきます。

```shell:受信側syslog設定
$ModLoad imudp
$UDPServerRun 514
```

```shell:送信側syslog設定
#### RULES ####
*.* @[受信側インスタンスのIPアドレス]:514
```

## セキュリティグループ設定
今回は検証なので適当に。

|タイプ|プロトコル|ポート範囲|ソース|
|:--|:--|:--|:--|
|カスタムUDP|UDP|514|0.0.0.0/0|

# ルートボリューム交換検証
ルートボリュームの交換はAWSマネジメントコンソールの`EC2`から「**インスタンス**」→「**アクション**」→「**モニタリングとトラブルシューティング**」→「**ルートボリュームを置き換える**」から行います。

![capture_01052021_104510.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/d49bb621-9c40-f29b-dcc5-d5bb9c22a4f9.jpeg)

次の画面でルートボリューム置き換え先のスナップショットを指定して「**置き換えタスクを作成**」を選択します。

スナップショットを指定しない場合は使用AMIのデフォルトに戻るようです。

![capture_01052021_105015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/906d0703-88bc-9d2d-4e42-86fbe113686e.jpeg)

ちなみにコマンドで実行する場合は以下コマンドとなります。

```shell:コマンドからのルートボリューム交換
aws ec2 create-replace-root-volume-task --instance-id [インスタンスID] [--snapshot-id [スナップショットID]]
```

- [create-replace-root-volume-task](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-replace-root-volume-task.html)

# 検証結果
ログを見たところ、やはり無停止でルートボリューム交換を行っているわけでは無く、**一度停止を行ってから交換後のボリュームで起動させるような動作**を行っているようです。

ルートボリューム交換実施時に`ping`も送信してみましたが、大体40秒程度応答がありませんでした。

交換後のボリュームは、ルートボリューム交換の実行を行ったタイミングで新たに作成されるようなので、以下の様な作業を実施していると考えられます。

1. ルートボリューム置き換えタスク作成
2. 交換後ボリューム作成
3. インスタンスの停止
4. 交換前ルートボリュームのデタッチ
5. 交換後ルートボリュームのアタッチ
6. インスタンスの起動

上記の動作だけ見れば、通常のボリューム交換作業とあまり変わりがありませんが、利点としてEC2インスタンスの状態としてはルートボリューム交換実施時も「**実行中**」状態となっており、停止状態に切り替わることはありませんでした。

そのため、`EIP`の設定を行わないとインスタンス停止時に変わってしまうグローバルアドレスも、今回のルートボリュームの交換ではアドレスが変更されることもありませんでした。

以下ルートボリューム交換時に出力されたログです。

```shell:ルートボリューム交換実施時の出力ログ
May  1 02:14:13 ip-172-21-0-34 systemd: Received SIGINT.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopped target Timers.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping Timers.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping Session 8 of user root.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopped target Cloud-init target.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping Cloud-init target.
May  1 02:14:13 ip-172-21-0-34 systemd: Removed slice system-selinux\x2dpolicy\x2dmigrate\x2dlocal\x2dchanges.slice.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping system-selinux\x2dpolicy\x2dmigrate\x2dlocal\x2dchanges.slice.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping Session 2 of user ec2-user.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopped Execute cloud user/final scripts.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping Execute cloud user/final scripts...
May  1 02:14:13 ip-172-21-0-34 systemd: Removed slice system-ec2net\x2difup.slice.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping system-ec2net\x2difup.slice.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopped Dump dmesg to /var/log/dmesg.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping Dump dmesg to /var/log/dmesg...
May  1 02:14:13 ip-172-21-0-34 systemd: Stopped target rpc_pipefs.target.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping rpc_pipefs.target.
May  1 02:14:13 ip-172-21-0-34 systemd: Unmounting RPC Pipe File System...
May  1 02:14:13 ip-172-21-0-34 systemd: Stopped target Graphical Interface.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopping Graphical Interface.
May  1 02:14:13 ip-172-21-0-34 systemd: Stopped target Multi-User System.
```

# 後片付け
ルートボリューム交換前のボリュームが残ってしまうので、不要となるボリュームは削除しましょう。

# おわりに
ボリュームのデタッチ・アタッチなどの操作を行わずに、ボタン一発で指定のスナップショットや初期AMIの状態に戻せるのは良いですね。

アドレス変更等されることもないため、調査目的だけではなく、他の用途にも使えるかなと感じました。