ข้ามไปที่เนื้อหา

AWS Cloud Quest · แลป 5

Highly Available Web Applications — Load Balancing และ Multi-AZ

เป้าหมายของแล็บ

ออกแบบเว็บแอปให้ยังให้บริการได้เมื่อ EC2 instance หรือ Availability Zone บางส่วนมีปัญหา โดยกระจาย request ไปยัง instance ที่พร้อมให้บริการและใช้หลาย Availability Zones

แนวคิดสำคัญ

  • Availability (ความพร้อมใช้งาน): ความสามารถของระบบในการให้บริการเมื่อผู้ใช้ต้องการ
  • High Availability (HA): ลด single point of failure ด้วยการกระจายองค์ประกอบและมีทางรองรับเมื่อบางส่วนเสีย
  • Availability Zone (AZ): ตำแหน่งแยกกันภายใน AWS Region ซึ่งออกแบบให้มีความเป็นอิสระจากกันในระดับหนึ่ง
  • Elastic Load Balancing (ELB): กระจาย traffic ไปยัง targets
  • Application Load Balancer (ALB): load balancer ชั้น Application (Layer 7) เหมาะกับ HTTP/HTTPS และรองรับ routing rules
  • Target group: กลุ่ม targets เช่น EC2 instances ที่ load balancer ส่ง traffic ไป
  • Listener: รับ connection บน protocol/port ที่กำหนด เช่น HTTP 80 หรือ HTTPS 443
  • Health check: ตรวจว่า target พร้อมรับ traffic หรือไม่

สถาปัตยกรรมตัวอย่าง

ในระบบจริง อาจมี Auto Scaling group เชื่อมกับ target group และกระจาย EC2 instances ข้ามหลาย AZ เพื่อให้ระบบขยายตัวและทดแทน instance ที่เสียได้ ส่วนชั้นฐานข้อมูลและไฟล์ก็ต้องออกแบบ availability ให้สอดคล้องกันด้วย การมี ALB อย่างเดียวไม่ได้ทำให้ทุกส่วนของแอปพลิเคชัน highly available โดยอัตโนมัติ

แนวทางทำแล็บ

  1. ตรวจสอบ VPC และเลือก public subnets ในอย่างน้อย 2 Availability Zones สำหรับ ALB ตามข้อกำหนดของบริการและโจทย์
  2. ตรวจสอบว่า web server instances อยู่ใน subnets/AZ ที่ถูกต้องและแอปพลิเคชันเริ่มทำงานแล้ว
  3. สร้าง target group โดยกำหนด target type, protocol และ port ให้ตรงกับแอป
  4. ตั้ง health check path ให้ตรงกับ endpoint ที่ web server ตอบกลับได้
  5. สร้าง Application Load Balancer และเปิดใช้งาน AZ/subnets ตามโจทย์
  6. ตั้ง listener เช่น HTTP 80 หรือ HTTPS 443 และส่งต่อ request ไป target group
  7. ตรวจ security groups: ALB รับ traffic จากแหล่งที่เหมาะสม และ EC2 อนุญาต traffic จาก security group ของ ALB บนพอร์ตแอปพลิเคชัน ไม่ควรเปิด inbound ของ EC2 กว้างเกินจำเป็น
  8. ลงทะเบียน targets หรือเชื่อม ASG กับ target group ตามที่โจทย์กำหนด
  9. รอ health checks ให้ targets เป็น healthy แล้วทดสอบเข้าผ่าน DNS name ของ load balancer
  10. ตรวจว่าคำขอถูกส่งไปยัง healthy targets และทำตามขั้นตอน validation ของ Cloud Quest

Public subnet, private subnet และ security group

  • Public subnet: subnet ที่ route table มี route ไป Internet Gateway; แต่ resource จะเข้าถึงอินเทอร์เน็ตได้จริงหรือไม่ ยังขึ้นกับ public IP/การตั้งค่า route และ security group/NACL ด้วย
  • Private subnet: ไม่มี route โดยตรงจาก subnet ไป Internet Gateway สำหรับรับการเชื่อมต่อขาเข้าจากอินเทอร์เน็ตโดยตรง โดยอาจมี NAT Gateway สำหรับ outbound internet ในกรณีที่ต้องการ
  • ALB security group: อนุญาต traffic จาก client ตาม protocol/port ที่ต้องการ
  • EC2 security group: ควรรับ traffic ของแอปจาก ALB security group เท่าที่จำเป็น

อย่าสรุปว่าเพียงชื่อ subnet เป็น public หรือ private ก็เพียงพอ ต้องตรวจ route table และ security configuration จริง

High Availability กับ Scalability

  • High Availability: ลด downtime จากความขัดข้อง เช่น ใช้หลาย AZ และกระจาย traffic ไปยัง targets ที่ healthy
  • Scalability: เพิ่มหรือลด capacity เพื่อรับการเปลี่ยนแปลงของ workload
  • Elasticity: ปรับทรัพยากรขึ้น/ลงตามความต้องการได้อย่างเหมาะสม

Load balancer ช่วยกระจาย traffic และหลีกเลี่ยง targets ที่ไม่ healthy ตาม health checks แต่ไม่ได้สร้าง EC2 เพิ่มเอง เว้นแต่จะทำงานร่วมกับ Auto Scaling หรือระบบอื่นที่จัดการ capacity

จุดที่มักผิด

  • มี EC2 หลายเครื่องแต่ทั้งหมดอยู่ AZ เดียว: ยังมีความเสี่ยงจากความขัดข้องของ AZ นั้น
  • ALB มี subnets ไม่ครบตามข้อกำหนด หรือเลือก AZ ไม่ถูก
  • target group ใช้ port/path ผิด ทำให้ health checks ไม่ผ่าน
  • security group ของ EC2 ไม่อนุญาต traffic จาก ALB
  • เข้าเว็บผ่าน public IP ของ EC2 แทน DNS name ของ ALB ขณะทดสอบ load balancing
  • คิดว่า ALB สำรองข้อมูลหรือทำให้ฐานข้อมูลมี HA โดยอัตโนมัติ: แต่ละชั้นต้องออกแบบแยกกัน
  • คิดว่า load balancer เท่ากับ Auto Scaling: ALB กระจาย traffic ส่วน ASG จัดการจำนวนและสุขภาพของ EC2 instances

จำก่อนสอบ

  • ALB = Layer 7, HTTP/HTTPS, listener/rules/target groups/health checks
  • ALB ต้องเปิดใช้งานอย่างน้อย 2 AZ
  • ใช้ DNS name ของ ALB เป็นจุดเข้าเว็บ แทนการผูกผู้ใช้กับ EC2 เครื่องเดียว
  • กระจาย EC2 ไปหลาย AZ และใช้ ASG เมื่อจำเป็นต้องทดแทน/ปรับจำนวน instance
  • HA ต้องพิจารณาทุก dependency ไม่ใช่เฉพาะ web tier