EC2のキーペアを失くしたので設定しなおしてみた

2022.10.30

個人検証用のAWSアカウントで利用しているキーペアを失くしたのでその時の対応ブログです。
SSMが利用できる場合はSSM接続などをして公開鍵を設定しなおせばよいですが、できない場合どうやるのか気になったのでやってみました。

参考

AWSの公式ブログを参考にしています。

こちらのブログを読むと、新しく公開鍵、秘密鍵を作成してユーザーデータを利用して秘密鍵を設定しなおす手順になっています。
マネジメントコンソールからやる手順になっていますがAWS CLIを使用してやってみました。

環境

  • SSH接続先OS:Amazon Linux2
  • SSHができるようにセキュリティグループにIPアドレスが設定されている環境になります
  • EC2の起動している場所はパブリックサブネットになります
  • ローカルPCはWindows10を使用しています
  • AWS CLI:2.7.22

手順

1. 新しい秘密鍵と公開鍵を作成

SSHに利用する秘密鍵と公開鍵を作成します。
コマンドプロンプトを起動して以下のコマンドを実行します。

ssh-keygen -t rsa -f ./id_rsa

ssh-keygenコマンドでタイプにrsaを選択して鍵を作成しています。
コマンドを実行すると以下のようにパスフレーズの設定を聞かれますが何も入力せずにEnterで進んでください。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

2. 対象EC2の停止

既にEC2を停止している場合はこちらの手順は不要になります。
コマンドプロンプトで以下のコマンドを実行して対象EC2を停止します。

aws ec2 stop-instances --instance-ids 対象EC2のID

3. ユーザデータの設定

対象のEC2が停止したらユーザデータを設定します。
UserData.txtというテキストファイルを作成して以下のテキストを入力します。

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-rsa ..

14行目のec2-userは公開鍵を設定しなおすユーザになります。環境によって変更してください。
16行目のssh-rsaとなっている部分は設定する公開鍵を入力します。
ファイルを作成したら以下のコマンドをコマンドプロンプトで実行してbase64エンコードします。

certutil -encode UserData.txt tmp.b64 && findstr /v /c:- tmp.b64 > UserData.base64.txt

base64エンコード後、modify-instance-attribute コマンドでユーザデータに設定を行います。

aws ec2 modify-instance-attribute --instance-id 対象EC2のID --attribute userData --value file://UserData.base64.txt

コマンドの実行に成功すると出力は特に出てきません。
以下のコマンドを実行するとbase64エンコード済のユーザデータが出力されます。

aws ec2 describe-instance-attribute --instance-id 対象EC2のID --attribute userData

4. EC2の起動

コマンドプロンプトで以下のコマンドを実行してEC2を起動します。

aws ec2 start-instances --instance-ids 対象EC2のID

5. SSH接続

設定した公開鍵の対になる秘密鍵を使用してSSHをしてみます。
コマンドプロンプトで以下のコマンドを実行します。

ssh -i id_rsa ec2-user@対象EC2のIPアドレス

さいごに

ユーザデータで設定する方法以外もあるので気になる方は以下のAWS公式ブログをご確認ください。