ทำ Auto scaling + Elastic Load Balancer บน AWS Cloud
Mission การทำ High Availability และ balance traffic request ด้วย AWS Auto Scaling Group และ Load balancer
Tasks:
- Task 1: Create an AMI from that VM and put it in an Autoscaling group so one VM always exists.
- Task 2: Put a Elastic Load Balancer in front of that VM and load balance between two Availability Zones (one EC2 in each AZ).
- Checkpoint: You can view a simple HTML page served from both of your EC2 instances. You can turn one off and your website is still accessible.
AWS components:
- AWS AMI
- AWS Launch Template
- AWS Auto Scaling Group
- AWS Elastic Load Balancer
❗️ในบทความนี้จะใช้ Fortune app จากบทความที่แล้ว (แต่จะแก้ใน docker- compose ให้ map port ออกที่ 80)
Task 1
1.1) Create an AMI from that VM
📒AMI = Amazon Machine Image
step 1:
AWS EC2 > Instances > Select the VM > Action, Image & Templates > Create Image
step2 : Fill information of image.
check the created image.
AWS EC2 > Images > AMIs
📍 เสร็จการสร้างAMI ของ fortune app
1.2) Put it in an autoscaling group so one VM always exists.
AWS EC2 > Auto scaling groups
ซึ่ง AWS บอกให้เราไปสร้าง Launch template ก่อน > Create a launch template
ซึ่งกลายเป็นว่าเราใช้ AMI ในการสร้าง Launch template
และ config ส่วนที่เหลือ (instance type, key pair, network and storage)
📍 เสร็จการสร้าง Launch template
โอเคร เมื่อสร้าง launch template เสร็จแล้วเราก็นำมาใช้สร้าง Auto scaling group กันต่อ
[Back to create ASG step 1]: ASG name & launch template
step2: config network
ในที่นี้ความนี้ผมใช้ VPC ที่มี AZ 2 zone (ap-southease-1a และ 1b)
📒Auto Scaling Group = ASG
📒Availability zone = AZ
📒Target group = tg
step3: config Elastic Load balancing
เลือกใช้เป็น Application Load balancer เพราะเราเข้าถึงตัว fortune app ด้วย HTTP / HTTPS method, Load balancer schema เลือกเป็น internet-facing และ
Listener and routing เป็น port 80 และ forward ไปที่ target group ให้กับตัว Load balancer (fortune-app-alg-tg)
เพิ่มการ Health check + Monitoring
step4: config size ของ Auto scaling group (ASG)
กำหนดค่า capacity ของ VM เพื่อบอกให้ตัว ASG เข้าใจว่าจำนวน VM ที่คาดหวังให้ up เป็นเท่าไร (Desired), ต่ำสุดคือเท่าไร (Minimum) และ สูงสุด (Maximum) ในที่นี้คือ ต้องการให้ VM รันอยู่ 1instance โดยถ้ามีการ down ยอมให้ down เหลือ 1 instance
เพิ่มการตั้งค่า scaling policy เพื่อบอกให้ ASG รู้ว่าเมื่อไรจะต้อง เพิ่มจำนวน VM (scale out) หรือ เมื่อไรต้องลดจำนวน VM (scale in) ในที่นี้คือ tracking ไปที่การทำงานของ CPU ถ้ามากกว่า / น้อยกว่า 70% จะมีการ scale
step 5 & step 6: ผมขอไม่เซ็ทตัว noti และ tag นะครับ
step 7: review และสร้าง ASG
❗️มาดูเรื่อง permission กัน ซึ่งจะต้องไป config เพิ่มเรื่องของ security group เนื่องจากตอนนี้ จะมี security group เกิดขึ้นอยู่ 2 กลุ่ม
- security group ของ Elastic Load Balancer
ที่ security group ของ Elastic Load Balancer ผมให้สามารถเข้าได้ที่ port 80
- security group ตัวแรกเป็นของ Image หรือ ที่ใช่ใน VM
ที่ security ของ VM / EC2 instance
📍 เสร็จการสร้าง Auto scaling group (ASG)
ดูผลลัพธ์ของ Task 1: โครงสร้าง infra ที่เรา set up ตอนนี้
มาเช็คดูที่ instance lists
จะมี VM ตัวใหม่สร้างขึ้นมาโดย ASG (สังเกตที่ไม่มีชื่อ)
* ซึ่งเราจะไม่ใช่ตัวเก่าที่สร้าง VM เองนะ โดยจะใช้จาก VM ที่ ASG สร้างให้
การเข้าถึงแอป เราจะไม่เข้าแอปจาก ip ของ VM อีกแล้ว โดยจะเข้าผ่าน DNS ของ Elastic Load balancer แทน
มาลอง terminate ตัว instance ดู ว่า ASG จะทำการ launch ตัว instance ให้กับมาดังค่า desired และค่า minimum ไหม
ทำการ terminate ตัว instance
จะเห็นว่าเมื่อ VM ตัวโดน terminate ไป จะมี VM ตัวใหม่ถูก launch ขึ้นมาโดยอัตโนมัติ
*ซึ่งการมี VM สร้างขึ้นใหม่ทำให้ Public IP เปลี่ยนไป แต่เราก็ไม่ต้องกำลังวลเรื่องการเข้าถึง App นั้น เพราะเราใช้ DNS ของ Elastic Load balancer ในการเข้าถึงแทน
เข้าด้วย DNS name:
จบ Task 1 เป็นที่เรียบร้อย
- ✅ สร้าง AMI => ไว้เป็น Image ของการสร้าง Launch template, ASG
- ✅ ใช้ ASG => เพื่อให้ VM จะยังคงอยู่เสมอ
Task 2
จาก task 1 ในขั้นตอนของการสร้าง Auto scaling group เราได้เลือก Availability Zone (AZ) ไว้ 2 Zone แล้ว นั่นคือ ap-southeast-1a และ ap-southeast-1b
ซึ่ง ถ้าต้องการให้ ASG สร้าง VM 2 ตัว ที่อยู่ต่างกันคนละ AZ ก็เข้าไปที่ Auto Scaling Group
AWS EC2 > Auto Scaling > edit ASG
edit ส่วนของ Group size เพิ่มเป็น desired 2 และ maximum 2
พอมาดูผล ที่ Instance จะพบว่า ASG จะเพิ่มเติม VM instance ขึ้นมาอีก 1 ตัว ซึ่งจะแยกเป็น ap-southeast-1a และ ap-southeast-1b
ซึ่งตอนที่เราเข้าไปที่ fortune app , ตัว Elastic Load balancer จะเป็นตัวเลือกให้เองว่า request จะเข้าไปที่ VM instance ของ AZ ไหน
ผลลัพธ์ตอนนี้จะได้ architecture ออกมาแบบนี้
จบ Task 2 เป็นที่เรียบร้อย
- ✅ นำ Elastic load balancer ไปขวางหน้า VM instance
📍checkpoint
และเมื่อเราลอง terminate ตัว VM instance ไปสักตัว / สัก AZ ตัว Application ก็ยังสามารถเข้าได้ปกติ เพราะตัว Elastic load balancer จะ forward traffic ไปยัง VM ที่ยังรันอยู่
Conclude
จาก Misson นี้ เราจะได้การออกแบบ architecture ให้กับ App ในด้านของการทำ High Availability คือการ deploy ตัว Application ไปในหลายๆ Availability zone ซึ่งช่วยเพิ่มการเข้าถึง request ให้รวดเร็วขึ้น และนำ Elastic load balancer มาช่วยในการจัดการ Traffic ของ request เพื่อให้แต่ละ VM แบ่ง load กันทำงานได้อย่างเหมาะสม ไม่มี instance ใด ทำงานหนักเกินไป จนทำให้ performance ลดลง
สำหรับ Mission นี้ก็ประมาณนี้ครับ …ขอบคุณค้าบบ 🙇🏻♂️
⭕️ สุดท้ายอย่าลืมลบ Service ที่เล่นกันด้วย เดี่ยวจะโดน AWS กินตังกัน
- เริ่มที่ตัว auto scaling => ปรับตัว group size ให้เป็น 0 ทุก capacity
2. จากนั้นก็ terminate ตัว instance ที่ EC2
3. ลบตัว Target group และตัว Load balancer
เป็นอันเรียบร้อย
Reference:
https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html
https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html