目次
はじめに
この記事では、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以降
検証環境の紹介
検証は上記手順で行います。
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を選択しアクション
からボリュームのデタッチ
で割り当てを解除できます。
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を割り当てます。
そして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