AWS CloudFormation: Scaleable Web
หลังจากที่เราได้เรียนรู้กับบทความ CloudFormation กับการใช้งานประเภทสร้าง VPC, Subnet หรือ Network Resources ทั้งหลายแล้ว
คราวนี้เรามาเรียนรู้ที่จะทําให้มัน Dynamic มากขึ้นและทําให้ Web ของเรา Scale ได้กันเถอะ ซึ่งการจะทําอย่างงั้นได้เราจะต้องเพิ่มสองสิ่งเข้าไปคือ
- Elastic Load Balancer
- Auto Scaling Group
เพื่อเอามาใช้ในการ Scale ของ EC2 instance เมื่อถึงจุดที่เรากําหนดไว้ และใช้ ELB ในการกระจาย request ไปตาม Element ต่างๆนั้นเอง
ELB Recap
ก่อนอื่นที่จะเริ่ม เรามา Recap ความเข้าใจของ ELB กันก่อน ELB ประกอบไปด้วย Load Balancer 3 แบบด้วยกัน ซึ่งก็คือ
- Application Load Balancer
ทํางานบน Network Layer 7 ที่เป็นส่วนของ Application - Network Load Balancer
ทํางานบน Network Layer 4 ที่เช็ค request จาก Network - Classic Load Balancer
ทํางานบนทั้ง Network Layer 4 และ 7 เป็น Legacy Load Balancer ที่อนาคตอาจจะปิดไป ไม่แนะนําให้ใช้
โดยวันี้สิ่งที่เราจะใช้ก็ในการทํา Scale Web Server ของเราก็คือ Application Load Balancer นั้นเอง
Application Load Balancer

ทํางานบน Network Layer 7 ที่เป็นส่วนของ Application โดยมีส่วนประกอบ 4 อย่างซึ่งก็คือ
- Listener
จะเป็นตัวคอยเช็ค requests ที่มาจาก clients โดยใช้ protocol และ port ที่เราระบุไว้แล้วส่งต่อให้ Rule - Rule
ซึ่ง Rule ที่เราสร้างขึ้นจะเป็นตัวที่คอย route requests ต่างๆไปที่ target ตัวไหน ซึ่ง Rule จะมี priority และ เงื่อนไขของมัน เช่น priority ตัวนี้ 90 สูงกว่าอีกตัวซึ่งคือ 80 ก็จะถูกทําก่อน - Target
คือ เครื่องที่เราทําการ Register ไว้สําหรับใช้งานกับ Load Balance - Target Group
โดยเราสามารถทํา Target Group ได้กับ Target หลายๆๆตัวเข้าด้วยกันด้วย protocol และ port เดียวกัน โดยประโยชน์ที่ได้มาคือเราสามารถทํา health check ด้วยกับกลุ่มนั้นๆได้อีกด้วย
Auto Scaling Group
ทีนี้หลังจากรู้ว่า ELB — ALB คืออะไรแล้ว เราก็ต้องมานึกถึงกลุ่มของ Machine ที่จะเพิ่มและลดจํานวนขึ้นเอง แน่นอนมันไม่ได้ทําด้วยการใช้ Manual process แน่นนอ
เราใช้สิ่งที่เรียกว่า Auto Scaling Group (ASG) ในการ Scale-Up หรือ Down ตาม condition ที่เราสร้างขึ้น เช่น CPU Usage เกิน 50% เป็นต้น
โดยมีโครงสร้าง Structure ตาม diagram ด้านล่างคือ

- Minimum — Maximum size
- Desired Capacity
โดยสิ่งที่เราต้องระบุคือเราจะระบุให้มันทํางานใน AZ ไหน และ ใสา VPCZone ให้ตรงกันด้วยในส่วนของ VPCZoneIdentifier และ AvailabilityZones

ซึ่งสิ่งที่ ASG จะไปทําการ Scale-Up หรือ Scale-Down ก็คือ LaunchConfiguration ที่เราใส่ไว้นั้นเอง ซึ่งเจ้า LaunchConfiguration ถ้าให้อธิบายง่ายๆมันก็คือ instance template ที่เราจะทําการสร้าง Instance ขึ้นมาเช่น InstanceType, ImageId, Security Groups และ EBS แบบไหนเป็นต้น

เพราะฉะนั้นจากเดิมในบทความที่แล้ว ที่เรารองทํา VPC และ EC2 + RDS กันด้วย CloudForamtion แล้ว ทีนี้ถ้าเราจะเปลี่ยนให้มัน Scale ด้วยได้ก็เพียงแค่ใส่
- ASG, LaunchConfiguration
- ELB — ALB, Listener, Listener Rule, TargetGroup
เข้าไปนั้นเอง โดยตัวอย่างจะอยู่ใน CloudFormation template อันนี้
File: https://hta-cloudformation-bucket.s3.amazonaws.com/ec2/full-app-with-scale-alb.json
Troubleshoot
ก่อนอื่นที่จะเริ่มอ่าน Troubleshoot เลยนะ อยากให้ยึดเรื่องของ Official Document เป็นสําคัญ ให้มากกว่า Stackoverflow หรือ Web Blog ต่างๆ เพราะว่ามันไม่อัพเดตตาม version ปัจจุบันนั้นเอง เช่น อย่างผมอ่านๆไปแล้วลองทําตามผลออกมาเป็นมันไม่รับค่าเป็น String แล้วมันรับเป็น List ของ String ทําให้เราต้องแก้ CloudFormation ให้ตรง
- ในบางทีตอนที่เราทํา AutoScalingGroup เราจะพบว่า AZ กับ SubnetID ของเรา จะได้ Error แนวๆ “The availability zones of the specified subnets and the AutoScalingGroup do not match”, “Security Group and Subnet Belongs to different networks” บางทีอาจจะเป็นเพราะว่าเกิดจากตอนที่สร้างมาแล้ว AZ มันไม่ match กับ SubnetID เรา อาจจะมีมากไปบ้าง น้อยไปบ้าง ให้เราไปแก้ไขใน AutoScalingGroup resource ให้มันตรงกัน