[Update] การตั้งค่า ELB (ALB) และ Auto Scaling Group ใน Elastic Beanstalk

เราสามารถสร้าง Load Balancers ใน Elastic Beanstalk โดยกำหนดจำนวน Instance ได้ตามที่เราต้องการใช้งาน ในบทความครั้งนี้ผมจะมาอธิบายโดยเน้นไปที่วิธีการใช้ ELB (ALB) ใน Elastic Beanstalk ครับ

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

ครั้งนี้จะมาแนะนำเกี่ยวกับการตั้งค่า ELB (ALB) และ Auto Scaling Group ใน Elastic Beanstalk

สำหรับชื่อทางการคือ
ELB = Elastic Load Balancing
ALB = Application Load Balancer

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

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

ตัวอย่างในบทความนี้ สมมติว่าผมสร้าง Application โดยใช้ชื่อดังนี้
Application: tinnakorn

สร้าง Environment สำหรับ ELB (ALB)

ก่อนอื่นผมจะสร้าง Environment โดยตั้งค่าการใช้งาน ELB (ALB)

ตัวอย่างในบทความนี้ ผมจะสร้าง Environment โดยใช้ชื่อดังนี้
Environment: tinnakorn-loadbalancer

ดูตัวอย่างเพิ่มเติมได้ที่ลิงก์บทความและตัวอย่างตาม Step ด้านล่างนี้ (สำหรับผู้ใช้งานที่รู้วิธีการสร้าง Environment อยู่แล้วข้ามขั้นตอนนี้ไปได้เลย)

ครั้งนี้จะสร้าง Environment โดย Deploy Laravel ใน Elastic Beanstalk และเชื่อมต่อกับ RDS ดังนี้

Step 1: Configure environment

หัวข้อ Environment information
・Environment name: tinnakorn-loadbalancer (ชื่ออะไรก็ได้)
・Domain: tinnakorn-loadbalancer (ชื่ออะไรก็ได้)

หัวข้อ 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-loadbalancer
・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-loadbalancer

หัวข้อ Capacity
Auto scaling group
・Environment type: Load balanced
Instances: 2 Min, 2 Max (ครั้งนี้จะล็อกจำนวน Instance อยู่ที่ 2 ตัว)

・Instance types: t3a.nano

Scaling triggers
Lower threshold: 0 capacity

หัวข้อ Load Balancer Type
เลือก Application load balancer

หัวข้อ Processes
・ติ๊ก default
・คลิก Actions และเลือก Edit

*เป็นการตั้งค่า Stickiness

สิ่งที่จะทำต่อไปนี้คือการล็อกปลายทาง EC2 Instance ที่จะเชื่อมต่อโดยใช้ข้อมูลจาก Cookie ที่ฝังใน HTTP response ด้วย ELB ครับ ซึ่งอาจไม่ต้องทำก็ได้ แต่เพื่อให้แอปพลิเคชันทำงานได้อย่างปลอดภัย แนะนำให้ทำตามขั้นตอนดังนี้

・คลิก ▶ Sessions เพื่อขยายหน้าจอ Session stickiness
・ติ๊ก Enabled ที่ Session stickiness
・คลิก Save

แล้วช่อง Stickiness จะเปลี่ยนเป็น Enabled แล้วเลื่อนลงมาด้านล่างสุดและคลิก Next

Step 5 - optional: Configure updates, monitoring, and logging

Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้

หัวข้อ Managed platform updates
・Managed updates: ▢ Activated (ติ๊ก ✅ ออกเพื่อไม่ให้อัปเดต)
แล้วคลิก Next ด้านล่างสุด

หากต้องการอัปเดต OS โดยอัตโนมัติ ให้ติ๊ก ✅ และเมื่อมีการอัปเดต Instance จะรีสตาร์ทโดยอัตโนมัติ ซึ่งการรีสตาร์ท Instance หรือการอัปเดต OS อาจทำให้เกิดปัญหา เช่น บริการหยุดทำงานระหว่างการดำเนินการ แล้วในกรณีที่ติ๊ก ✅ นี้ จำเป็นต้องยืนยันว่าบริการยังทำงานตามปกติระหว่างการดำเนินการหรือไม่ หากมีความกังวล เราขอแนะนำว่าไม่ต้องไปติ๊ก ✅ ครับ

หัวข้อ Platform software Info
Container options
Proxy server: Nginx
Document root: /public

Step 6: Review

ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit ด้านล่างสุด แล้วรอสักครู่

ระหว่างที่ระบบกำลังเริ่มต้นจะมีสถานะเป็น [UnknownPendingOK] เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ โดยมี Domain ที่เป็นลิงก์สำหรับแสดงผลหน้าไซต์ และมี Running version เป็นชื่อตามที่ป้อนตอนอัปโหลดไฟล์ ZIP

ตั้งค่า Configuration: Updates, monitoring, and logging

ต่อไปคลิก Configuration แล้วเลื่อนลงมาคลิก Edit ที่หัวข้อ "Updates, monitoring, and logging"

กดปุ่ม Ctrl + F แล้วค้นหา DB_DATABASE และเปลี่ยนข้อมูลตามด้านล่างนี้ให้เป็นของเรา (การตั้งค่านี้เป็นแค่ตัวอย่าง)
・DB_DATABASE: laravel
・DB_HOST: tinnakorn-laravel-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com
・DB_PASSWORD: PassW0rd

แล้วเลื่อนลงมาด้านล่างสุด คลิก Apply

รอประมาณ 2-3 นาที แล้วคลิก Reload ก็จะแสดงแจ้งเตือนในหน้าจอแบบนี้

ตรวจสอบสภาพแวดล้อมหลังจากสร้าง Environment

ก่อนอื่นเรามาทำการตรวจสอบเว็บไซต์ที่สร้างขึ้นมาก่อนครับ (เว็บไซต์ Laravel นี้เป็นแค่ตัวอย่าง)

ตรวจสอบหน้าเว็บไซต์โปรเจกต์

เมื่อระบบ Update เสร็จแล้วจะแสดงหน้าจอแบบนี้ จากนั้นคลิกลิงก์ Domain เพื่อตรวจสอบหน้าเว็บไซต์ได้เลย

แล้วจะแสดงหน้าหลัก (Home page) แบบนี้

Load Balancers

ช่วงเวลาที่ผมสร้าง ELB (ALB) ใน Elastic Beanstalk โดยประมาณคือ May 2, 2024, 16:58 (UTC+07:00)
หลังจากเริ่มต้นระบบเสร็จแล้ว เราจะได้สภาพแวดล้อมตามที่สร้างใน Elastic Beanstalk ดังนี้

เข้ามาที่ [Amazon EC2 > Load Balancers] จะเห็นว่าเราได้ Load Balancers มาแล้ว

Auto Scaling Groups

เข้ามาที่ [Amazon EC2 > Auto Scaling Groups] จะเห็นว่าเราได้ Auto Scaling Groups มาแล้ว

Instances

เข้ามาที่ [Amazon EC2 > Instances] จะเห็นว่าเราได้ Instances มาแล้ว ซึ่งในส่วนนี้เราจะได้ Instances มา 2 ตัวตามที่ตั้งค่าไว้ใน Elastic Beanstalk เมื่อสักครู่นี้ครับ

เชื่อมต่อ Server EC2

เราสามารถเชื่อมต่อ Server EC2 จาก EC2 อื่นหรือจากโปรแกรมอื่นได้

เชื่อมต่อ Server EC2 จาก EC2 อื่น

การเชื่อมต่อ Server EC2 จาก EC2 อื่นโดยใช้ Public IPv4 address และ Private IPv4 addresses ของ EC2 ที่ต้องการเชื่อมต่อ

ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้

เชื่อมต่อ Server EC2 จากโปรแกรมอื่น

การเชื่อมต่อ Server EC2 จากโปรแกรมอื่น เช่น PuTTY และ VSCode มีดังนี้

การเชื่อมต่อ Server EC2 ด้วย PuTTY
ดูตัวอย่างที่นี่: การ Connect to EC2 by PuTTY

การเชื่อมต่อ Server EC2 ด้วย VSCode
ดูตัวอย่างที่นี่: ทำการติดตั้ง Extention Remote – SSH ใน VSCode และทดลองใช้งาน EC2 โดยตรงใน VSCode

ทดสอบ Auto Scaling

มาที่ EC2 instance แล้ว Terminate instance ที่สร้างขึ้นจาก Auto Scaling ครับ

เมื่อทำการ Terminate Instance เสร็จแล้ว ให้เข้าไปที่หน้า Target Groups ของ Elastic Beanstalk จะพบว่ามีจำนวน Healthy Instance อยู่ 1 ตัว เราจึงยังสามารถเข้าใช้เว็บไซต์ได้ตามปกติ เนื่องจาก ELB ยังมี Instance ที่ทำงานเหลืออยู่ 1 ตัว และได้นำ Instance ที่ถูก Terminate ออกจากการ Target Groups แล้วจะสร้าง Instance ตัวใหม่มาแทนที่ตัวที่ถูก Terminate ไปให้กลับมามี Instance 2 ตัวตามที่ตั้งค่าไว้ พูดง่าย ๆ คือต่อให้มี EC2 ตัวใดตัวหนึ่งเกิดปัญหา เว็บไซต์ก็ยังสามารถใช้งานต่อได้ครับ

หลังจากนี้ให้รอสักครู่จนกว่าจำนวน Healthy Instance จะกลับมาเป็น 2 ตัว

และเมื่อเรากลับมาดูที่หน้า Instances อีกทีจะพบว่ามี Instance ถูกสร้างขึ้นใหม่จาก Auto Scaling มาแทนที่

พฤติกรรมเช่นนี้คือ Auto Scaling จะคอยตรวจสอบว่า EC2 เป็นไปตามเงื่อนไขที่ตั้งค่าไว้หรือไม่ หากไม่ตรงตามเงื่อนไขก็จะปรับค่าให้ตรงตามเงื่อนไขที่เราตั้งค่าไว้ โดยในกรณีนี้คือการเปิดใช้งาน Instance ให้ครบ 2 ตัว

สรุป

กรณีที่ทำการตั้งค่า Auto Scaling Groups ด้วยตนเองนั้นจะยุ่งยาก อย่างไรก็ตาม การตั้งค่า Auto Scaling Groups โดยใช้ Elastic Beanstalk นั้นง่ายมากๆ และนี่ก็เป็นอีก 1 ข้อดีของการใช้งาน Elastic Beanstalk ครับ

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

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

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