ちょっと話題の記事

実行中のEC2インスタンスのルートボリュームを置き換えることが可能になりました

実行中のEC2インスタンスのルートボリューム置き換えが可能になりトラブルシューティングが容易になりました
2021.04.23

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな ネクストモード株式会社 の吉井です。

実行中の EC2 インスタンスのルートボリュームを置き換えることが可能になりました。
インスタンス停止は要りません。実行状態のまま置き換えが可能です。
すべてのパブリックAWSリージョンとAWS GovCloud(US)リージョンで利用できます。

用途

トラブルシュート用途が主だと思います。
もしかしたら、デプロイ関係で使えるかもしれませんがまだ未検証です。

  • 変更作業中のミスで起動中の EC2 インスタンスに接続できなくなった
  • 誤ってクリティカルなファイルを破損してしまった
  • 原因不明なトラブルによりシステムが停止した、直前のスナップショットに戻りたい

何ができる?

ルートボリュームの置き換えが可能になりました。
初期起動状態 (EC2 起動時に選択した AMI) に戻る方法と
任意のスナップショットを指定する方法があります。

データボリューム置き換えはこのアップデート対象外となっています。
従来通りボリュームのデタッチ~アタッチで対応してもらればと思います。

ボリューム以外はどうなる?

公式ドキュメント Replace an Amazon EBS volume に以下の記述があります。

  • インスタンスストアボリュームは、ルートボリュームが置き換えられた後でもインスタンスに接続されたまま
  • すべてのネットワークインターフェイスはインスタンスに接続されたまま
  • ネットワークトラフィックは flush される
  • パブリック IP アドレス、プライベート IP アドレス、および、DNS 名を保持
  • インスタンスプロファイルを保持

制限

同じく公式ドキュメント Replace an Amazon EBS volume によると以下です。

  • インスタンスストアボリュームは置き換えできない
  • You can't replace the root volume for metal instances

2個目の制限がよくわかりませんが、おそらくベアメタルを指しているものと思われます。

やってみた

EC2 作成

EC2 を Amazon Linux2 で新規起動しました。手順は割愛します。

EC2 に apache をインストールします。

sudo yum update -y
sudo yum install httpd -y
sudo systemctl start httpd.service
sudo systemctl enable httpd.service

テスト用に index.html を作成します。

sudo chmod 777 /var/www/html/
cat <<EOF > /var/www/html/index.html
<html>
<h2>test 000</h2>
</html>
EOF

セキュリティグループで自宅から HTTP を許可し、ブラウザで http://対象インスタンス/index.html を開いてみます。

スナップショット取得

対象 EBS のスナップショットを取得しておきます。
手順は割愛します。

初期状態に戻してみる

マネジメントコンソールで EC2 画面 を開きます。

任意の EC2 インスタンスにチェックを入れます。

アクションモニタリングとトラブルシューティングルートボリュームを置き換える をクリックします。

何も入力せずに 置き換えタスクを作成 をクリックします。

画面上部に緑色の文字で「Successfully ~~」 と表示されました。

インスタンス画面に戻って ストレージ タブを開きます。
最近のルートボリュームの置き換えタスク という項目があり、置き換えタスクが実行されていることが確認できます。

初期状態に戻ったことの確認

上図にあるように置き換えタスクが完了しているので初期状態に戻っているか確認します。

※ SSM Agent も古いバージョンに戻ってしまうらしく Session Manager で接続できませんでした。

$ rpm -qa | grep -i ssm
amazon-ssm-agent-3.0.161.0-1.amzn2.x86_64

※ ssh で対象へ接続します。

インストールした apache が消えています。

スナップショットに戻し index.html を変更

マネジメントコンソールで EC2 画面 を開きます。

任意の EC2 インスタンスにチェックを入れます。

アクションモニタリングとトラブルシューティングルートボリュームを置き換える をクリックします。

今度はスナップショット ID を指定します。
置き換えタスクを作成 をクリックします。

同じく ストレージ タブを開きます。
タスクが終わっています。

index.html を書き換えてみます。

cat <<EOF > /var/www/html/index.html
<html>
<h2>test 111</h2>
</html>
EOF

ブラウザから http://対象インスタンス/index.html を開きます。

再度スナップショットに戻します

一つ前と同じ手順です。
置き換えタスクが実行され成功したことを確認します。

ブラウザから http://対象インスタンス/index.html を開きます。

ボリュームの削除

ルートボリュームの置き換えを行うと新しいボリュームが作成されていきます。
置き換えが終わったボリュームは必ず手動で削除することを忘れないでください。

未使用のボリュームを放置すると想定しない利用料金が発生します。

AWS CLI

create-replace-root-volume-task が用意されています。

今まで EC2 のスナップショットからの復元を自前 Lambda 関数で実行しているシステムは、このアップデートでシンプルな方式に変更できるかもしれません。
復旧自動化を考えるうえで今回のアップデートは非常に有用です。
EBS ボリュームは1本にするといった事前の設計も含めて検討してみると面白いかもしれません。

まとめ

先日発表された EC2 シリアルポートアクセスと合わせてトラブルシューティング選択肢が増えたこと、復旧迅速化が実現でできることは嬉しく思います。
EC2 シリアルポートアクセスが可能になりました
EC2でシリアルポートアクセスが可能になったのでWindows Serverの緊急管理サービス(EMS)を試してみた

可用性の向上させる方法の一つが復旧時間を短縮することにあります。
また、ロールバックの容易さは本番環境に手を入れるエンジニアのプレッシャー軽減にもつながると思います。
色々な方法を試しておくことでハッピーなエンジニアライフを送ってもらえれば幸いです。

参考

EC2 enables replacing root volumes for quick restoration and troubleshooting
Replace an Amazon EBS volume

以上、吉井 亮 がお届けしました。