[Update] วิธี Deploy จากการ Upload S3 ไปยัง Elastic Beanstalk

เราสามารถ Deploy โปรเเจกต์โดยใช้ไฟล์ที่เก็บอยู่ใน S3 Bucket ได้ โดยเฉพาะโปรเจกต์ที่มีขนาดใหญ่แนะนำให้ใช้วิธีในบทความนี้ครับ

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

การอัปโหลดไฟล์โปรเจกต์ที่มีขนาดใหญ่ไปยัง Elastic Beanstalk โดยตรงอาจต้องใช้เวลานาน แต่ถ้า Deploy โปรเจกต์โดยอัปโหลดไฟล์ผ่าน URL S3 (URL ที่เก็บไฟล์โปรเจกต์ใน S3 Bucket) ไปยัง Elastic Beanstalk จะทำให้การ Deploy โปรเจกต์ของเราเสร็จอย่างรวดเร็ว

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

EC2 Instance และโปรเจกต์ Laravel

※สร้าง EC2 Instance และเชื่อมต่อ Instance ด้วย Remote – SSH ใน VSCode แล้ว
※มีโปรเจกต์ Laravel บน EC2 และตั้งค่าที่จำเป็นเพื่อ Deploy Laravel ใน Elastic Beanstalk แล้ว

*ยังไม่ต้องทำหัวข้อ Deploy โปรเจกต์ Laravel ใน Elastic Beanstalk เนื่องจากต้องอัปโหลดไฟล์ ZIP ไปยัง S3 ก่อน แล้วค่อยทำขั้นตอน Deploy จาก S3 ไปยัง Elastic Beanstalk ในภายหลัง

การใช้ S3 จาก EC2 ด้วย AWS CLI S3

※EC2 ที่อัปโหลดไฟล์ ZIP มีการตั้งค่า IAM Role ไว้แล้ว

ครั้งนี้สร้าง S3 Bucket ชื่อ tinnakorn-upload

*หากมี EC2 Instance อยู่แล้ว สามารถสร้าง IAM Role สำหรับใช้ S3 จาก EC2 ได้ในภายหลังและเพิ่ม IAM Role ไปยัง EC2 ได้

สร้างไฟล์ ZIP

*กรณีที่ยังไม่ได้รันคำสั่งสร้างไฟล์ ZIP ให้ทำขั้นตอนนี้ด้วย แต่ถ้ารันคำสั่งสร้างไฟล์ ZIP ไปแล้ว ข้ามขั้นตอนนี้ไปได้เลย

รันคำสั่งสร้างไฟล์ ZIP ที่จะใช้ Deploy (เปลี่ยน [deploy_file_name.zip] ให้เป็นชื่อไฟล์ที่คุณต้องการ เช่น tinnakorn-laravel.zip เป็นต้น)

zip -r: คำสั่งสร้างไฟล์ ZIP
-x: คำสั่งยกเว้นโฟลเดอร์หรือไฟล์เพื่อไม่ให้รวมใน ZIP

zip -r [deploy_file_name.zip] * .editorconfig .styleci.yml .ebextensions .platform -x \*/.git/\* vendor/\* node_modules/\* public/build/\* public/hot/\* public/storage/\* storage/\*.key Homestead.json Homestead.yaml npm-debug.log yarn-error.log .idea .vscode

อัปโหลดไฟล์ ZIP ไปยัง S3

อัปโหลดไฟล์ ZIP ไปยัง S3 (เปลี่ยน [deploy_file_name.zip] ให้ตรงกับชื่อไฟล์ Zip ของคุณ และเปลี่ยน [bucket_name] ให้เป็นของคุณ)

aws s3 cp [deploy_file_name.zip] s3://[bucket_name]/

เมื่ออัปโหลดไฟล์ ZIP ไปยัง S3 แล้ว ให้เข้าไปที่ S3 Bucket ของเรา จะเห็นว่ามีไฟล์ ZIP ถูกอัปโหลดมาเรียบร้อยแล้ว

แล้วดำเนินการ Deploy โปรเจกต์ Laravel จาก S3 Bucket ไปยัง Elastic Beanstalk ในขั้นตอนถัดไป

Deploy จาก S3 ไปยัง Elastic Beanstalk

สร้าง Application

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

สร้าง Environment

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

สำหรับหัวข้อ Application code ใน "Step 1 - Configure environment" ให้ดูที่ด้านล่างนี้ เนื่องจากวิธีการระบุไฟล์แตกต่างกัน โดยเราสามารถเลือกไฟล์โปรเจกต์จาก S3 Bucket โดยเลือกและระบุที่ Public S3 URL ในหัวข้อ "Application code" ได้ตามต้องการ

เข้ามาที่ S3 Bucket ที่อัปโหลดไฟล์โปรเจกต์ไปตอนแรก แล้วติ๊ก โปรเจกต์ที่จะใช้ Deploy และคลิกที่ Copy URL

แล้วนำ URL ที่คัดลอกมาจาก S3 วางที่ Public S3 URL แล้วป้อนชื่อ Version label และดำเนินการตั้งค่า Environment แต่ละ Step ตามต้องการ

ตั้งค่า Database สำหรับโปรเจกต์

เมื่อ Deploy เสร็จแล้ว คลิก Configuration จากเมนูด้านซ้ายใน "Environment: your_environment_name" และดูข้อมูลการเชื่อมต่อ Database ที่ Environment properties ในหัวข้อ "Updates, monitoring, and logging" ก็จะแสดงหน้าจอแบบนี้

แล้วตั้งค่า Database สำหรับโปรเจกต์ตามลิงก์ด้านล่างนี้

ตัวอย่างครั้งนี้คือ ตั้งค่า RDS ให้เป็น Database สำหรับ Laravel

แล้วเปิด Domain บนเว็บเบราว์เซอร์จาก Elastic Beanstalk ก็จะแสดงหน้าจอแบบนี้

เพียงเท่านี้การ Deploy จากการ Upload S3 ไปยัง Elastic Beanstalk ก็เสร็จเรียบร้อยแล้ว

สรุป

การ Deploy โปรเจกต์จาก Public S3 URL (URL ไฟล์โปรเจกต์ที่เก็บอยู่ใน S3 Bucket) จะใช้เวลาน้อยกว่าการ Deploy จาก Local file
หากมีไฟล์โปรเจกต์ขนาดใหญ่ที่ต้องการ Deploy ไปยัง Elastic Beanstalk เราขอแนะนำให้เลือกใช้วิธีตามบทความนี้ เนื่องจากจะช่วยให้การ Deploy โปรเจกต์เสร็จสิ้นอย่างรวดเร็ว

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

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

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