[Update] ทดลอง Deploy Laravel ใน Elastic Beanstalk และเชื่อมต่อกับ RDS

เราสามารถ Deploy Project Laravel ใน Elastic Beanstalk แล้วแสดงผลบนเว็บไซต์ได้อย่างง่ายดาย ในบทความครั้งนี้จะมาแนะนำวิธี Deploy Project Laravel ใน Elastic Beanstalk และตั้งค่า RDS ให้เป็น Database สำหรับ Laravel ใน Amazon Linux 2023 ที่สร้างจาก Elastic Beanstalk

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

AWS Elastic Beanstalk เป็นบริการที่ช่วยให้ Developer สามารถใช้งานและจัดการแอปพลิเคชันเว็บหรือแอปพลิเคชันโมบายล์ได้อย่างง่ายและมีประสิทธิภาพมากยิ่งขึ้น ครั้งนี้จึงอยากมาลองใช้งานโดย Deploy Laravel ใน Elastic Beanstalk และเชื่อมต่อกับ RDS ครับ

เป้าหมายในการทำ

  • สร้าง Applications และ Environments ใน Elastic Beanstalk
  • Deploy Project Laravel ใน Environment ด้วย Platform PHP
  • ตั้งค่า RDS ให้เป็น Database สำหรับ Laravel ใน Amazon Linux 2023 ที่สร้างจาก Elastic Beanstalk
  • แสดงหน้าเว็บไซต์หลัก (Home Page) ของ Laravel และหน้าเว็บ customer

สร้าง Resources ที่จำเป็นสำหรับ Elastic Beanstalk

สร้าง Service role และ Instance profile ที่ใช้สำหรับ Elastic Beanstalk ใน IAM

ก่อนสร้าง Environment จำเป็นต้องสร้าง Service role และ Instance profile ใน IAM Role เตรียมไว้ โดยแนะนำให้กำหนดชื่อและ Permissions ตาม Documentation ของ AWS ดังนี้

IAM Role Name Permissions
aws-elasticbeanstalk-service-role AWSElasticBeanstalkEnhancedHealth
AWSElasticBeanstalkService
aws-elasticbeanstalk-ec2-role AWSElasticBeanstalkWebTier
AWSElasticBeanstalkWorkerTier
AWSElasticBeanstalkMulticontainerDocker

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

สร้าง Key Pair สำหรับ Elastic Beanstalk

ครั้งนี้จะสร้าง Key Pair ชื่อว่า tinnakorn-laravel-eb

ดูตัวอย่างที่นี่เฉพาะหัวข้อนี้: การสร้าง Key Pair

ตัวอย่างตั้งค่าการสร้าง Key Pairs ในบทความนี้
※Create Key pairs
Name: tinnakorn-laravel-eb
Private key file format: .ppk

สร้าง Security Group สำหรับ Elastic Beanstalk

ครั้งนี้จะสร้าง Security Group ชื่อว่า tinnakorn-laravel-eb

เข้ามาที่ Service Amazon EC2 แล้วคลิก Security Groups จากเมนูด้านซ้ายในหัวข้อ "▼ Network & Security"

คลิก Create security group

เมื่อเข้ามาหน้า Create security group แล้วให้ตั้งค่า Basic details:
・Security group name: tinnakorn-laravel-eb (ชื่ออะไรก็ได้)
・Description: tinnakorn-laravel-eb (ป้อนอะไรก็ได้)

จากนั้นเลื่อนลงมาด้านล่างสุด คลิก Create security group

การสร้าง Security Groups ใช้สำหรับ Elastic Beanstalk เสร็จเรียบร้อยแล้ว ทำขั้นตอนถัดไปได้เลยครับ

สร้าง RDS

เราสามารถใช้ RDS เป็น Engine type ที่ต้องการได้ หรือจะทำการติดตั้ง MySQL ใน Amazon Linux ก็ได้เช่นกัน
แต่ครั้งนี้จะสร้าง RDS เป็น Engine type MySQL เพื่อใช้เชื่อมต่อกับ Instance ที่สร้างจาก Elastic Beanstalk

ให้ทำการสร้าง RDS ตามลิงก์ด้านล่างนี้ได้เลย (ทำเฉพาะหัวข้อที่ระบุไว้ด้านล่างนี้เท่านั้น)

ตัวอย่างตั้งค่าการสร้าง RDS (MySQL)

※สร้าง Security Group สำหรับ RDS (MySQL)
Basic details
Security group name: tinnakorn-laravel-rds (ตั้งชื่อที่ต้องการ)
Description: tinnakorn-laravel-rds (ป้อนตามต้องการ)

Inbound rules
Type: MYSQL/Aurora | Source: Custom | tinnakorn-laravel-eb (เลือก Security Group ที่ต้องการให้เชื่อมต่อเข้ามา)

※สร้าง RDS (MySQL)
Choose a database creation method
◎ Standard create

Engine options
Engine type: MySQL
Edition: MySQL Community
Engine Version: MySQL 8.0.35

Templates
◎ Production

Availability and durability
Deployment options: Single DB instance

Settings
DB instance identifier: tinnakorn-laravel-rds
▼ Credentials Settings
Master username: admin
Credentials management: Self managed
Master password: PassW0rd (รหัสผ่านนี้เป็นแค่ตัวอย่าง ให้กำหนดรหัสผ่านที่ต้องการ)
Confirm master password: PassW0rd

Instance configuration
DB instance class:
◎ Burstable classes (includes t classes)
db.t3.micro

Storage
Storage type: General Purpose SSD (gp2)
Allocated storage: 20
▼ Storage autoscaling
✅ Enable storage autoscaling

Connectivity
Existing VPC security groups: ✅ tinnakorn-laravel-rds (เลือก Security Group ที่สร้างสำหรับ RDS (MySQL))

** การตั้งค่าด้านล่างนี้ไม่มีในลิงก์ของบทความตัวอย่าง ควรสร้าง Database เตรียมไว้ **

Additional configuration
Database options
Initial database name: laravel (ตั้งชื่อตามความเหมาะสมของงาน)


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

ดาวน์โหลดไฟล์สำหรับ Deploy ใน Elastic Beanstalk

ดาวโหลดไฟล์โปรเจกต์ Laravel ใช้สำหรับ Deploy ใน Elastic Beanstalk ตามลิงก์ด้านล่างนี้

Click to download: laravel10-sample.zip

สร้าง Application ใน Elastic Beanstalk

ค้นหาและเลือก Elastic Beanstalk

เลือก Applications จากเมนูด้านซ้าย

คลิก Create application ด้านขวา

หัวข้อ Application information
・Application name: tinnakorn-laravel-app (ป้อนชื่อที่ต้องการ)
แล้วคลิก Create

แล้วจะแสดงหน้าจอแบบนี้

สร้าง Environment ใน Elastic Beanstalk

สร้าง Environment แบบ Platform PHP เพื่อใช้สำหรับการ Deploy Laravel

คลิก Create new environment ใน Application ของเรา

Step 1: Configure environment

หัวข้อ Environment tier
Web server environment (ค่าเริ่มต้น)

หัวข้อ Environment information
ป้อนชื่อที่ต้องการ แต่ตัวอย่างนี้จะใช้ชื่อตามที่ระบบจัดการให้
・Environment name: tinnakorn-laravel-env (ค่าเริ่มต้น)
・Domain: tinnakorn-laravel-env
・คลิก Check availability (ต้องแสดง ✅ [Domain Elastic Beanstalk] is available แบบนี้)

หัวข้อ Platform
AWS Elastic Beanstalk มี Platform ที่รองรับดังนี้:

  • .NET Core on Linux
  • .NET on Windows Server
  • Docker
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
  • Tomcat

การตั้งค่าหัวข้อ Platform คือ
・Platform: PHP
・Platform branch: ระบบเลือกให้อัตโนมัติ
・Platform version: ระบบเลือกให้อัตโนมัติ (มีการอัปเดตเวอร์ชันใหม่เรื่อยๆ แนะนำให้ใช้เวอร์ชันที่มี (Recommended))

หัวข้อ Application code
・เลือก Upload your code
・เลือก Local file
・คลิก Choose file
・แล้วเลือกไฟล์ ZIP ที่ดาวน์โหลดมาในตอนแรก

แล้วจะแสดง [✅ File name: laravel10-sample.zip] แบบนี้
จากนั้นป้อนชื่อเวอร์ชันในช่อง Version label เช่น laravel10-sample (ป้อนตามต้องการ)

หัวข้อ Presets จะใช้เป็นค่าเริ่มต้น เมื่อตั้งค่าหน้านี้เสร็จแล้ว คลิก 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-laravel-eb (Key Pair ที่สร้างก่อนหน้านี้)
・EC2 instance profile: aws-elasticbeanstalk-ec2-role (ระบบเลือกให้ตามที่สร้างตอนแรก)
・คลิก Next

หมายเหตุ: หากไม่สร้าง IAM Role สำหรับ Service role และ EC2 instance profile เตรียมไว้ ระบบจะไม่เลือกให้อัตโนมัติ

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-laravel-eb

หัวข้อ Capacity
・Instance types: t3a.nano

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

เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY

ตรวจสอบ Instance ID จาก Health

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: ตรวจสอบ Instance ID จาก Health

ตรวจสอบ IP Address จาก EC2

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: ตรวจสอบ IP Address จาก EC2

เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY

ตั้งค่าการเชื่อมต่อกับ Instance ในโปรแกรม PuTTY ตามด้านล่างนี้

ดูตัวอย่างที่นี่: การเชื่อมต่อกับ EC2 Instance ด้วย PuTTY

・Session
Host Name: Your Public IPv4 address (IPv4 address ของ Instance)
Saved Sessions: tinnakorn-laravel-env (ป้อนชื่อที่ต้องการ)

・Connection
Seconds between keepalives (0 to turn off): 60

・Connection → Data
Auto-login username: ec2-user (บังคับให้ใส่ตามนี้เพราะ AMI เป็น Amazon Linux)

・Connection → SSH → Auth → Credentials
Private key file for authentication → Private key file for authentication:
คลิก Browse... และเลือก your_key_pair.ppk (เช่น tinnakorn-laravel-eb.ppk)

・Session (กลับมาที่หัวข้อนี้อีกครั้ง)
Saved Sessions: your_session_name (เช่น tinnakorn-laravel-env แล้วคลิก Save และคลิก Open)

เมื่อเชื่อมต่อกับ Instance ได้แล้ว จะแสดงหน้าจอแบบนี้

root@ip-xx-xx-xx-xx:~

Using username "ec2-user".
Authenticating with public key "tinnakorn-laravel-eb"
  _____ _           _   _      ____                       _        _ _
 | ____| | __   ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
 |  _| | |/ _ \/ __| __| |/ __|  _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
 | |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
 |_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\

 Amazon Linux 2023 AMI

 This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
 WILL BE LOST if the instance is replaced by auto-scaling. For more information
 on customizing your Elastic Beanstalk environment, see our documentation here:
 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$

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

ตั้งค่า RDS ให้เป็น Database สำหรับ Laravel ใน Amazon Linux 2023 ที่สร้างจาก Elastic Beanstalk

รันคำสั่งเข้าสู่ระบบผู้ใช้ระดับสูงสุดหรือ root (Superuser)

sudo su -

root@ip-xx-xx-xx-xx:~

[ec2-user@ip-xx-xx-xx-xx ~]$ sudo su -
[root@ip-xx-xx-xx-xx ~]#


รันคำสั่ง cd เข้าไปที่โฟลเดอร์ /var/www/html/

cd /var/www/html/


รันคำสั่งให้ข้อมูลที่เราตั้งค่าใน Elastic Beanstalk ก่อนหน้านี้ ถูกอ่านข้อมูลเป็นตัวแปรสภาพแวดล้อม

export $(cat /opt/elasticbeanstalk/deployment/env | grep -v ^# | xargs)


รันคำสั่งนี้เพื่อตรวจสอบข้อมูลที่เราตั้งค่าใน Elastic Beanstalk ก่อนหน้านี้

printenv | sort

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx html]# printenv | sort
}
APP_DEBUG=false
APP_ENV=local
APP_KEY=base64:sVxmnJFIjiK8yQmu+ZnPbXZiI7+VWl67178FoVMdy9k=
APP_NAME=Laravel
APP_URL=http://localhost
AWS_ACCESS_KEY_ID=
AWS_BUCKET=
AWS_DEFAULT_REGION=us-east-1
AWS_SECRET_ACCESS_KEY=
AWS_USE_PATH_STYLE_ENDPOINT=false
BASH_FUNC_which%%=() {  ( alias;
BROADCAST_DRIVER=log
CACHE_DRIVER=file
CVS_RSH=ssh
DB_CONNECTION=mysql
DB_DATABASE=laravel
DB_HOST=tinnakorn-laravel-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com
DB_PASSWORD=PassW0rd
DB_PORT=3306
DB_USERNAME=admin
 eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@"
FILESYSTEM_DISK=local
HISTCONTROL=ignoredups
HISTSIZE=1000
HOME=/root

"ละเว้นส่วนล่าง"


รันคำสั่ง Migrate ข้อมูลไปยัง Database ใน RDS

php artisan migrate:fresh --seed

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx html]# php artisan migrate:fresh --seed

  Dropping all tables ..................................................................... 182ms DONE

   INFO  Preparing database.

  Creating migration table ................................................................. 37ms DONE

   INFO  Running migrations.

  2014_10_12_000000_create_users_table ..................................................... 63ms DONE
  2014_10_12_100000_create_password_resets_table ........................................... 56ms DONE
  2019_08_19_000000_create_failed_jobs_table ............................................... 55ms DONE
  2019_12_14_000001_create_personal_access_tokens_table .................................... 75ms DONE
  2022_07_11_082307_create_customers_table ................................................. 36ms DONE


   INFO  Seeding database.

  Database\Seeders\CustomerSeeder ............................................................ RUNNING
  Database\Seeders\CustomerSeeder ......................................................... 52 ms DONE

[root@ip-xx-xx-xx-xx html]#

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

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

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

แล้วป้อน /customer ต่อท้าย Domain แล้วคลิก 1

หากแสดงหน้า Show แบบนี้ ถือว่าการ Deploy Laravel ใน Elastic Beanstalk เสร็จสมบูรณ์

ลบ AWS Resource ที่สร้างขึ้นในบทความนี้

ลบเรียงตาม AWS Resource ดังนี้

ลบโดยเรียงตามขั้นตอนดังนี้:

  • RDS
    • Databases
  • Elastic Beanstalk
    • Environments (Terminate)
    • Applications
  • Amazon EC2
    • Key Pairs
    • Security Groups (RDS)
    • Security Groups (Elastic Beanstalk)
  • IAM Roles
    • aws-elasticbeanstalk-service-role
    • aws-elasticbeanstalk-ec2-role

ลบ RDS

ดูตัวอย่างที่นี่เฉพาะหัวข้อหลักนี้: การลบ Database ใน RDS

ลบ Environments และ Applications ใน Elastic Beanstalk

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: ลบ Environments และ Applications ใน Elastic Beanstalk

ลบ Key Pair และ Security Groups ใน Amazon EC2

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

ลบ IAM Roles สำหรับ Elastic Beanstalk

*หากมีความจำเป็นต้องใช้งานในอนาคตอีกไม่ต้องลบก็ได้ เนื่องจากไม่มีค่าใช้จ่ายใดๆ

หากต้องการลบให้ดำเนินการตามนี้
เข้ามาที่ Service IAM > เลือก Roles จากเมนูด้านซ้าย
แล้วค้นหา aws-elasticbeanstalk ให้ติ๊กเลือกทั้ง 2 รายการตามด้านล่างนี้ (ถ้าไม่ได้ตั้งชื่อตามนี้ให้ลบตามชื่อที่สร้าง)
・aws-elasticbeanstalk-ec2-role
・aws-elasticbeanstalk-service-role

แล้วคลิก Delete และยืนยันการลบตามคำแนะนำ

สรุป

การ Deploy Project Laravel ใน Elastic Beanstalk ช่วยเพิ่มประสิทธิภาพและอำนวยความสะดวกในการทำงานให้กับเราได้ เนื่องจาก Elastic Beanstalk จัดการ Environment ให้ จึงไม่ต้องเสียเวลาเตรียม Environment ด้วยตัวเอง นอกจากนี้การประมวลผล Project ผ่าน EC2 ทำให้การใช้งานเว็บไซต์มีประสิทธิภาพมากยิ่งขึ้น

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

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

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