วิธีแก้ปัญหาเมื่อทำ Keypair EC2 หาย (Linux)
Tags: awsthai, ec2, keypair
Published: 2021-10-03 18:55:50

ในกรณีที่เราทำ Keypair ที่ใช้ Access EC2 หายสามารถแก้ปัญหาอย่างไรได้บ้าง

## Setup
* สร้าง Instance ที่ 1 ด้วย Keypair ชุดที่ 1 ซึ่งจะสมมุติให้เครื่องนี้เป็นเครื่องที่ Keypair หายไป และนำสร้างไฟล์ ImportantFile.txt ไว้ เพื่อเป็นตัวอย่าง
* สร้าง Instance ที่ 2 ด้วย Keypair ชุดที่ 2 ซึ่งจะเป็นเครื่องที่ใช้เพื่อการแก้ปัญหาเมื่อเราไม่สามารถเข้าถึงเครื่องที่ 1 ได้ (ในในกรณีที่ 3)
![2 Instances](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hyt680ksvru9rzwsprez.png)
* Keypair ชุดใหม่สำหรับเครื่องที่ 1 โดยจะต้องนำ public key ของ keypair ไปใส่ไว้ใน ~/.ssh/authorized_keys แทนที่อันเดิม

## วิธีแก้ปัญหาแบบที่ 1 ใช้ Session Manager
วิธีนี้ใช้สำหรับกรณีที่ OS ที่เราใช้มีการติดตั้ง System Manager Agent ไว้ไม่ว่าจะเป็นการติดตั้งแบบ Manual หรือเราเลือก AMI ของ OS ที่มี SSM Agent อยู่แล้ว เช่น
* Amazon Linux , Amazon Linux 2
* Ubuntu 16.04, 18.04 และ 20.04

โดยปกติแล้วถ้าเราไม่ได้สร้าง Instance Profile ที่มี Policy ที่เหมาะสมไว้ จะไม่สามารถใช้งาน Session Manager ได้ 
![Cannot use Session Manager without SSM Policy](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kacyb4rom4wsc951ry1j.png)

โดยในเบื้องต้นสามารถสร้าง Role ที่มี Policy AmazonSSMManagedInstanceCore ใน IAM
![AmazonSSMManagedInstanceCore Policy](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6q99xaa67wggrr51ocf1.png)
และทำการ Attach Role ให้กับเครื่อง EC2 ที่เราทำ Keypair หายไป โดยเลือก Action > Security > Modify IAM Role
![Attach Role](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ra5uv9uxd9nmj0wtzuy.png)

หลังจาก Attach Role แล้วรอซักพัก (10 นาทีโดยประมาณ) จะสามารถกด Connect > Session Manager แล้วเชื่อมต่อเข้าไปที่เครื่องได้
![Session Manager Connectable](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wbu5xqj99pv8tf9d2kyw.png)

เมื่อเข้าไปแล้วเราจะเป็น user ssm-user สามารถเปลี่ยนเป็น user อื่นๆด้วยคำสั่ง sudo su <username> แล้วเข้าไปเปลี่ยน keypair ด้วย keypair ที่เตรียมไว้ได้เลย (/home/<user>/.ssh/authorized_keys)
![Session Manager](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bg3otraotmb4nq1oja3d.png)

## วิธีแก้ปัญหาแบบที่ 2 ใช้ EC2 Serial Console
เมื่อช่วงต้อนปี 2021 AWS เปิดให้ EC2 Serial Console เป็น GA แล้ว ([Link](https://aws.amazon.com/about-aws/whats-new/2021/03/introducing-ec2-serial-console/)) ดังนั้นถ้าเครื่องที่ Keypair หายมีการตั้ง password root user ไว้ (`sudo passwd root`) จะสามารถที่จะเข้าเครื่อง EC2 ที่เป็น Nitro ผ่านหน้า Console ได้เลย

สำหรับใครที่ยังไม่เคยเปิดใช้งาน EC2 Serial Console สามารถเข้าไปเปิดก่อนได้ โดยจะขึ้นข้อความแจ้งไว้ตามรูป 
![EC2 Serial Access Disabled](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9tbk99rtufvix0dmdo7v.png)
เมื่อกด Manage Access ให้ไปเลือก Allow เพื่อเปิดใช้ EC2 Serial Console
![Allow EC2 Serial Console](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cdx8gicelc2qqr4mw4ot.png)

จากเครื่องตัวอย่างที่สร้างไว้เป็น t2.micro ซึ่งไม่ใช่ Nitro จะไม่สามารถใช้งาน EC2 Serial Console ได้ ดังนั้นเราจะต้องเปลี่ยน Instance Type ก่อน
![T2 Cannot Access via Serial](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2m8ryrtupnfqk0hh946.png)
จากตัวอย่างจะเปลี่ยน Instance Type เป็น T3.Micro แทน
![Change to T3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i0gs4espdlim3e030mqp.png)
เมื่อเปลี่ยน Instance Type เป็น T3 จะสามารถใช้งาน Serial Console ได้
![T3 can use serial console](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sngnq4vj9ok76iufz9ki.png)

เมื่อต่อเข้ามาครั้งแรกจะเจอ จอดำๆ ไม่ขึ้นอะไรเลย ไม่ต้องตกใจ ถ้าใครเคยใช้ Linux แบบเครื่องเปล่าๆ จะรู้ว่าเครื่องกำลังถาม user อยู่ (ลองกด Enter ดูสักทีจะขึ้น Message ให้ใส่ Username ตามรูป)
![Login to EC2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqkxl7d0r1koo3e6fihr.png)
เมื่อใส่ Username และ Password แล้วก็สามารถเข้าไปเปลี่ยน Keypair ที่ authorized_keys ได้ตามสะดวก
![Change authorized_keys](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cjrt0vm06q3mnbjo9lkk.png)

## แบบที่ 3 แก้ผ่านเครื่องอื่นด้วยการ mount volume EBS
ในกรณีที่ไม่สามารถตั้งค่า SSM ได้ และไม่สามารถใช้ EC2 Serial Console ด้านบนได้ ถ้าเครื่องที่ทำ Keypair หายมี Root Volume เป็น EBS สามารถที่จะใช้วิธีการ Detach EBS Volume ของเครื่องนั้นๆ ไป Attach เข้ากับอีกเครื่อง (เครื่องที่ 2) และทำการแก้ keypair ได้ โดยมีขั้นตอนต่อไปนี้
* Stop Instance ของเครื่องที่ Keypair หายไป แล้วทำการ Detach Volume
![Detach Volume](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kyyglpd645h35pbqnrp.png)
* นำ Volume ที่ถูก Detached ออกมาไป Attach เป็น Volume ที่ 2 ของเครื่องใหม่ (ในตัวอย่าง เครื่องที่ 2 ไม่ได้ปิดเครื่องอยู่)
![Attach Volume](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/epbwmyq9iz1bg8y4pvb5.png)
*เมื่อเครื่องที่ 2 มี 2 Volume แล้วให้ทำการ SSH เข้าไปที่เครื่องที่ 2 
![2 Volumes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/av3lsrsn2fkzk4tq20u2.png)
* ใช้คำสั่ง `lsblk -f` ดูข้อมูล Volume ซึ่งจากตัวอย่างจะมี Volume /dev/xvdf เพิ่มขึ้นมา โดยมี partition xvdf1 อยู่แล้ว แต่ถ้าสังเกตุช่อง UUID จะเห็นว่ามี UUID ซ้ำกัน เนื่องจากทั้ง 2 Volume ถูกสร้างขึ้นมาจาก AMI ตัวเดียวกัน (Amazon Linux2) ดังนั้นการ mount จะต้องใช้ option nouuid ด้วย
![lsblk -f](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7llkzka7y0un3hx04mwl.png)
* ทำการสร้าง Folder และ mount volume ด้วยคำสั่ง `sudo mount -t xfs -o nouuid /dev/<partition_name> <mount_point>` และทำการตรวจสอบด้วย `lsblk -f` อีกครั้ง
![Success mount](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/45ya6icbkboxggtj56u5.png)
* เข้าไปที่ /<mount_point/home/<username>/.ssh เพื่อแก้ไข authorized_keys 
![Change keypair](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q9hjrpt7ajpta4mnehag.png)
* ทำการ Unmount ด้วยคำสั่ง `sudo umount <mount_point>
![Umount](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2m5emoxja6vin2smudd4.png)
* ทำการ Detach และ Attach กลับไปยังเครื่องที่ 1 ที่ Keypair หายไป โดยในขั้นตอนการ Attach ให้เลือก Device เป็น /dev/xvda เพื่อให้ตรงกับ Root Volume เดิม และทำการตรวจสอบใน Instance Summary > Storage
![Reattach Volume to old instance](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wan0vj9k81s3uvz3z15g.png)
* ทำการ Start Instance ของเครื่องที่ 1 กลับขึ้นมาเพื่อใช้งาน


## ทดสอบ SSH ด้วย Keypair ใหม่
ไม่ว่าจะแก้ไขด้วยวิธีการใดใน 3 ขั้นตอนด้านบน เมื่อเปลี่ยน authorized_keys แล้วเราจะสามารถ SSH เข้าไปใหม่ด้วย Keypair ใหม่ได้
![SSH back to Instance](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eu840n5nz9tx6ded6c7j.png)