[Update] การใช้ฟังก์ชัน Auto Scaling เพิ่มและลด Instance โดยอัตโนมัติใน Elastic Beanstalk
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
Auto scaling สามารถควบคุมการทำงานของ Instance เพื่อปรับความสมดุลให้ระบบทำงานได้อย่างต่อเนื่อง เช่น เมื่อมีการเข้าถึง Server มาเป็นจำนวนมากจน CPU Utilization มีการทำงานมากกว่าที่เราตั้งค่าไว้ Instance ก็จะถูกสร้างเพิ่มขึ้นมาให้เพียงพอต่อการใช้งานโดยอัตโนมัติ
สิ่งที่ต้องมี
※สร้าง Application ใน Elastic Beanstalk แล้ว
ตัวอย่างครั้งนี้จะสร้าง Application โดยใช้ชื่อดังนี้
Application:tinnakorn
ดูตัวอย่างได้ที่ลิงก์หัวข้อนี้: สร้าง Application ใน Elastic Beanstalk
สร้าง Environment สำหรับ Auto Scaling
ตัวอย่างครั้งนี้จะสร้าง Environment โดยใช้ชื่อดังนี้
Environment:tinnakorn-autoscale
ดูตัวอย่างเพิ่มเติมได้ที่ลิงก์บทความและตัวอย่างตาม Step ด้านล่างนี้ (สำหรับผู้ใช้งานที่รู้วิธีการสร้าง Environment อยู่แล้วข้ามขั้นตอนนี้ไปได้เลย)
ครั้งนี้จะสร้าง Environment โดย Deploy Laravel ใน Elastic Beanstalk และเชื่อมต่อกับ RDS ดังนี้
Step 1: Configure environment
หัวข้อ Environment information
・Environment name:tinnakorn-autoscale
(ชื่ออะไรก็ได้)
・Domain:tinnakorn-autoscale
(ชื่ออะไรก็ได้)หัวข้อ Platform
・Platform:PHP
หัวข้อ Application code
・เลือกวิธีอัปโหลดไฟล์ตามต้องการ (ครั้งนี้จะใช้โปรเจกต์ Laravel)・คลิก
Next
Step 2: Configure service access
หัวข้อ Service access
・Service role:Use an existing service role
・Existing service roles:aws-elasticbeanstalk-service-role
・EC2 key pair:tinnakorn-autoscale
・EC2 instance profile:aws-elasticbeanstalk-ec2-role
・คลิกNext
Step 3 - optional: Set up networking, database, and tags
Step นี้ระบุว่า "optional" จึงไม่จำเป็นต้องตั้งค่าอะไร เพราะเป็นการทดสอบการใช้งาน ให้คลิก
Next
ได้เลย
**ตั้งแต่ขั้นตอนนี้ไปจะแตกต่างจากตัวอย่างในบทความข้างต้น**
Step 4 - optional: Configure instance traffic and scaling
Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้
หัวข้อ Instances
Root volume (boot device):
・Root volume type: General Purpose (SSD)
・Size: 10
GB (ขั้นต่ำคือ 10 GB)
แล้วค้นหาและเลือก EC2 security groups สำหรับ Elastic Beanstalk ที่สร้างในตอนแรก เช่น tinnakorn-autoscale
หัวข้อ Capacity
Auto scaling group
・Environment type: Load balanced
・Instances: 1
Min, 6
Max (ครั้งนี้จะตั้งค่าจำนวน Instance สูงสุดอยู่ที่ 6 ตัว)
・Instance types: t3a.nano
・Scaling cooldown: 60
seconds
เลื่อนลงมาที่หัวข้อ Scaling triggers แล้วตั้งค่าดังนี้
・Metric: CPUUtilization
・Statistic: Average
・Unit: Percent
・Period: 1
・Breach duration: 1
・Upper threshold: 50
・Scale up increment: 1
EC2 instances
・Lower threshold: 10
capacity
・Scale down increment: -1
EC2 instances
หัวข้อ Load Balancer Type
เลือก Application load balancer
แล้วเลื่อนลงมาด้านล่างสุดและคลิก Next
Step 5 - optional: Configure updates, monitoring, and logging
ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: Step 5 - optional: Configure updates, monitoring, and logging
Step 6: Review
ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit
ด้านล่างสุด แล้วรอสักครู่
ระหว่างที่ระบบกำลังเริ่มต้นจะมีสถานะเป็น [Unknown
→ Pending
→ OK
] เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ โดยมี Domain ที่เป็นลิงก์สำหรับแสดงผลหน้าเว็บไซต์ และมี Running version เป็นชื่อตามที่ป้อนตอนอัปโหลดไฟล์ ZIP
ติดตั้ง ab (Apache Bench) ในสภาพแวดล้อมการพัฒนา
ก่อนอื่นให้เตรียม EC2 Instance อื่นเพื่อติดตั้ง ab (Apache Bench) สำหรับทดลอง Auto Scaling ของ Elastic Beanstalk โดยดูตัวอย่างได้ที่ลิงก์บทความด้านล่างนี้ (หากมีสภาพแวดล้อมอยู่แล้วข้ามขั้นตอนนี้ไปได้เลย)
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
ก่อนอื่นให้เปิดหน้า Events, Health, Monitoring และ CloudWatch เตรียมไว้ เพราะระหว่างการทดสอบเราจะต้องดูการเปลี่ยนแปลงในหน้าเหล่านี้ครับ
Events
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Events
ใน Environment ของเรา ก็จะเห็นสถานะการใช้งานต่างๆ
Health
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health
ใน Environment ของเรา ก็จะเห็น Instance ID ที่กำลังใช้งานอยู่
Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Monitoring
ใน Environment ของเรา แล้วดูที่กราฟ CPU Utilization
สถานะการใช้งานตอนนี้คือปกติ
CloudWatch
เข้ามาที่ Service CloudWatch เลือก All alarms
จากเมนูด้านซ้าย และเลือกชื่อ Alarms ของเราโดยให้ดูที่ช่วงเวลาที่ Last state update
เมื่อเข้ามาแล้วจะแสดงหน้าจอแบบนี้
ในส่วนของ CPUUtilization หาก CPU มีค่ามากกว่า 50% (CPU > 50) ภายใน 1 นาทีจะมีการแจ้งเตือน (Alarm) และเมื่อมีการแจ้งเตือนขึ้นมาแล้ว Instance ก็จะถูกสร้างเพิ่มขึ้นมาอัตโนมัติ
เมื่อดูสถานการณ์จากหน้าจอเหล่านี้แล้วก็จะรู้ช่วงเวลาที่ Instance เพิ่มขึ้นมา ดังนั้นให้เปิดหน้าจอเหล่านี้ค้างไว้ เพราะจะเริ่มทดสอบในขั้นตอนถัดไปครับ
ทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab
เราจะทำการทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab ที่ติดตั้งใน EC2 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 Domain EB
)
ab -n 1 -c 1 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
*หากรันคำสั่งไปแล้วไม่แสดงแบบนี้ให้รันคำสั่งเดิมอีกครั้ง
Output
[ec2-user@ip-xx-xx-xx-x ~]$ 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
Server Hostname: tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port: 80
Document Path: /customer
Document Length: 758 bytes
Concurrency Level: 1
Time taken for tests: 0.025 seconds
Complete requests: 1
Failed requests: 0
Total transferred: 1821 bytes
HTML transferred: 758 bytes
Requests per second: 40.13 [#/sec] (mean)
Time per request: 24.922 [ms] (mean)
Time per request: 24.922 [ms] (mean, across all concurrent requests)
Transfer rate: 71.36 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 24 24 0.0 24 24
Waiting: 24 24 0.0 24 24
Total: 25 25 0.0 25 25
[ec2-user@ip-xx-xx-xx-x ~]$
เมื่อทดสอบการเข้าถึงแค่ 1 ครั้งได้โดยไม่มี Error ใดๆ ต่อไปให้รันคำสั่งด้านล่างนี้เพื่อทดสอบการเข้าถึง 100000 ครั้งโดยรันคำสั่งตามนี้ (ab -n 100000 -c 6
+ Your Domain EB
)
ab -n 100000 -c 6 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
หลังจากรันคำสั่งไปแล้วจะหยุดที่ Benchmarking
สักครู่ เพราะระบบกำลังเข้าถึงเว็บไซต์โปรเจกต์ของเราโดยจะแสดง Completed
เพิ่มขึ้นเป็นลำดับตั้งแต่ 10000 - 100000
ระหว่างที่ ab กำลังทำงานอยู่ CPUUtilization จะเพิ่มขึ้นเรื่อยๆ และ Instance ก็จะถูกสร้างเพิ่มขึ้นมาโดยอัตโนมัติจนเพียงพอต่อการใช้งาน และหลังจากที่ Benchmarking เริ่มแสดง Completed 10000 requests
แล้วให้เริ่มสังเกตการเปลี่ยนแปลงของ Auto Scaling ตามขั้นตอนถัดไปได้เลยโดยไม่ต้องรอการเข้าถึงจนเสร็จสิ้นที่ Finished 100000 requests
และเมื่อการเข้าถึงเสร็จสิ้นแล้วจะแสดงตามด้านล่างนี้
Output
[ec2-user@ip-xx-xx-xx-xx ~]$ 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
Server Hostname: tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port: 80
Document Path: /customer
Document Length: 758 bytes
Concurrency Level: 6
Time taken for tests: 999.321 seconds
Complete requests: 100000
Failed requests: 0
Total transferred: 182100000 bytes
HTML transferred: 75800000 bytes
Requests per second: 100.07 [#/sec] (mean)
Time per request: 59.959 [ms] (mean)
Time per request: 9.993 [ms] (mean, across all concurrent requests)
Transfer rate: 177.95 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 1 3.3 1 1038
Processing: 16 59 300.8 26 9794
Waiting: 16 59 300.8 26 9794
Total: 17 60 300.8 27 9795
Percentage of the requests served within a certain time (ms)
50% 27
66% 33
75% 37
80% 41
90% 51
95% 65
98% 186
99% 465
100% 9795 (longest request)
[ec2-user@ip-xx-xx-xx-xx ~]$
สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนมาก
ขั้นตอนนี้ให้สังเกตการเปลี่ยน Environment ขณะที่มีการเข้าถึงจำนวนมากกว่าที่ตั้งค่าไว้ ในตัวอย่างนี้คือ (CPU > 50%)
※CloudWatch
เข้ามาที่ Service CloudWatch เลือก Alarms ของเราและดูที่ Graph
จะเห็นว่า CPUUtilization มีสถานะเป็น In alarm เนื่องจากว่ามีการใช้งานที่มากกว่า 50% เช่นจากรูปสูงขึ้นมาถึง 91% หรืออาจจะสูงกว่านี้ครับ (เมื่อ Instance ถูกสร้างขึ้นมาเพียงพอต่อการใช้งานแล้วสถานะจาก In alarm จะเปลี่ยนเป็น ✅ OK)
※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Monitoring ใน Environment ของเราและดูที่ CPU Utilization
จะเห็นว่า CPU Utilization กำลังสูงขึ้นเรื่อยๆ (ในส่วนนี้จะเกิดขึ้นระหว่าง ab กำลังทำงาน)
※Health
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health ใน Environment ของเราและดูที่ Status
จะเห็นว่าเป็น Status: Warning
ถ้าแสดงแบบเดียวกับรูปภาพด้านล่างนี้ คือเนื่องจากว่า 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.658% หรืออาจจะต่ำกว่านี้ครับ
※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Monitoring ดูที่ CPU Utilization
จะเห็นว่า CPU Utilization ลดลงมาอยู่ในสถานะปกติแล้ว (ในส่วนนี้จะเกิดขึ้นหลังจาก ap ทำงานเสร็จแล้ว)
※Health
เข้ามาที่ Service Elastic Beanstalk เลือกแท็บ Health ดูที่ Status
จะเห็นว่าเป็น Status: No Data
ถ้าแสดงแบบเดียวกับรูปภาพด้านล่างนี้ คือเนื่องจากว่า 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
จากรูป เราสามารถเพิ่ม Terminal ใน VSCode และเชื่อมต่อ Server EC2 ได้หลาย Instance ตามที่เราต้องการ
ในตัวอย่างนี้ผมได้เชื่อมต่อไว้ 5 Server (หรือ 5 Instance) คือab
= Instance (tinnakorn-develop) ที่ใช้ติดตั้ง ab และทดสอบการทำงานของ Auto scaling (Instance) ใน Elastic Beanstalk (1 Instance)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 จะขึ้นอยู่กับการตั้งค่าและโครงสร้างโปรเจกต์ของคุณด้วยครับ
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !
บทความที่เกี่ยวข้อง
- [Update] ทดลอง Deploy Laravel ใน Elastic Beanstalk และเชื่อมต่อกับ RDS
- วิธีการเชื่อมต่อจาก EC2 ไปยัง EC2 อื่นด้วย SSH
- [Update] การตั้งค่า ELB (ALB) และ Auto Scaling Group ใน Elastic Beanstalk
- [Update] วิธี Copy การตั้งค่า Environment ใน Elastic Beanstalk และเริ่มต้นระบบจาก Save Configuration
- Stress testing (software) (ภาษาอังกฤษ)