[Update] ทดลองใช้ Scale up และ Scale down ตามเวลาที่กำหนดโดยใช้ฟังก์ชัน Auto Scaling ใน Elastic Beanstalk

เราสามารถใช้ฟังก์ชัน Auto Scaling ตั้งค่า Scheduled action ใน Time-based scaling เพื่อใช้งาน Scale up และ Scale down โดยควบคุมการ Launch instances และ Terminate Instance ตามวันที่และเวลาที่เราต้องการได้ ในบทความนี้จะมาแนะนำเนื้อหาไปพร้อมกับการใช้งานจริงครับ

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

สิ่งที่ต้องมี

※สร้าง Application ใน Elastic Beanstalk แล้ว

ตัวอย่างครั้งนี้จะสร้าง Application โดยใช้ชื่อดังนี้
Application: tinnakorn
ดูตัวอย่างได้ที่ลิงก์หัวข้อนี้: สร้าง Application ใน Elastic Beanstalk

สร้าง Environment สำหรับ Scale up และ Scale down ด้วย Auto Scaling

ดูวิธีการสร้าง Environment สำหรับ Scale up และ Scale down ด้วย Auto Scaling ตามลิงก์ด้านล่างนี้ครับ เนื่องจากเป็นการตั้งค่าที่เหมือนกัน

ดูตัวอย่างที่นี่: สร้าง Environment สำหรับ Auto Scaling

ตัวอย่างครั้งนี้จะสร้าง Environment โดยใช้ชื่อดังนี้
Environment name: tinnakorn-autoscale-schedule
EC2 key pair: tinnakorn-autoscale-schedule
EC2 security groups: tinnakorn-autoscale-schedule

ตั้งค่า Scheduled action

เมื่อเริ่มต้นระบบเสร็จแล้ว เริ่มตั้งค่า Scheduled action ตามด้านล่างนี้ได้เลย

ตั้งค่า Scheduled action (Scale Up)

มาที่หน้าจอ Environment ของเรา เลือก Configuration แล้วเลื่อนลงมาคลิก Edit ที่หัวข้อ "Instance traffic and scaling"

เลื่อนลงมาที่หัวข้อ Time-based scaling
・เปลี่ยน Time zone ให้เป็น Local เพื่อให้แสดงเป็นเขตเวลาของประเทศไทย (+07) หลังจากเพิ่ม Schedule เสร็จ
・จากนั้นคลิก Add scheduled action

การตั้งค่า Scheduled action นี้คือการตั้งค่ากำหนดการ Launch instances เพื่อสำรองการใช้งานเวลาที่จะมี User เข้ามาใช้งานเป็นจำนวนมาก เช่น ทางบริษัท CMTH มีโปรโมชันลดราคาสินค้า 60% ผ่านเว็บไซต์เป็นเวลา 1 ชั่วโมง โดยเริ่มขายสินค้าในราคาโปรโมชันตั้งแต่เวลา 12:40 AM จึงจำเป็นต้องเริ่ม Scale Out ตั้งแต่เวลา 12:35 AM เพื่อเตรียมความพร้อมให้กับเว็บไซต์ เพราะเราคาดการณ์ได้ว่าจะมีผู้เข้ามาซื้อสินค้าผ่านเว็บไซต์เป็นจำนวนมาก ทีนี้เราก็สามารถใช้วิธีนี้ในการรับมือกับสถานการณ์ที่จะเกิดขึ้นในอนาคตได้ครับ

ตัวอย่างการตั้งค่า Scheduled action นี้คือ:
・Name: EbScaleUp0535 (ชื่ออะไรก็ได้)
・Instances: Min 3, Max 6
・Desired capacity: 3 (โดยปกติแล้วให้ใส่ค่าเดียวกับ Min)
・Occurrence: One-time
・Start time: 2024/06/26 | 05:35 UTC (ต้องตั้งค่าวันที่และเวลาเป็น UTC เท่านั้น ซึ่งเวลานี้จะเท่ากับ 12:35 ของประเทศไทย เพราะเขตเวลาประเทศไทยคือ +07)
・คลิก Add

เมื่อตั้งค่าเสร็จแล้วจะแสดงรายละเอียดตามที่เราตั้งค่าไว้
ทีนี้ดูที่ Next occurrence จะเห็นว่าแสดงเป็นเวลาของประเทศไทย (ถ้าเราเลือก Time zone เป็น UTC ก็จะแสดงเป็นเวลา UTC)

ตั้งค่า Scheduled action (Scale Down)

ต่อไปการตั้งค่า Scheduled action นี้คือการตั้งค่ากำหนดการ Terminate instance เมื่อสถานะการใช้งานกลับมาเป็นปกติ เช่น ทางบริษัท CMTH ขายสินค้าในราคาโปรโมชันลด 60% ครบ 1 ชั่วโมงแล้ว ก็ได้ปิดการขายในราคาโปรโมชันไป แล้วหลังจากนี้ User ที่จะเข้ามาซื้อของผ่านเว็บไซต์ก็จะน้อยลง และเว็บไซต์ก็จะกลับมาเป็นปกติในเวลา 12:40 PM ทีนี้เราก็สามารถตั้งค่า Scale down เพื่อ Terminate Instance โดยอัตโนมัติด้วยการตั้งค่านี้ได้ครับ

*แต่การสาธิตครั้งนี้จะตั้งเวลา Terminate Instance หลังจากผ่านไป 5 นาทีเพื่อให้เห็นภาพรวมการทำงานของ Scheduled action มากขึ้น

ตัวอย่างการตั้งค่า Scheduled action นี้คือ:
・Name: EbScaleDown0540
・Instances: Min1, Max 4
・Desired capacity: 1 (โดยปกติแล้วให้ใส่ค่าเดียวกับ Min)
・Occurrence: One-time
・Start time: 2024/06/26 | 05:40 UTC (ต้องตั้งค่าวันที่และเวลาเป็น UTC เท่านั้น ซึ่งเวลานี้จะเท่ากับ 12:40 ของประเทศไทย เพราะเขตเวลาประเทศไทยคือ +07)
・คลิก Add

เมื่อเพิ่ม Scheduled เสร็จแล้วจะแสดงหน้าจอแบบนี้ จากนั้นเลื่อนลงมาด้านล่างสุดแล้วคลิก Apply และรอระบบ Deploy การตั้งค่า Schedule สักครู่

Scheduled action (Launch instances and Terminate instance)

เมื่อระบบ Deploy การตั้งค่า Scheduled action เสร็จแล้ว และเมื่อถึงกำหนดการ Launch instances และ Terminate instance แล้ว Time-based scaling ก็จะดำเนินการตามที่เราได้ตั้งค่าไว้ครับ

※Launch instances (ข้อมูลในตัวอย่างนี้)
เมื่อถึงกำหนดการ Launch instances เช่น [05:35 UTC (หรือ 12:35 TH)] Time-based scaling ก็จะสร้าง Instance เพิ่มขึ้นมาตามที่ตั้งค่า Desired capacity: 3 ไว้ในขั้นตอนที่แล้ว

※Terminate instance (ข้อมูลในตัวอย่างนี้)
เมื่อถึงกำหนดการ Terminate instance เช่น [05:40 UTC (หรือ 12:40 TH)] Time-based scaling ก็จะ Terminate instance ตามที่ตั้งค่า Desired capacity: 1 ไว้ในขั้นตอนที่แล้ว

ขั้นตอนถัดไปคือการ ตรวจสอบผลลัพธ์การตั้งค่า Scheduled action เมื่อถึงกำหนดการที่คุณตั้งค่าไว้แล้วเริ่มทำตามขั้นตอนถัดไปได้เลย

ตรวจสอบผลลัพธ์การตั้งค่า Scheduled action

เมื่อการตั้งค่า Scheduled action ได้เริ่มต้นไปแล้ว เราจะตรวจสอบสถานะการ Launch instances และ Terminate instance ในขั้นตอนนี้

ตรวจสอบ Instance ที่ถูกสร้างขึ้นจากการตั้งค่า Scheduled action

หลังจาก Instance ถูกสร้างขึ้นจากการตั้งค่า Schedule แล้ว เราจะตรวจสอบสถานะการดำเนินการต่างๆใน Events, Health และ Instance ดังนี้

※Health
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health ใน Environment ของเราและดูที่ Status
จะเห็นว่า Instance ถูกสร้างเพิ่มขึ้นมา 2 Instance จนครบ 3 Instance ตามที่ตั้งค่า Desired capacity: 3 ไว้ในขั้นตอนที่แล้ว

※Instance
เข้ามาที่ Service EC2 เลือก Instance และค้นหาด้วยชื่อ Environment และดูรายการ Instance
จะเห็นว่ามี Instance ถูกสร้างเพิ่มขึ้นมาตามที่แสดงใน Health

※Events
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Events ใน Environment ของเราและดูที่ Details
จะเห็นว่า Instance ถูกสร้างเพิ่มขึ้นมา 2 Instance

ตรวจสอบ Instance ที่ถูก Terminate จากการตั้งค่า Scheduled action

หลังจาก Instance ถูก Terminate จากการตั้งค่า Schedule แล้ว เราจะตรวจสอบสถานะการดำเนินการต่างๆใน Events, Health, Instance, Scheduled action ดังนี้

※Health
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health ดูที่ Status
จะเห็นว่า Instance กำลังเริ่ม Terminate

เมื่อ Terminate เสร็จแล้วจะเหลือ 1 Instance ตามที่ตั้งค่า Desired capacity: 1 ใน Scheduled action

※Instance
เข้ามาที่ Service EC2 เลือก Instance และค้นหาด้วยชื่อ Environment และดูรายการ Instance อีกครั้ง
จะเห็นว่ามี Instance ถูก Terminate ตามที่แสดงใน Health

※Events
เข้ามาที่ Service Elastic Beanstalk เลือก Events ดูที่ Details
จะเห็นว่า Instance ถูก Removed ออกไป 2 Instance

※Scheduled action
กลับเข้ามาที่การตั้งค่า Scheduled action อีกครั้ง
จะเห็นว่าหลังจากดำเนินการ Launch instances และ Terminate instance เสร็จแล้ว กำหนดการในช่อง Next occurrence จะหายไป
เมื่อตรวจสอบเสร็จแล้วถ้าไม่ต้องการใช้งานอีก ให้ทำการ Removed Scheduled action ในขั้นตอนถัดไปได้เลย

Removed Scheduled action

เลือกกำหนดการ Launch instances และ Terminate instance ของเรา
ตัวอย่างนี้คือ ✅ EbScaleUp0535 (Launch instances) และ ✅ EbScaleDown0540 (Terminate instance)
แล้วเลือก Actions และเลือก Marked as 'removed'

เมื่อแสดง Pending delete แล้ว ให้เลื่อนลงมาด้านล่างสุด แล้วคลิก Apply
เพียงเท่านี้ก็สามารถลบการตั้งค่า Scheduled action เสร็จเรียบร้อย

Recurring (Auto Scaling periodic)

เมื่อใช้ Recurring ก็จะสามารถดำเนินการในเวลาเดียวกันทุกวัน หรือ วันเดียวกันทุกสัปดาห์ได้ เนื่องจากฟังก์ชัน Auto Scaling ใน Elastic Beanstalk สามารถเปลี่ยนแปลงได้ตาม Schedule ที่ได้กำหนดไว้

เช่น ช่วงกลางดึกไม่ค่อยมีผู้ใช้งานเข้ามายังเว็บไซต์ แต่ช่วงกลางวันก็จะมีผู้ใช้งานเว็บไซต์เพิ่มขึ้น (ดูแผนภาพ) จากจำนวนการเข้าถึงนี้ เราสามารถทำการกำหนด Auto Scaling ได้ตามด้านล่างนี้

0:00- 8:00 Min 2 Max 6
8:00-22:00 Min 6 Max 10
22:00-0:00 Min 2 Max 6

กรณีนี้ให้ตั้งค่าตามด้านล่างนี้

Name: EbScaleUp0800
Instances: Min 6, Max 10
Desired capacity: 6
Occurrence: Recurring
Recurrence: 0 1 * * * (เพราะว่าเป็น Time zone +07 ก็จะเท่ากับเวลา 8.00 AM ทุกวัน)

Start time: None (Reccuring จะเริ่มต้นตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ)
End time: None (Reccuring จะดำเนินการตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ)

Name: EbScaleDown2200
Instances: Min 2, Max 6
Desired capacity: 2
Occurrence: Recurring
Recurrence: 0 15 * * * (เพราะว่าเป็น Time zone +07 ก็จะเท่ากับเวลา 22.00 PM ทุกวัน)

Start time: None (Reccuring จะเริ่มต้นตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ)
End time: None (Reccuring จะดำเนินการตั้งแต่เวลานี้ กรณีที่ไม่ได้เลือกไว้ก็จะทำการ Recurring อยู่เสมอ)

หากเราสามารถคาดคะเนสถานการณ์การเข้าใช้งานของ User ทุกวันได้ เราก็จะสามารถตั้งค่ากำหนดการ Auto Scaling เป็นระยะได้ด้วยวิธีเช่นนี้

สรุป

การสาธิตนี้ผมได้เน้นไปที่การใช้ฟังก์ชัน Auto Scaling โดยตั้งค่า Scheduled action ใน Time-based scaling ให้เหมาะสมกับการใช้งานเว็บไซต์ของเรา ซึ่งผมเห็นว่าฟังก์ชัน Auto Scaling นี้มีประโยชน์และอำนวยความสะดวกในเรื่องปรับความสมดุลการใช้งานเว็บไซต์มาก จึงนำมาแบ่งปันผ่านบทความนี้ครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง