ทำ Auto scaling + Elastic Load Balancer บน AWS Cloud

Supanut Laddayam
6 min readOct 4, 2023

--

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 กินตังกัน

  1. เริ่มที่ตัว auto scaling => ปรับตัว group size ให้เป็น 0 ทุก capacity

2. จากนั้นก็ terminate ตัว instance ที่ EC2

3. ลบตัว Target group และตัว Load balancer

เป็นอันเรียบร้อย

Reference:

https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/tkv-create-ami-from-instance.html

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

https://aws.amazon.com/elasticloadbalancing/

--

--

No responses yet