Deploy Nextjs บน AWS EC2 + ทำ Snapshot for Disk backup and Restore
ในบทความนี้จะทำ mission “Web Hosting Basics” จาก https://cs.fyi/guide/how-to-learn-aws
Tasks:
- Deploy a EC2 VM and host a simple “Fortune-of-the-Day ” web page.
- Take a snapshot of your VM, delete the VM, and deploy a new one from the snapshot. Basically disk backup + disk restore.
- Checkpoint: You can view a simple HTML page served from your EC2 instance.
Analyze:
จากโจทย์ผมแบ่งเป็น 2 mission หลักๆ คือ M1.ให้ทำการ deploy แอป frontend (Nextjs App) ลงบน AWS EC2, M2ทำการ backup(Snapshot) ข้อมูลใน Disk และทำการลบ VM นั้นทิ้ง และทำการสร้าง VM ใหม่ โดยให้ใช้ Disk จาก VM ที่ได้ลบไปก่อนหน้านี้ โดยจะมี 2 sub-mission ย่อย เป็นการ Snapshot via Volume และ Snapshot via Instance
Preriqusite:
- AWS account
- Application “Fortune-of-the-Day” ซึ่งผมจะใช้ Nextjs เป็น Framework
- Knowledge topic
- AWS EC2
- AWS EC2 Snapshot
*การสมัคร AWS account และการ Launch AWS EC2, การ set up network และ firewall (security group) อยู่นอกเหนือขอบเขตบนความนี้นะครับ ️🙇🏻♂️
Specification:
- Application Frontend: https://github.com/Supanut1911/Fortune-of-the-Day
- AWS EC2 instance: เลือกใช้เป็น
— t2.micro (free-tier)
— Ubuntu OS
— EBS 8 GB
M1. Deploy Nextjs on AWS
- SSH เข้าไปยัง AWS EC2 ที่ได้ทำการ launch มาก่อนหน้า
2. ลง dependencies และ install app
$ sudo apt-get update
$ git clone https://github.com/Supanut1911/Fortune-of-the-Day.git
3. ในการรัน Application ผมจะรันบน Docker conatiner (จาก Dockerfile และ docker-compose.yml )
$ sudo snap install docker
$ sudo docker compose up -d
เมื่อ build เสร็จ ใช้ sudo docker ps เพื่อดูว่า app ที่ใน container ที่เราได้สร้าง ทำงานตามปกติ หรือไม่
*ก่อนรันคำสั่ง sudo docker compose up -d เช็คให้แน่ในว่าเราได้ cd เข้าไปและอยู่ที่ path ของ project เรียบแล้ว
*Note อย่าลืม set inbound rule ที่ security group ของ EC2 instance ด้วยนะครับ
instance -> security group -> edit inbound rule
ขอผมให้ app run ที่ port 3000
4. ดูผลลัพธ์ที่ {public ip ของ EC2 instance}: {port}
Application ทำงานได้ปกติ เหมือนตอนรันใน local :)
— 🚀 MISSION 1 COMPLETE ! 🚀—
M2. Backup disk
ต่อมาจะลองทำ Snapshot (backup disk) ซึ่งเป็น service ของทาง AWS ที่เราจะสามารถนำข้อมูลทั้งหมดที่อยู่ใน disk ไปใช้ VM instance (EC2 instance) อื่น หรือสามารถใช้ในกรณีที่ VM instance นั้นเกิดความเสียหายขึ้น และเราจำเป็นต้อง launch VM instance ตัวใหม่ แต่อยากได้ข้อมูลที่มีอยู่ใน disk เดิม
Service การ Snapshot: EC2 -> Elastic Block Store section -> Snapshot
โดย type ของการทำ Snapshot มี 2 type คือ
M2.1 Snapshot via Volume
แบบ Snapshot Volume จะเป็นการ backup disk, การนำไปใช้ก็จะเป็นการ attach เพิ่มเข้าไปกับ root volum ของ EC2
❗️ type ของ device จะเป็น /dev/sdf
❗️❗️ เพื่อไม่ให้สับสน จะตั้ง size ของ EBS เป็น 10 GB และตัว Snapshot จะมีขนาด 8 GB จาก EBS ของ EC2 ก่อนหน้า
แต่พอเราเข้า SSH เข้าไปที่ EC2 instance ใหม่ ดันไม่มีข้อมูลจาก snapshot disk ที่เราได้ attach เลย (ที่คาดหวังคือเราเห็น project Fortune of the Day)
ลองเช็ค disk ด้วย
$ sudo fdisk -l
และ
$ lsblk
จะแสดง 2 disk
- /dev/xvdf คือ EBS ของ Root instance ที่ใช้ boot (red)
- /dev/xvda คือ EBS ของ snapshot (blue)
แต่เมื่อเราใช้
$ df -h
จะพบแค่ disk ของ root instance หรือ xvda ดังนั้นถ้าต้องการจะเข้าถึง volume ของ snapshot จะต้องทำการเพิ่ม volume ของตัว snapshot ซึ่งก็คือ /dev/xvdf
// ทำการ mount disk xvdf1 ไปที่ /mnt
$ sudo mount /dev/xvdf1 /mnt
result
ตัว volume จะโดน mount ไปที่ /mnt
ลอง cd เข้าไปที่ /mnt/home/ubuntu(user) ก็จะพบ app Fortune-of-the-day
เป็นอันเสร็จพิธี จบของการ restore ข้อมูลจาก Snapshot (backup disk)
M2.2 Snapshot via Instance
จะเป็นการ backup ทั้ง instance เลย (รวม volume ด้วย แต่ AWS ให้ทางเลือกเป็น optional) ซึ่งผลลัพธ์ของการ Snapshot instance จะเป็นสิ่งตั้งต้นในการทำ Image ให้ EC2 instance
select: instance snapshot > action: create image from snapshot > config การสร้าง image
ของผมจะสร้างเป็นชื่อ fortune app image
เมื่อสร้างเสร็จ image จะถูกเก็บใน EC2 > Image > AMI
ลอง Launch instance จาก image
EC2 > Launch Instance
ขั้นตอนที่เราจะต้องเลือก OS image ให้เลือก My AMIs และเลือก image ที่เราได้สร้าง (fortune app image)
เข้าไปดูใน server กันซะหน่อย
พบ application / project ตามคาด
ลองรัน application
$ cd {application-path}
$ sudo docker compose up -d
และบน browser
เป็นอันเสร็จสิ้น ทำงานได้เหมือนกับต้น VM ตั้งแต่ต้น (Mission 1) เลย ก็เป็นไปตามหลักการของการทำ Backup / Snapshot
— 🚀 MISSION 2 COMPLETE ! 🚀 —
🔅 ปล. ทั้งตัว Snapshot via Volume และ Snapshot via Instace ต่างก็ได้ผลรันเหมือนกันนะ มัดรวมมาดูทีเดียวเลยย
สรุปส่งท้าย 🙌
สำหรับบทความนี้ก็ได้ทำ missions “Web Hosting Basics” ประกอบด้วย การ deploy Frontend application บน VM instance (EC2) ของ AWS และได้ทำ Snapshot หรือ backup disk ทั้ง 2 รูปแบบ ซึ่งเพิ่มความเข้าใจในการจัดการดูแล Application, data และ server
ขอบคุณค้าบบ 🙏🏻