[Update] วิธีการ Deploy Application โดยไม่ต้องหยุดการให้บริการใน Elastic Beanstalk

Elastic Beanstalk สามารถ Deploy Application โดยไม่ต้องหยุดการให้บริการได้ ซึ่งจะมีฟังก์ชัน Rolling Update เป็นวิธีการที่ใช้งานง่าย ในบทความนี้จะมาแนะนำเนื้อหาไปพร้อมกับการใช้งานจริงครับ

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

ครั้งนี้จะมาอัปเดตเกี่ยวกับวิธีการ Deploy Application โดยไม่ต้องหยุดการให้บริการใน Elastic Beanstalk

แนะนำให้ศึกษาบทความลิงก์ด้านล่างนี้ก่อนเริ่มทำขั้นตอนในบทความนี้ เพราะมีการอธิบายเกี่ยวกับ Rolling Update คืออะไร และวิธีการ Deployment โดยสามารถใช้งานเว็บไซต์ได้อย่างต่อเนื่องครับ

เมื่อศึกษาบทความด้านบนนี้เสร็จแล้ว เริ่มทำการ Rolling Update ได้เลยครับ

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

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

ตัวอย่างครั้งนี้จะสร้าง Application โดยใช้ชื่อดังนี้
Application: tinnakorn

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

สร้าง Environment สำหรับ Deploy Application

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

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

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

Step 1: Configure environment

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

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

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

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

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

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

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

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

*หัวข้อต่อไปยังอยู่ใน Step 5

การตั้งค่า Rolling updates and deployments

ต่อไปหัวข้อ Rolling updates and deployments
Application deployments
・Deployment policy: Rolling
・Batch size type: Fixed
・Deployment batch size: 1 (instances at a time (max:2))

หัวข้อ 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 ก็จะแสดงแจ้งเตือนในหน้าจอแบบนี้

แล้วเข้าไปหน้าจอ Instance ค้นหาชื่อของเราโดยป้อนชื่อเดียวกับ Environment ก็จะแสดง Instance 2 ตัวตามที่เราตั้งค่าใน Elastic Beanstalk

ตรวจสอบเว็บไซต์

เมื่อสร้าง Environment เสร็จแล้ว คลิกลิงก์จากหน้า Environment เพื่อเปิดหน้าเว็บไซต์โปรเจกต์ของเราขึ้นมา

แล้วพิมพ์ /customer ต่อท้าย (*หน้าเว็บไซต์นี้เป็นแค่ตัวอย่างการสาธิตในบทความนี้เท่านั้น)

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

แก้ไขข้อมูลในโปรเจกต์

ผมจะแก้ไขข้อความจาก name ให้เป็น NAME เพื่อทำการทดสอบการใช้งาน Rolling updates and deployments ในขั้นตอนถัดไป

เมื่อแก้ไขข้อความเสร็จแล้วให้สร้างไฟล์ ZIP เตรียมไว้ เช่น laravel10-sample_v2.zip
และ Deploy โดยการ Upload โปรเจกต์ที่แก้ไขนี้ไปยัง Environment ของเราอีกครั้งในขั้นตอนถัดไปครับ

Upload Application versions

*กรณีที่ไม่มี Version label ใน Application versions อยู่เลยจะไม่สามารถ Upload Version label ได้ แต่ถ้ามี Version label อยู่ก่อนแล้วจะสามารถ Upload Version label ได้ตามต้องการ

ผมจะ Deploy project version ใหม่ไปยัง Environment ที่สร้างในตอนแรกโดยใช้ไฟล์ laravel10-sample_v2.zip และแสดงข้อมูลที่แก้ไขจากหน้า Web Browser

เข้ามาที่ Application versions แล้วคลิก Upload

แล้วจะมี pop-up แสดงขึ้นมา ให้คลิก Choose file เพื่อเลือกไฟล์ที่ต้องการ Upload แล้วป้อนชื่อ Version label ตามต้องการ และคลิก Upload

Deploy จาก Application versions ไปยัง Environment

เราจะ Deploy จาก Application versions ไปยัง Environment ที่กำลังทำงานอยู่

เราสามารถ Deploy เวอร์ชันที่ต้องการไปยัง Environment ที่กำลังทำงานอยู่ได้
ขั้นตอนนี้ผมจะ Deploy Version label ที่ชื่อ laravel10-sample_v2 ไปยัง Environment ของ tinnakorn-rollingupdate

เข้ามาที่ Application versions แล้วติ๊ก Version label ที่ต้องการ เช่น laravel10-sample_v2 แล้วคลิก Action และเลือก Deploy

แล้วจะมี pop-up แสดงขึ้นมา ให้เลือก Environment ที่ต้องการ เช่น tinnakorn-rollingupdate แล้วคลิก Deploy

เมื่อ Deploy เสร็จแล้ว ให้ดูที่ "Deployed to" จะเห็นว่ามีชื่อ Environment ของ tinnakorn-rollingupdate แสดงขึ้นมาแล้ว
*นอกจากนี้ยังสามารถใช้ในกรณีที่ต้องการกลับมาใช้เวอร์ชันเก่าได้อีกด้วย

กลับมาที่หน้าจอ Environment ของเรา แล้วดูที่ Running version จะเห็นว่าเปลี่ยนเป็น laravel10-sample_v2 แล้ว

ทดสอบ Refresh หน้าเว็บไซต์

เมื่อ Deploy version ใหม่เสร็จแล้ว กลับมาที่หน้าจอเว็บไซต์โปรเจกต์อีกครั้ง แล้ว Refresh ก็จะเห็นว่าข้อความแสดงเป็น NAME ตามที่แก้ไขเรียบร้อยแล้ว

ตรวจสอบ Event

ขั้นตอนนี้ผมจะอธิบายเกี่ยวกับ Event ที่ได้มีการดำเนินการไปครับ
เข้ามาที่ Service Elastic Beanstalk แล้วเลือก Events ใน Environment ของเรา แล้วดูที่ Event
เมื่อเสร็จสิ้นการดำเนินการ Deploy บน EC2 ครั้งที่ 1 ใน Batch 1 แล้ว ก็จะมาดำเนินการ Deploy บน EC2 ครั้งที่ 2 ใน Batch 2 เพราะ ELB ไม่ได้จัดสรรการเข้าถึง EC2 ในระหว่าง Deploy ซึ่งต่อให้อยู่ในระหว่าง Deploy บริการก็จะไม่หยุดนั่นเอง

และถ้าเห็นข้อความ 「Environment update completed successfully.」 แสดงขึ้นมาแล้ว ก็หมายความว่าการ Deploy version ใหม่เสร็จสมบูรณ์ครับ

สรุป

การสาธิตนี้ผมได้เน้นไปที่การตั้งค่า Rolling updates and deployments เนื่องจากเห็นว่าฟังก์ชันนี้มีประโยชน์ในการช่วยให้เว็บไซต์ของเราสามารถใช้งานได้อย่างต่อเนื่อง ต่อให้ทำการ Deploy project version ใหม่เข้าไปยัง Environment ของเรา เว็บไซต์ก็ยังสามารถใช้งานต่อได้นั่นเองครับ

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

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

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