EC2でキーペアをなくしてインスタンスに接続できないとき…

はじめに

AWSの鍵ペアをなくした!ということはまだ発生していないのだが、
SSHフォルダを削除したとか、紛失した場合に備えてメモをしておく。

環境

Windows 10 Professional
AWS (t4g.nano)

シチュエーション

下記のような状況でのシミュレーションを行う。

  • AWS EC2インスタンスを作成
  • 鍵ファイルを更新しようとしたら誤って更新の方法を間違えた。
    or 鍵ペアを紛失した

準備

シチュエーションを再現するためにインスタンスを作成した。
鍵ペアを紛失したインスタンスは test という鍵を使用している。

instance-list

現在接続ができる状態。

current-success-login

再現

インスタンスに入り、 .ssh フォルダを全て削除する。

sudo rm -fr ~/.ssh
remove-ssh-directory

もちろん接続できなくなる。
fail-login

解決方法

この状態になった場合どうすれば良いのか?
答えは、AWSのドキュメントに書いてある。

最初の起動後に SSH キーペアを紛失した場合、Amazon EC2 インスタンスに接続するにはどうすればよいですか?

参考: https://repost.aws/ja/knowledge-center/user-data-replace-key-pair-ec2

それではこの手順と同じように実施してみることにする。

1. 新しいキーペアの作成

左のメニューから「キーペア」を選び、test2 として作成する。
create-keypair

下記のように test, test2 のキーペアが一覧に表示される。
keypair-list

2. 秘密鍵から公開鍵の情報を取得する。

ローカル環境 or EC2の余ってるインスタンスで下記を実行する。

ssh-keygen -y -f /path_to_key_pair/my-key-pair.pem

Git bash があるのでこれを利用する。

ssh-keygen -y -f test2.pem > test2.pub

整理すると下記の情報を現在持っている。

test2.pub: 公開鍵  
test2.pem: 秘密鍵  

これらは接続できなくなったインスタンスに配置する用の鍵

3. EC2コンソールを開く。

4. 対象のインスタンスを停止する。

(test インスタンスを停止する。)
stop-instance

5. [アクション]、[インスタンスの設定]、[ユーザーデータを編集] の順に選択する。

edit-userdata

6. スクリプトを「ユーザーデータ」のテキストエリアに貼り付ける。

公式のソース

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
  - name: ec2-user
    ssh-authorized-keys: 
    - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAJ9hjdv0f1FZ5f4NkA22aEJ8kXhbST3SHkN6K0Ww8eN

公式のテンプレートからの変更箇所

- - name: username
+ - name: ec2-user

- - PublicKeypair
+ - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAJ9hjdv0f1FZ5f4NkA22aEJ8kXhbST3SHkN6K0Ww8eN
edit-userdata-text

7. 保存をする

8. インスタンスを起動する。

start-instance

9. cloud-init フェーズが完了したら、パブリックキーが置き換わっていることを確認する。

ログインはできた!
success-login

そして、鍵が置き換わっている(というより作成)されていることを確認。
replace-ssh-authorized-keys

10. インスタンスを停止

※インスタンスを停止しないとユーザデータを編集できないため

11. 再度「5」と同じ手順でユーザデータの編集画面に移動する

12. ユーザデータを空にして保存する。

empty-userdata

13. インスタンスを起動する。

一応再度確認しておく。
confirm

問題なさそうですね。
これで後は紛失した or 使わなくなったキーペアをAWSコンソールから削除すればよいかと思います。

参考

おわりに

ドキュメントを見ていくと他にも方法はあるようでしたが、EC2のみを使用して復旧したいなと考えていたので、こちらの方法を記載いたしました。
公式ドキュメントがそのまま復旧手順でつまずくことはなかったです。困ったらドキュメントをまずは見ようということですね。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。