ELB & Auto Scaling Groups
Load balancing & elastic scaling for EC2
01แนวคิดพื้นฐาน: High Availability & Scalability
ก่อนเข้าเรื่อง ELB และ ASG ต้องเข้าใจสองคำนี้ก่อน Scalability คือความสามารถในการรองรับ load ที่เพิ่มขึ้น ส่วน High Availability (HA) คือการทำให้ระบบยังทำงานต่อได้แม้บางส่วนล่ม (เช่น AZ ล่ม) ทั้งสองมักทำงานคู่กันแต่เป็นคนละแนวคิด
Scalability มี 2 แบบ
High Availability มักหมายถึงการรัน application อย่างน้อย 2 AZ เป้าหมายคือรอดจาก data center / AZ failure ส่วน ELB และ ASG เป็นเครื่องมือหลักที่ทำให้ได้ทั้ง scalability และ HA พร้อมกัน
02Elastic Load Balancer (ELB) ภาพรวม
Load Balancer คือ server ที่กระจาย traffic ไปยัง backend (EC2 instances) หลายตัว ประโยชน์คือกระจาย load, เปิด single point of access (DNS), จัดการ failure ของ instance ได้อย่าง transparent, ทำ regular health checks, และ terminate SSL/TLS
ELB เป็น managed load balancer ของ AWS ดูแล availability และ scaling ให้เอง integrate กับ EC2, ASG, ECS, ACM (certificates), CloudWatch, Route 53 และอื่น ๆ มี 4 ชนิด
- Application Load Balancer (ALB) — Layer 7 (HTTP/HTTPS/gRPC/WebSocket)
- Network Load Balancer (NLB) — Layer 4 (TCP/UDP/TLS), performance สูง
- Gateway Load Balancer (GLB) — Layer 3 (IP packets), สำหรับ network appliances
- Classic Load Balancer (CLB) — legacy (Layer 4 และ 7), AWS แนะนำให้เลิกใช้
03Application Load Balancer (ALB) เจาะลึก
ALB ทำงานที่ Layer 7 เหมาะกับ HTTP/HTTPS micro-services และ container-based applications จุดเด่นคือ routing ที่ฉลาดและรองรับ target หลายแบบ
Listeners & Rules — routing ฉลาดได้แค่ไหน
- Path-based routing — route ตาม URL path เช่น /users -> target group A, /posts -> target group B
- Host-based routing — route ตาม hostname เช่น api.example.com vs www.example.com
- Query string / header-based routing — route ตาม query parameter หรือ HTTP header
- Routing actions — forward, redirect (เช่น HTTP -> HTTPS), fixed-response
Target Groups — ปลายทางของ ALB
- Instance — EC2 instances (รองรับใช้กับ ASG ได้)
- IP address — ต้องเป็น private IP (รองรับ on-premises ผ่าน Direct Connect/VPN, peered VPC)
- Lambda function — request ถูกแปลงเป็น JSON event ส่งเข้า Lambda
- Application Load Balancer — กรณี ALB เป็น target ของ NLB
Routing algorithm default ของ ALB คือ round robin สามารถเปลี่ยนเป็น least outstanding requests ได้ (เหมาะเมื่อแต่ละ request ใช้เวลาประมวลผลต่างกันมาก)
04Network LB (NLB) & Gateway LB (GLB)
Network Load Balancer (NLB)
NLB ทำงานที่ Layer 4 (TCP, UDP, TLS) ออกแบบมาเพื่อ performance สูงสุด รองรับได้ระดับล้าน requests/วินาที latency ต่ำมาก (~100 ms vs ~400 ms ของ ALB)
- มี static IP per AZ และรองรับการ assign Elastic IP (ข้อได้เปรียบเหนือ ALB)
- Target types: instance, IP, และ Application Load Balancer
- Health check รองรับทั้ง TCP, HTTP, HTTPS
- ใช้ flow hash algorithm ในการกระจาย traffic
Gateway Load Balancer (GLB)
GLB ใช้สำหรับ deploy, scale, manage third-party network virtual appliances เช่น firewalls, IDS/IPS, deep packet inspection ทำงานที่ Layer 3 (Network layer, IP packets) ใช้ GENEVE protocol บน port 6081. มันทำหน้าที่ทั้ง transparent network gateway และ load balancer ส่ง traffic ผ่าน appliance ก่อนถึงปลายทาง
05เปรียบเทียบ Load Balancer ทั้ง 4 ชนิด
ตารางสรุปที่ออกสอบบ่อยที่สุด อ่านให้ขึ้นใจ เพราะข้อสอบเกือบทุกชุดมีคำถามแนว "เลือก LB ให้เหมาะกับ scenario"
| คุณสมบัติ | ALB | NLB | GLB | CLB |
|---|---|---|---|---|
| OSI Layer | 7 (HTTP/S) | 4 (TCP/UDP/TLS) | 3 (IP/GENEVE) | 4 & 7 (legacy) |
| Static IP | ไม่ (DNS name) | ใช่ (per AZ + EIP) | ไม่ | ไม่ (DNS name) |
| Path/Host routing | ได้ | ไม่ได้ | ไม่ได้ | ไม่ได้ |
| Target: Lambda | ได้ | ไม่ได้ | ไม่ได้ | ไม่ได้ |
| Cross-zone default | เปิด (ฟรี) | ปิด (มีค่า) | ปิด (มีค่า) | เปิด (ฟรี) |
| Use case | web/microservice | high perf, TCP/UDP | firewall/IDS appliance | อย่าใช้ของใหม่ |
06Sticky Sessions, Cross-Zone, SSL/TLS & SNI
Sticky Sessions (Session Affinity)
Sticky sessions ทำให้ client เดิมถูกส่งไป instance เดิมเสมอ ใช้ได้กับ CLB และ ALB ผ่าน cookie. มีกับดักว่าอาจทำให้ load ไม่สมดุล
SSL/TLS & SNI
ELB terminate SSL ได้โดยใช้ X.509 certificate (จัดการผ่าน ACM). SNI (Server Name Indication) แก้ปัญหาการ load หลาย SSL certificate บน server เดียว โดย client ระบุ hostname ใน TLS handshake. SNI รองรับเฉพาะ ALB และ NLB (และ CloudFront) ไม่รองรับ CLB
07Connection Draining (Deregistration Delay)
Connection Draining (ชื่อใน CLB) หรือ Deregistration Delay (ชื่อใน ALB/NLB target group) คือเวลาที่ ELB ให้ in-flight requests ทำงานจนเสร็จ ก่อนจะถอด instance ที่กำลัง draining/deregistering หรือ unhealthy ออกจริง
- ระหว่าง draining ELB จะ หยุดส่ง request ใหม่ ไปยัง instance นั้น แต่ปล่อยให้ request เดิมเสร็จ
- ค่า default = 300 วินาที, ตั้งได้ระหว่าง 0 ถึง 3600 วินาที
- ตั้งเป็น 0 = ปิด feature นี้ (ตัด connection ทันที)
08Auto Scaling Group (ASG) พื้นฐาน
Auto Scaling Group (ASG) จัดการการ scale out/in EC2 instances อัตโนมัติ เป้าหมายคือรักษาจำนวน instance ตาม load, ลงทะเบียน instance ใหม่กับ load balancer ให้อัตโนมัติ, และ replace instance ที่ unhealthy. ตัว ASG เองฟรี จ่ายแค่ค่า resource ที่ launch
ค่าหลัก 3 ตัว
- Minimum capacity — จำนวน instance ขั้นต่ำที่ต้องมีเสมอ
- Desired capacity — จำนวนที่ ASG พยายามรักษาในภาวะปกติ
- Maximum capacity — เพดานบนที่ scaling จะปรับ desired ขึ้นไปได้
Launch Template (แทน Launch Configuration)
ASG ต้องมี template บอกว่าจะ launch instance แบบไหน (AMI, instance type, EC2 user data, EBS, security groups, key pair, IAM role). AWS แนะนำให้ใช้ Launch Template แทน Launch Configuration (legacy)
| คุณสมบัติ | Launch Template | Launch Configuration |
|---|---|---|
| สถานะ | แนะนำ (ปัจจุบัน) | legacy (ไม่แนะนำ) |
| Versioning | มี (สร้างหลาย version) | ไม่มี (immutable) |
| Multiple instance types | ได้ | ไม่ได้ |
| Mix On-Demand + Spot | ได้ (mixed instances policy) | ไม่ได้ |
| T2/T3 unlimited | รองรับ | ไม่รองรับ |
09Scaling Policies
ASG ปรับ desired capacity ได้หลายวิธี เลือกให้ตรงกับ scenario
Metrics ที่ใช้ scale บ่อย: CPUUtilization, RequestCountPerTarget (ต่อ instance ของ ALB target), Average Network In/Out, หรือ custom CloudWatch metric
10Cooldown, Lifecycle Hooks & Health Checks
Cooldown Period
Cooldown (default 300 วินาที) เป็นช่วงหลังเกิด scaling activity ที่ ASG จะไม่ launch/terminate เพิ่ม เพื่อให้ metric ปรับตัวนิ่ง ป้องกัน scale ซ้ำซ้อน. Tip: ใช้ AMI ที่ติดตั้งของพร้อมแล้ว (golden AMI) เพื่อให้ instance boot เร็ว ลดเวลาที่ต้องรอใน cooldown
Lifecycle Hooks
Lifecycle hooks ให้ instance หยุดที่สถานะ wait ก่อนเปลี่ยนสถานะ เพื่อทำงานเตรียม/ทำความสะอาด
- Pending:Wait — ก่อน instance เข้า InService (ติดตั้ง config, ดึงข้อมูล, warm-up)
- Terminating:Wait — ก่อน instance ถูก terminate (drain logs, ดึงข้อมูลออก, debug)
Health Checks ใน ASG
- EC2 status checks (default) — ตรวจระดับ instance/hypervisor เท่านั้น
- ELB health checks — ถือ unhealthy เมื่อ target group health check fail (ตรวจถึง application layer)
- Custom health check — ส่งสถานะเข้ามาเองผ่าน API/CLI (SetInstanceHealth)
11ตัวอย่าง CLI & Config
ตัวอย่าง command ที่เกี่ยวข้อง (ระดับที่ออกสอบมักเป็นแนวคิดมากกว่า syntax เป๊ะ แต่ควรคุ้นรูปแบบ)
สร้าง ASG ด้วย launch template
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-asg \
--launch-template LaunchTemplateName=my-template,Version='$Latest' \
--min-size 2 \
--max-size 10 \
--desired-capacity 2 \
--vpc-zone-identifier "subnet-aaa,subnet-bbb" \
--target-group-arns arn:aws:elasticloadbalancing:...:targetgroup/my-tg/abc \
--health-check-type ELB \
--health-check-grace-period 300Target tracking policy (รักษา CPU 50%)
{
"TargetValue": 50.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ASGAverageCPUUtilization"
}
}aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-asg \
--policy-name cpu50-target-tracking \
--policy-type TargetTrackingScaling \
--target-tracking-configuration file://config.jsonเพิ่ม lifecycle hook (Terminating:Wait)
aws autoscaling put-lifecycle-hook \
--lifecycle-hook-name drain-logs-hook \
--auto-scaling-group-name my-asg \
--lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING \
--heartbeat-timeout 300คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ ELB & Auto Scaling Groups
21 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.บริษัทรัน HTTP/HTTPS web application และต้องการ route traffic ไปยัง microservices ต่างกันตาม URL path (เช่น /users vs /orders) ควรใช้ Load Balancer ชนิดใด?
2.แอปต้องการ static IP per Availability Zone และรองรับ throughput สูงระดับล้าน requests/sec ที่ latency ต่ำมาก (TCP) ควรใช้อะไร?
3.ใน ALB การส่ง client IP จริงไปยัง backend instance ทำได้อย่างไร?
4.Sticky sessions (session affinity) ของ ALB ใช้กลไกอะไรในการผูก client กับ instance เดิม?
5.Cross-zone load balancing ของ ALB มีลักษณะอย่างไรเรื่องการกระจาย traffic และค่าใช้จ่าย?
6.ต้องการ terminate SSL/TLS หลายโดเมน (multiple certificates) บน ALB ตัวเดียว โดย client เลือก cert ตาม hostname ต้องใช้อะไร?
7.Deregistration delay (connection draining) มีหน้าที่อะไร?
8.ใน Auto Scaling Group ค่าใดเป็นจำนวน instance ที่ ASG พยายามรักษาไว้ในภาวะปกติ?
9.ต้องการให้ ASG รักษา average CPU utilization ของ group ไว้ที่ 50% โดยไม่ต้องกำหนด threshold ขึ้น/ลงเอง ควรใช้ scaling policy ใด?
10.ทีมรู้ว่าทุกวันศุกร์ 18:00 มี traffic peak จึงอยากเพิ่ม capacity ล่วงหน้าตามเวลา ควรใช้อะไร?
11.ก่อนที่ instance ใหม่จะเข้าสถานะ InService ต้องการรันสคริปต์ติดตั้ง config และดึงข้อมูลก่อน หรือก่อน terminate ต้องการ drain logs ควรใช้อะไรใน ASG?
12.Health check grace period ใน ASG มีไว้เพื่ออะไร?
13.ASG ควรใช้ health check แบบใดเพื่อตรวจว่า application ตอบสนองได้จริง ไม่ใช่แค่ instance ยังรันอยู่?
14.AWS แนะนำให้สร้าง EC2 instance config สำหรับ ASG ด้วยอะไร แทนของเดิมที่ deprecated?
15.คุณต้องการ scale อย่างละเอียดตามขนาดของการเบี่ยงเบน metric เช่น CPU 60-70% เพิ่ม 1 instance แต่ CPU >70% เพิ่ม 3 instances ควรใช้ policy ใด?
16.GLB (Gateway Load Balancer) ทำงานที่ Layer ใด และใช้ protocol อะไรในการส่ง traffic ไป appliance?
17.NLB ต้องการให้ target ทุกตัวรับ traffic เท่ากันข้าม AZ แต่ทีมพบว่า traffic ไม่สมดุล สาเหตุที่เป็นไปได้และวิธีแก้คือ?
18.Default cooldown period ของ ASG (simple scaling) คือเท่าไร และมีหน้าที่อะไร?
19.ALB target group รองรับ target type แบบใดบ้าง?
20.ใน scenario ASG ใช้ launch template และต้องการให้รองรับทั้ง On-Demand และ Spot Instances แบบผสมเพื่อลดต้นทุน ต้องทำอย่างไร?
21.ALB routing algorithm แบบ default คืออะไร และมีทางเลือกอะไรอีก?