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

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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

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

มีการสร้าง Application, Environment ใน Elastic Beanstalk

ถ้าเป็น Laravel แนะนำให้สร้าง Environment ตามลิงก์บทความนี้ครับ

หมายเหตุ: ถ้ามีขั้นตอนที่ซ้ำกันให้ข้ามไปได้เลยครับ

ตัวอย่างในบทความนี้ สมมติว่าผมสร้างสภาพแวดล้อมโดยใช้ชื่อดังนี้
Application:tinnakorn
Environment:tinnakorn-autoscale-schedule

การตั้งค่า Auto Scaling ขณะสร้าง Environment

ดูวิธีการตั้งค่า Auto Scaling ขณะสร้าง Environment ได้ที่ลิงก์ด้านล่างนี้ครับ
หมายเหตุ: เมื่อเริ่มต้นระบบไปแล้ว ตอนที่กลับเข้ามาตั้งค่า Capacity ใน Configuration อีกครั้ง ถ้ามีขั้นตอนที่ซ้ำกันให้ข้ามไปได้เลยครับ

ดูตัวอย่างที่นี่เฉพาะหัวข้อนี้: การตั้งค่า Auto Scaling ขณะสร้าง Environment

การตั้งค่า Scheduled action

เมื่อเริ่มต้นระบบเสร็จแล้ว ให้ทำการเปลี่ยนแปลงการตั้งค่า Scaling cooldown ตามขั้นตอนนี้ (ต้องรอจนกว่าการเริ่มต้นระบบเสร็จสิ้นแล้วค่อยทำครับ)

เลือกConfigurationจากเมนูด้านซ้ายในหน้า Environment ของเรา

ดูที่ด้านขวา คลิกEditที่ Capacity

ดูที่หัวข้อ Auto scaling group แล้วเลื่อนลงมาด้านล่างหาScaling cooldownและให้ตั้งค่าตามนี้:
» Scaling cooldown:60seconds
» เลื่อนลงมาด้านล่างสุด คลิกApply

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

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

ตัวอย่างการตั้งค่า Scheduled action นี้คือ:
» Name:EbScaleUp1035(ชื่ออะไรก็ได้)
» Instances: Min3, Max6
» Desired capacity:3(โดยปกติแล้วให้ใส่ค่าเดียวกับ Min)
» Occurrence:One-time
» Start time:2022-08-04T10:35:00ZUTC (ต้องตั้งค่าวันที่และเวลาเป็น UTC เท่านั้น ซึ่งเวลานี้จะเท่ากับ17:35ของประเทศไทย เพราะเขตเวลาประเทศไทยคือ+07)
» คลิกAdd

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

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

ตัวอย่างการตั้งค่า Scheduled action นี้คือ:
» Name:EbScaleDown1140
» Instances: Min1, Max4
» Desired capacity:1(โดยปกติแล้วให้ใส่ค่าเดียวกับ Min)
» Occurrence:One-time
» Start time:2022-08-04T11:40:00ZUTC (ต้องตั้งค่าวันที่และเวลาเป็น UTC เท่านั้น ซึ่งเวลานี้จะเท่ากับ18:40ของประเทศไทย เพราะเขตเวลาประเทศไทยคือ+07)

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


Scheduled action (Launch instances and Terminate instance)

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

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

※Terminate instance (ข้อมูลในตัวอย่างนี้)
เมื่อถึงกำหนดการ Terminate instance เช่น [10:40 UTC (หรือ 17: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และดูที่หน้า Instance
จะเห็นว่ามี Instance ถูกสร้างเพิ่มขึ้นมาตามที่แสดงใน Health เลยครับ

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

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

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

※Health
เข้ามาที่ Service Elastic Beanstalk เลือกHealthดูที่ Status
ถ้า Status:Warningแสดงข้อความ "No data received from 1 out of 3 instances." คือ Instance กำลังเริ่มทำการ Terminate ครับ

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

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

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

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

Removed Scheduled action

เลือกกำหนดการ Launch instances และ Terminate instance ของเรา
ตัวอย่างนี้คือ✅ EbScaleUp1035 (Launch instances)และ✅ EbScaleDown1140 (Terminate instance)
จากนั้นเลือกActionsและเลือกMark 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 นี้มีประโยชน์และอำนวยความสะดวกในเรื่องปรับความสมดุลการใช้งานเว็บไซต์มาก จึงนำมาเขียนลงในบทความนี้ครับ

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