EC2にSSHして
ssh: connect to host 13.112.***.*** port 22: Connection refused
とか言われてしまったパターンです。これはスーパーきついです。なぜならサーバにログインして操作できないので何も処置が施せないわけです。
自分は日本語で普通に検索してもこれと言った方法がわからず、英語の文献も当たってやり方を調べたので備忘録的にここに残したいと思います。
まずそもそも何が起きているのかを調べるためにAWSのEC2画面に入って当該インスタンスを選択してActionsからInstanceSettingからGet Syslogでログを確認します。 Dmsgした結果と同等のものです。
そうすると起きていることが何となく分かるわけですが、自分の場合はRailsのアプリを無理やりリリースするために/var配下をrootからec2-userの所有権に変えてしまったことが災いしておりました。
直したい・・・しかし(ログインできないので)直せない・・・ものすごい葛藤です。正直別インスタンス立てて諦めるところまで行きました。
ですが、諦めきれない人のために以下処方箋です。
簡単に言うと別インスタンスを作って、EBSボリュームを付け替えることによって操作するというやり方です。
【手順】
- 新規インスタンスを作成する(元のAmazonLinuxと同じ構成が望ましい)
- 元のインスタンスのインスタンスIDを控えてEC2の画面にあるElasticBlockStoreのVolumeから控えたインスタンスIDで検索して引っかかったボリュームを選択する
- 元のインスタンスのSyslogを再度見返してsshdより先に動いているスクリプト名を控えておく(画像参照)
- 元のインスタンスをSTOPする(こうしないと取り外せない)
- 元インスタンスのボリュームをActionからDetachする
- 続いて1.で作成したインスタンスにAttachする(この時デバイス名は/dev/xvdfとする)
- 新規作成のインスタンスにSSHでアクセスする
- Attachしたボリュームをマウントする
sudo mount /dev/xvdf1 /mnt/data -t ext4
注:マウントした先の名前と最後だけ変える
マウントしたボリュームの確認はmountコマンドで可能
- 再度元のインスタンスのSyslogと /mnt/data/etc/init.d 配下のスクリプトを見返してsshd以外に動いているスクリプトを開く(今回はrngd)
sudo vi /etc/init.d/rngd (Syslog見てsshdより前に読み込むスクリプトならどれでもOK)
起動時に実行したいスクリプトを書き込む
chown -R root.root /var
- attachしたボリュームをアンマウントする
umont /mnt/data
- EC2の管理画面に戻って当該ボリュームをdetachした後、元のインスタンスにattachするこの際のマウント先は /dev/xvda とする(そうしないと起動時ボリュームとして認識されないため)
- 元のインスタンスを起動して、Syslogを確認
これでエラーが出てないことが確認できればSSHでアクセスできると思います。ピンチのときには是非どうぞ。