การใช้ฟังก์ชัน Auto Scaling เพิ่มและลด Instance โดยอัตโนมัติใน Elastic Beanstalk

Auto scaling สามารถควบคุมการทำงานของ Instance เพื่อปรับความสมดุลให้ระบบทำงานได้อย่างต่อเนื่อง เช่น เมื่อมีการเข้าถึง Server มาเป็นจำนวนมากจน CPU Utilization มีการทำงานมากกว่าที่เราตั้งค่าไว้ Instance ก็จะถูกสร้างเพิ่มขึ้นมาให้เพียงพอต่อการใช้งานโดยอัตโนมัติ ซึ่งในบทความนี้ผมจะมาสาธิตการตั้งค่าและใช้งาน Auto scaling ใน Elastic Beanstalk ครับ

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

ครั้งนี้ผมจะมาแนะนำวิธี การใช้ฟังก์ชัน Auto Scaling เพิ่มและลด Instance โดยอัตโนมัติใน Elastic Beanstalk

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

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

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

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

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

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

ถ้าเรามี Application และ Environment ของเราแล้ว ให้ทำการสร้าง Environment ขึ้นมาใหม่โดยดูวิธีการ Copy Environment ตามลิงก์บทความนี้ได้เลยครับ (การตั้งค่า [Configure more options] ให้ดูที่ขั้นตอน ตัวอย่างการสร้าง Environment ด้านล่างนี้ครับ)

ตัวอย่างการสร้าง Environment

※Environment information
Environment name:tinnakorn-autoscale(ชื่ออะไรก็ได้)
Domain:tinnakorn-autoscale(ชื่ออะไรก็ได้)

※Platform
Platform:PHP

※Application code
เลือกวิธีอัปโหลดไฟล์ตามที่คุณต้องการ

ต่อไปคือการตั้งค่าในConfigure more optionsโดยทำตามหัวข้อดังต่อไปนี้

※หัวข้อ Capacity
คลิกปุ่มEditที่ Capacity แล้วตั้งค่าหัวข้อ Auto scaling group ดังนี้:
» Environment type:Load balanced
» Instances: Min1, Max6

เลื่อนลงมาที่หัวข้อ Scaling triggers แล้วตั้งค่าดังนี้:
» Metric:CPUUtilization
» Statistic:Average
» Unit:Percent
» Period:1
» Breach duration:1
» Upper threshold:50Percent
» Lower threshold:10Percent
» คลิกปุ่มSave


※หัวข้อ Load balancer
คลิกปุ่มEditที่ Load balancer แล้วตั้งค่าหัวข้อ Load balancer type ดังนี้:
» Load balancer type: ◉ Application Load Balancer

เมื่อตั้งค่าตามขั้นตอนด้านบนทุกอย่างเสร็จแล้ว ให้เลื่อนลงมาด้านล่างสุดและคลิกปุ่มCreate environmentจากนั้นรอระบบเริ่มต้นสักครู่ครับ


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

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

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

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

จากนั้นรอระบบ Deploy การเปลี่ยนแปลงการตั้งค่าสักครู่ หลังจากเสร็จแล้วทำขั้นตอนถัดไปได้เลยครับ

ติดตั้ง ab (Apache Bench) ในสภาพแวดล้อมการพัฒนา

Apache Bench เป็นเครื่องมือสำหรับการทดสอบStress Testโดยสามารถติดตั้งในสภาพแวดล้อมการพัฒนาอื่นที่ไม่เกี่ยวข้องกับ Instance ของ Auto scaling และทำการทดสอบการใช้งานเว็บไซต์ที่ต้องการได้

ติดตั้ง Apache Bench ด้วยคำสั่งนี้ (ให้ติดตั้งใน Server EC2 อื่น เพราะว่าหลังจากทดสอบ ab เสร็จแล้ว Instance ของ Auto scaling จะถูก Terminate โดยอัตโนมัติ)

sudo yum install httpd-tools -y

Apace Bench (ab) usage:

วิธีใช้:ab [options] [http[s]://]hostname[:port]/path
options ที่เราจะใช้ในการทดสอบคือ

ab -n [จำนวนครั้งที่มีการเข้าถึง] -c [จำนวนครั้งที่มีการเข้าถึงพร้อมกัน] [http[s]://]hostname[:port]/path

ทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab

เราจะทำการทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab

ก่อนอื่นให้เปิดหน้า Events, Health, Monitoring และ CloudWath เตรียมไว้ เพราะระหว่างการทดสอบเราจะต้องดูการเปลี่ยนแปลงในหน้าเหล่านี้ครับ

※Events
เข้ามาที่ Service Elastic Beanstalk เลือกEventsใน Environment ของเรา
ก็จะเห็นสถานะการใช้งานต่างๆ

※Health
เข้ามาที่ Service Elastic Beanstalk เลือกHealthใน Environment ของเรา
ก็จะเห็น Instance ID ที่กำลังใช้งานอยู่

※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือกMonitoringใน Environment ของเรา
แล้วดูที่กราฟCPU Utilizationสถานะการใช้งานตอนนี้คือปกติ

※CloudWath
เข้ามาที่ Service CloudWatch เลือกAll alarmsจากเมนูด้านซ้าย
และเลือกชื่อ alarms ของเราโดยให้ดูที่ช่วงเวลาที่ Last state update

เมื่อเข้ามาแล้วจะแสดงหน้าจอแบบนี้
CPUUtilization: หาก CPU มีค่ามากกว่า 50% (CPU > 50) ภายใน 1 นาทีจะมีการแจ้งเตือน (Alarm) และเมื่อมีการแจ้งเตือนขึ้นมาแล้ว Instance ก็จะถูกสร้างเพิ่มขึ้นมาอัตโนมัติ

เมื่อดูสถานการณ์จากหน้าจอเหล้านี้แล้วก็จะรู้ช่วงเวลาที่ Instance เพิ่มขึ้นมา ดังนั้นให้เปิดหน้าเหล่านี้ค้างไว้ เพราะจะเริ่มทำการทดสอบในขั้นตอนถัดไปครับ


Run command ทดสอบการเข้าถึงเว็บไซต์ของ Environment

ขั้นตอนนี้ผมจะทำการรันคำสั่ง ab เพื่อทดสอบการเข้าถึงเว็บไซต์ที่สร้างจาก Environment ใน Elastic Beanstalk

ไปที่หน้าเว็บไซต์ที่ใช้งานผ่าน Elastic Beanstalk และ Copy URL โปรเจกต์ของเรามา ในตัวอย่างนี้คือ

http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer


แล้วทดสอบการเข้าถึงแค่ 1 ครั้งโดยรันคำสั่งตามนี้ (ab -n 1 -c 1+your_project_url_eb)

ab -n 1 -c 1 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer

ถ้ารันคำสั่งไปแล้วไม่แสดงแบบนี้ให้รันคำสั่งเดิมอีกครั้ง
Output (example)

root@ip-172-31-29-58:~

[ec2-user@ip-172-31-29-58 html]$ ab -n 1 -c 1 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com (be patient).....done


Server Software:        nginx/1.20.0
Server Hostname:        tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port:            80

Document Path:          /customer
Document Length:        754 bytes

Concurrency Level:      1
Time taken for tests:   0.049 seconds
Complete requests:      1
Failed requests:        0
Total transferred:      1824 bytes
HTML transferred:       754 bytes
Requests per second:    20.61 [#/sec] (mean)
Time per request:       48.521 [ms] (mean)
Time per request:       48.521 [ms] (mean, across all concurrent requests)
Transfer rate:          36.71 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    1   0.0      1       1
Processing:    47   47   0.0     47      47
Waiting:       47   47   0.0     47      47
Total:         49   49   0.0     49      49
[ec2-user@ip-172-31-29-58 html]$


เมื่อทดสอบการเข้าถึงแค่ 1 ครั้งได้โดยไม่มี Error ใดๆ ต่อไปให้รันคำสั่งด้านล่างนี้เพื่อทดสอบการเข้าถึง 100000 ครั้งโดยรันคำสั่งตามนี้ (ab -n 100000 -c 6+your_project_url_eb)

ab -n 100000 -c 6 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer

Output (example)
ถ้ารันคำสั่งไปแล้วไม่แสดงแบบนี้ให้รันคำสั่งเดิมอีกครั้ง

ระหว่างที่ ab กำลังทำงานอยู่ CPUUtilization จะเพิ่มขึ้นเรื่อยๆ และ Instance ก็จะถูกสร้างเพิ่มขึ้นมาโดยอัตโนมัติ

root@ip-172-31-29-58:~

[ec2-user@ip-172-31-29-58 html]$ ab -n 100000 -c 6 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        nginx/1.20.0
Server Hostname:        tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port:            80

Document Path:          /customer
Document Length:        754 bytes

Concurrency Level:      6
Time taken for tests:   697.033 seconds
Complete requests:      100000
Failed requests:        3
   (Connect: 0, Receive: 0, Length: 3, Exceptions: 0)
Total transferred:      182397738 bytes
HTML transferred:       75397738 bytes
Requests per second:    143.47 [#/sec] (mean)
Time per request:       41.822 [ms] (mean)
Time per request:       6.970 [ms] (mean, across all concurrent requests)
Transfer rate:          255.54 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    1   0.5      1      41
Processing:    16   41  65.0     29    1427
Waiting:       16   41  65.0     29    1427
Total:         17   42  65.0     30    1428

Percentage of the requests served within a certain time (ms)
  50%     30
  66%     37
  75%     43
  80%     46
  90%     56
  95%     66
  98%     89
  99%    269
 100%   1428 (longest request)
[ec2-user@ip-172-31-29-58 html]$


เมื่อการทำงานของ ab เสร็จสิ้นแล้ว ให้สังเกตการเปลี่ยนแปลงของ Auto scaling ในขั้นตอนถัดไปครับ


สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนมาก

ขั้นตอนนี้ให้สังเกตการเปลี่ยน Environment ขณะที่มีการเข้าถึงจำนวนมากกว่าที่ตั้งค่าไว้ ในตัวอย่างนี้คือ (CPU > 50%)

※CloudWatch
เข้ามาที่ Service CloudWatch เลือก Alarms ของเราและดูที่ Graph
จะเห็นว่า CPUUtilization มีสถานะเป็น In alarm เนื่องจากว่ามีการใช้งานที่มากกว่า 50% เช่นจากรูปสูงขึ้นมาถึง 90.5% หรืออาจจะสูงกว่านี้ครับ (เมื่อ Instance ถูกสร้างขึ้นมาเพียงพอต่อการใช้งานแล้วสถานะจาก In alarm จะเปลี่ยนเป็น ✅ OK)

※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือก Monitoring ใน Environment ของเราและดูที่ CPU Utilization
จะเห็นว่า CPU Utilization กำลังสูงขึ้นเรื่อยๆ (ในส่วนนี้จะเกิดขึ้นระหว่าง ab กำลังทำงาน)

※Health
เข้ามาที่ Service Elastic Beanstalk เลือก Health ใน Environment ของเราและดูที่ Status
จะเห็นว่าเป็น Status:Warningถ้าแสดงข้อความ "1 out of 1 instance are impaces are inpacted. see instance health for details." คือเนื่องจากว่า CPU Utilization มีการใช้งานมากกว่า 50% ขึ้นไป Auto scaling จึงสร้าง Instance ใหม่ขึ้นมา

เมื่อ Instance ถูกสร้างขึ้นมาเพียงพอต่อการใช้งานแล้ว จะแสดงหน้าจอแบบนี้
การทดสอบครั้งนี้ไม่ว่าจะมีการเข้าถึงเป็นจำนวนมากแค่ไหน Instance ก็จะสร้างขึ้นมาได้สูงสุด 6 Instance เพราะผมตั้งค่า Auto scaling (Instance) ไว้ที่ Max:6นั่นเอง แต่ครั้งนี้ Instance สร้างขึ้นมาแค่ 4 Instance ก็เพียงพอต่อการใช้งานแล้ว

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

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

สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนน้อย

ขั้นตอนนี้ให้สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนน้อยกว่าที่ตั้งค่าไว้ ในตัวอย่างนี้คือ (CPU > 50%)
เมื่อการทำงานของ ab เสร็จสิ้น CPUUtilization จะลดลง และ Instance ก็จะ Terminate ตัวที่ไม่ได้ใช้โดยอัตโนมัติ

※CloudWatch
เข้ามาที่ Service CloudWatch เลือก Alarms ดูที่ Graph
จะเห็นว่า CPUUtilization มีสถานะเป็น ✅ OK เนื่องจากมีการใช้งานที่ต่ำกว่า 50% เช่นจากรูปลดลงมาที่ 0.617% หรืออาจจะต่ำกว่านี้ครับ

※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือก Monitoring ดูที่ CPU Utilization
จะเห็นว่า CPU Utilization ลดลงมาอยู่ในสถานะปกติแล้ว (ในส่วนนี้จะเกิดขึ้นหลังจาก ap ทำงานเสร็จแล้ว)

※Health
เข้ามาที่ Service Elastic Beanstalk เลือก Health ดูที่ Status
จะเห็นว่าเป็น Status:Warningถ้าแสดงข้อความ "No data received from 1 out of 3 instances." คือเนื่องจากว่า CPU Utilization มีการใช้งานที่ลดลงมาต่ำกว่า 50% Auto scaling จึง Terminate Instance ที่ไม่ได้ใช้ออก

เมื่อ Instance ที่ไม่ได้ใช้งานถูก Terminate ออกไปแล้ว จะเหลือแค่ Instance ที่ใช้งานอยู่เท่านั้น
ในตัวอย่างนี้คือจะเหลือ 1 Instance เพราะตัว Auto scaling จะจัดการ Instance ให้เพียงพอต่อการใช้งานให้กับเว็บไซต์ของเรา

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

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

ตรวจสอบสถานะของ Instance ใน Server EC2 ด้วย Command

ขั้นตอนนี้ผมจะตรวจสอบสถานะแต่ละ Instance ใน Server EC2 ด้วยคำสั่งtop

ระหว่างทดสอบการทำงานของ ab เราสามารถเข้ามาตรวจสอบสถานะของ Instance ที่นี่ได้
Instance ที่จะตรวจสอบคือ Instance ที่ถูกสร้างขึ้นมาหลังจาก CPU Utilization มีการใช้งานมากกว่า 50% ขึ้นไป

ก่อนอื่นให้ทำการเชื่อมต่อ Server EC2 โดยสามารถศึกษาได้ที่ลิงก์ด้านล่างนี้
ในบทความนี้ผมได้ทำการเชื่อมต่อ Server EC2 ใน VSCode ด้วยวิธีการเชื่อมต่อ EC2 ไปยัง EC2 อื่นครับ

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: การเชื่อมต่อ Server EC2

เมื่อเราเชื่อมต่อ Server EC2 ได้แล้วให้รันคำสั่งนี้ใน Terminal ของเราเพื่อตรวจสอบสถานะการใช้งานของ Instance

top

Output (example)
จากรูป เราสามารถเพิ่ม Terminal ใน VSCode และเชื่อมต่อ Server EC2 ได้หลาย Instance ตามที่เราต้องการ

ในตัวอย่างนี้ผมได้เชื่อมต่อไว้ 5 Server (หรือ 5 Instance) คือ
bash= Instance (tinnakorn-develop) ที่ใช้ติดตั้ง ab และทดสอบการทำงานของ Auto scaling (Instance) ใน Elastic Beanstalk
ssh= Instance ที่ถูกสร้างใน Elastic Beanstalk ทั้งหมด 4 Server (หรือ 4 Instance)

สรุป

การทำงานของ Auto scaling คือเมื่อมีการเข้าถึง Server มาเป็นจำนวนมากจน CPU Utilization มีการทำงานมากกว่า 50% ขึ้นไป Instance ก็จะถูกสร้างเพิ่มขึ้นมาให้เพียงพอต่อการใช้งาน

ตัวอย่างในบทความนี้ Min คือ 1 Instance เมื่อมีการเข้าถึง Server มาเป็นจำนวนน้อยหรือปกติก็จะเป็น 1 เครื่อง แต่เมื่อมีการเข้าถึง Server มาเป็นจำนวนมาก Instance ก็จะถูกสร้างเพิ่มขึ้นมาได้สูงสุด 6 Server (หรือ 6 Instance) ตามที่เราตั้งค่าไว้นั่นเอง

นอกจากนี้การทำงานของ Instance ที่ควบคุมด้วย Auto scaling จะขึ้นอยู่กับการตั้งค่าและโครงสร้างโปรเจกต์ของคุณด้วยครับ

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