Amazon Ec2

EC2RescueでLinuxインスタンスを復元しました。

はじめに

この記事では、Amazon Elastic Compute Cloud Rescue for Linux (ec2rl) を使って
SSH接続ができなくなってしまったEC2インスタンスをトラブルシューティングを行い、
接続できる状態にまで復元してみたいと思います。

EC2Rescueとは?

EC2RescueはEC2上で起動しているLinux, Windowsインスタンスに対して実行できるPythonベースのトラブルシューティングツールです。
オープンソースになっていてソースコード等はGitHubから確認することができます。

awslabs/aws-ec2rescue-linux | GitHub

このツールを使うことが想定されているケースとして以下が挙げられています。

  • syslogやyum等のパッケージマネージャのログ収集
  • リソース使用率の収集
  • カーネルパラメータやOpenSSHの診断と改善

A few generalized use cases for EC2Rescue for Linux include gathering syslog and package manager logs, collecting resource utilization data, and diagnosing/remediating known problematic kernel parameters and common OpenSSH issues.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Linux-Server-EC2Rescue.html

EC2Rescue for Linuxの対応しているOSは以下の通りになります。

  • Amazon Linux 2
  • Amazon Linux 2016.09+
  • SUSE Linux Enterprise Server 12+
  • RHEL 7+
  • Ubuntu 16.04+

また、スクリプトの実行にPython 2.7.9以上が必要になります。

  • Python 2.7.9以降 または 3.2以降

検証環境の紹介

EC2Rescueを行う環境の図

検証は上記手順で行います。
rescueインスタンスは接続できないbrokenインスタンスの代わりにEC2Rescueを実行するイメージです。

また、両インスタンスともにAMIはAmazon Linux 2を使用しています。
rescueインスタンスは、復元対象のインスタンスと同じAMIを使用し、AZも一致させる必要があります。

壊れてしまったインスタンス (broken-instance)

一応壊した手順を紹介します。
今回はec2-userでSSHできないようにauthorized_keysを丸ごと消してみました。

[root@BROKEN.com ~]# rm /home/ec2-user/.ssh/authorized_keys
rm: remove regular file '/home/ec2-user/.ssh/authorized_keys'? y
[root@BROKEN.com ~]# ll /home/ec2-user/.ssh/
total 0

EBSを付け替える

EC2Rescueを実行したいですがSSH接続できないので、
壊れたEBSをbrokenインスタンスから取り外してrescueインスタンスに割り当てます。
そしてrescueインスタンスにて壊れたEBSを復元します。

broken-instanceのEBSをデタッチ

壊れているEBSを取り外します。
brokenインスタンスを停止後、対象のEBSを選択しアクションからボリュームのデタッチで割り当てを解除できます。

AWSコンソール画面からEBSをデタッチする

rescue-instanceにEBSをアタッチ

同様の手順でrescueインスタンスで復元するために、
先ほどデタッチしたEBSをセカンダリデバイスとしてrescue-instanceに紐づけます。
その後rescueインスタンスにSSH接続して、インスタンス内でマウントを行います。

マウント用ディレクトリを作成します。

[root@RESCUE.jp ~]# mkdir /rescue

lsblkでパーティション確認後マウントします。
なぜかエラーで怒られました。

[root@RESCUE.jp ~]# mount /dev/xvdf1 /rescue
mount: /rescue: wrong fs type, bad option, bad superblock on /dev/xvdf1, missing codepage or helper program, or other error.

ログを確認するとUUIDが重複しているらしいです。
-o nouuidオプションをつけて再度マウントしてみると成功しました。

[root@RESCUE.jp ~]# dmesg | tail
# dmesgの中身
[15013.078568] XFS (xvdf1): Filesystem has duplicate UUID ~~ - can't mount

マウント後、作成しておいた/rescueをルートディレクトリにします。

[root@RESCUE.jp ~]# sudo -i
[root@RESCUE.jp ~]# for i in proc sys dev run; do mount --bind /$i /rescue/$i ; done
[root@RESCUE.jp ~]# chroot /rescue

これでマウント作業は完了です。

EC2Rescueで復元する

壊れたEBS内でEC2Rescueを実行します。

[root@RESCUE.jp /] curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz
[root@RESCUE.jp /] tar -xvf ec2rl.tgz
[root@RESCUE.jp /]# cd ec2rl-1.1.5/
[root@RESCUE.jp ec2rl-1.1.5]# ./ec2rl run

実行後ずら~っと実行結果が表示されます。
--remediateオプションで実行結果を元に復元してもらえます。

[root@ip-10-0-3-195 ec2rl-1.1.5]# ./ec2rl run --remediate

動作確認

rescueインスタンスを停止後、コンソール画面からEBSをデタッチして
brokenインスタンスに復元したEBSを割り当てます。

AWSコンソールからEBSをアタッチする

そしてbrokenインスタンスにSSH接続してみます。


       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
11 package(s) needed for security, out of 15 available
Run "sudo yum update" to apply all updates.
[ec2-user@BROKEN.com ~]$

接続できました!
紹介するのが難しいのですが消してしまっていたauthorized_keysも元通りになっていました。

[ec2-user@BROKEN.com ~]$ cat /home/ec2-user/.ssh/authorized_keys
ssh-rsa sshsshsshshshshsshsssh denet-dededenet-key

終わりに

この記事ではSSH接続できないEC2インスタンスをEC2Rescueを用いて復元する手順を紹介しました。
使う機会がなければないでよいのですが、こういったツールを公式から公開してもらえているのはありがたいと思いました。

参考にさせていただいた記事

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-instance-boot-issues/
https://zenn.dev/mid480/articles/aws-amazon-ec2-troubleshoot

返信を残す

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

CAPTCHA