สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
การ Deploy Laravel ใน Elastic Beanstalk อาจเกิน Error ในขณะที่เราใช้งานโปรเจกต์ Laravel ที่รันบน Elastic Beanstalk ดังนั้นแนะนำให้ตั้งค่าดังต่อไปนี้
เตรียมสภาพแวดล้อมสำหรับสร้างไฟล์ ZIP
เตรียมสภาพแวดล้อม EC2 Instance สำหรับสร้างไฟล์ ZIP เพื่อใช้ Deploy ใน Elastic Beanstalk
- ติดตั้ง Extention Remote – SSH ใน VSCode และทดลองใช้งาน EC2 โดยตรงใน VSCode แล้ว
- ติดตั้ง Laravel บน EC2 (Amazon Linux 2023) แล้ว
เพิ่มการตั้งค่าของ NGINX
เปิดโปรเจกต์ Laravel ใน Visual Studio Code ตาม Path นี้
/var/www/html/
สร้างโฟลเดอร์และไฟล์ตาม Path ".platform/nginx/conf.d/elasticbeanstalk/laravel.conf" แล้ว NGINX จะเริ่มต้นระบบหลังจากมีไฟล์สำหรับการตั้งค่า NGINX ในขณะที่ Deploy ซึ่งในส่วนนี้เป็นการตั้งค่าสำหรับ Laravel โดยเฉพาะ ดังนั้นให้ดำเนินการตั้งค่าดังต่อไปนี้
สร้าง: ".platform/nginx/conf.d/elasticbeanstalk/laravel.conf
" และคัดลอก Code ด้านล่างนี้วางในไฟล์ laravel.conf
location / {
try_files $uri $uri/ /index.php?$query_string;
}
ตั้งค่า Elastic Beanstalk สำหรับโปรเจกต์ที่เชื่อมต่อกับ Database
การตั้งค่านี้สามารถใช้เชื่อมต่อกับ Database ต่างๆได้ เช่น Amazon RDS
, MySQL Server
, MariaDB Server
แต่ครั้งนี้จะเชื่อมต่อกับ Amazon RDS
โดยทำตามขั้นตอนดังนี้
สร้างโฟลเดอร์ .ebextensions
ในโปรเจกต์ของเรา และสร้างไฟล์ 04_env_export.config
ในโฟลเดอร์ ".ebextensions" อีกที ก็จะเป็น .ebextensions/04_env_export.config
แล้วคัดลอกโค้ดด้านล่างนี้วางในไฟล์ 04_env_export.config
และเปลี่ยน [DB_HOST
, DB_DATABASE
, DB_USERNAME
, DB_PASSWORD
] ตาม Database ที่เราใช้งาน
※หมายเหตุ
- RDS คือ
RDS Endpoint
(หากยังไม่ได้สร้าง RDS สามารถเปลี่ยนแปลงการตั้งค่าใน Elastic Beanstalk ได้ในภายหลัง)- DB_HOST ทั่วไปคือ
localhost
(*หากใช้ DB_HOST ทั่วไป ต้องติดตั้ง Database Server ที่ต้องการใช้ใน Elastic Beanstalk เพิ่มเติมหลัง Deploy เสร็จสิ้น)
option_settings:
aws:elasticbeanstalk:application:environment:
APP_NAME: Laravel
APP_ENV: local
APP_KEY: base64:sVxmnJFIjiK8yQmu+ZnPbXZiI7+VWl67178FoVMdy9k=
APP_DEBUG: false
APP_URL: http://localhost
LOG_CHANNEL: stack
LOG_DEPRECATIONS_CHANNEL: null
LOG_LEVEL: debug
DB_CONNECTION: mysql
DB_HOST: Your DB HOST
DB_PORT: 3306
DB_DATABASE: Your DB Name
DB_USERNAME: admin
DB_PASSWORD: Your Password
BROADCAST_DRIVER: log
CACHE_DRIVER: file
FILESYSTEM_DISK: local
QUEUE_CONNECTION: sync
SESSION_DRIVER: file
SESSION_LIFETIME: 120
MEMCACHED_HOST: 127.0.0.1
REDIS_HOST: 127.0.0.1
REDIS_PASSWORD: null
REDIS_PORT: 6379
MAIL_MAILER: smtp
MAIL_HOST: mailhog
MAIL_PORT: 1025
MAIL_USERNAME: null
MAIL_PASSWORD: null
MAIL_ENCRYPTION: null
MAIL_FROM_ADDRESS: "hello@example.com"
MAIL_FROM_NAME: "${APP_NAME}"
AWS_ACCESS_KEY_ID: ""
AWS_SECRET_ACCESS_KEY: ""
AWS_DEFAULT_REGION: us-east-1
AWS_BUCKET: ""
AWS_USE_PATH_STYLE_ENDPOINT: false
PUSHER_APP_ID: ""
PUSHER_APP_KEY: ""
PUSHER_APP_SECRET: ""
PUSHER_HOST: ""
PUSHER_PORT: 443
PUSHER_SCHEME: https
PUSHER_APP_CLUSTER: mt1
VITE_PUSHER_APP_KEY: "${PUSHER_APP_KEY}"
VITE_PUSHER_HOST: "${PUSHER_HOST}"
VITE_PUSHER_PORT: "${PUSHER_PORT}"
VITE_PUSHER_SCHEME: "${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER: "${PUSHER_APP_CLUSTER}"
เราสามารถเขียน Option settings ตามที่เราต้องการได้โดยดูรายละเอียดเพิ่มเติมได้ที่ลิงก์ด้านล่างนี้
ข้อควรระวัง: เราต้องเปลี่ยน
APP_DEBUG
ให้เป็น "APP_DEBUG = false" เพราะถ้าเผยแพร่เป็น "APP_DEBUG = true" จะทำให้เป็น Security Hole ซึ่งจะทำให้เว็บไซต์เกิดช่องโหว่และไม่ปลอดภัย ดังนั้นควรใส่เป็น [APP_DEBUG =false
] แต่ใน option_settings ด้านบนนี้ได้ตั้งค่าเป็น [APP_DEBUG =false
] แล้ว
เกี่ยวกับ laravel.log
ถ้าไม่มี "storage/logs/" ในไฟล์ ZIP ที่จะ Deploy ตอนสร้าง log จะเกิด Error และถ้าไม่ได้รับการอนุญาตให้เขียนข้อมูลก็จะเกิด Error เช่นกัน ในทางกลับกันถ้า laravel.log มีข้อมูลเหลืออยู่ก่อนที่จะทำการ Deploy ก็จะเป็นสาเหตุทำให้ Error ได้เหมือนกัน ดังนั้นควรเคลียร์ข้อมูลออกให้หมดก่อน ซึ่งหมายความว่าก่อนที่จะสร้างไฟล์ ZIP ให้รันคำสั่งต่อไปนี้ก่อน
เมื่อรันคำสั่งนี้แล้ว laravel.log จะมีขนาดไฟล์เป็น 0 พูดง่ายๆ คือเป็นการเคลียร์ข้อมูลใน laravel.log นั่นเอง นอกจากนี้ไม่ว่าสิทธิจะเป็น User แบบไหนก็สามารถดำเนินการคำสั่งนี้ได้
\cp -f /dev/null storage/logs/laravel.log
chmod 666 storage/logs/laravel.log
ล้างแคชต่างๆ ของ laravel
รันคำสั่งล้างแคชต่างๆ เตรียมไว้
php artisan optimize:clear
ไฟล์ที่รวมอยู่ในไฟล์ ZIP และไม่รวมอยู่ในไฟล์ ZIP
โดยปกติแล้วไฟล์ในโปรเจกต์ laravel ควรจะรวมไว้ในไฟล์ ZIP ทั้งหมด แล้วก็จะมี [Folder
] และ [File
] ที่จะไม่ทำการรวมอยู่ในไฟล์ ZIP ด้วย
Folder
ที่ยกเว้นมีดังนี้
.git
vendor
node_modules
public/build
public/hot
public/storage
File
ที่ยกเว้นมีดังนี้
storage/*.key
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.idea
.vscode
ในกรณีที่สร้างไฟล์ด้วยคำสั่ง ZIP ไฟล์ Dot (.
จะเป็นชื่อไฟล์เริ่มต้น) เนื่องจากว่าได้รับการยกเว้น ดังนั้นจำเป็นต้องเพิ่มอย่างระมัดระวัง
รันคำสั่งด้านล่างนี้เพื่อสร้างไฟล์ zip ตามสิ่งที่เขียนไว้ข้างต้นนี้ (เปลี่ยน "[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
แล้ว Download ไฟล์ ZIP เพื่อเตรียม Deploy แต่ก่อนที่จะ Deploy ให้ตรวจสอบเนื้อหาในโปรเจกต์ก่อน เมื่อเปิดไฟล์มาแล้วจะแสดงหน้าจอแบบนี้
ตั้งค่าอื่นๆ ที่แนะนำ
การตั้งค่าอื่นๆ ที่แนะนำตามลิงก์ด้านล่างนี้เป็นวิธีการตั้งค่า Elastic Beanstalk environment ในขณะที่ Deploy โดยจะทำหรือไม่ทำก็ได้ แต่ทางเราขอแนะนำให้ลองทำดูครับ เนื่องจากอำนวยความสะดวกในการตั้งค่าสำหรับการเพิ่มประสิทธิภาพ Memory และการเปรียบเทียบข้อมูลเกี่ยวกับเวลาตาม Timezone ที่เราใช้งานในสภาพแวดล้อมของเรา
- [Update] วิธีเพิ่ม Swap Memory ใน Elastic Beanstalk
- [Update] วิธีเพิ่ม Timezone ใน Elastic Beanstalk
Deploy โปรเจกต์ Laravel ใน Elastic Beanstalk
เมื่อเตรียมไฟล์ ZIP เสร็จแล้ว ทำการ Deploy โปรเจกต์ Laravel โดยดูตัวอย่างด้านล่างนี้ได้เลย
ตั้งค่า Database สำหรับโปรเจกต์
เมื่อ Deploy เสร็จแล้ว คลิก Configuration
จากเมนูด้านซ้ายใน "Environment: your_environment_name" และดูข้อมูลการเชื่อมต่อ Database ที่ Environment properties
ในหัวข้อ "Updates, monitoring, and logging" ก็จะแสดงหน้าจอแบบนี้
แล้วตั้งค่า Database สำหรับโปรเจกต์ตามลิงก์ด้านล่างนี้
ตัวอย่างครั้งนี้คือ ตั้งค่า RDS ให้เป็น Database สำหรับ Laravel
แล้วเปิด Domain บนเว็บเบราว์เซอร์จาก Elastic Beanstalk ก็จะแสดงหน้าจอแบบนี้
เพียงเท่านี้การตั้งค่าที่จำเป็นเพื่อ Deploy Laravel ใน Elastic Beanstalk ก็เสร็จเรียบร้อยแล้ว
สรุป
การตั้งค่านี้มีความจำเป็นอย่างมาก เพราะถ้า Deploy ไปยัง Elastic Beanstalk โดยที่ไม่ได้ทำการตั้งค่าเหล่านี้ อาจทำให้โปรเจกต์มีปัญหาหรือเกิด Error ในขณะรันโปรเจกต์บน Elastic Beanstalk ได้นั่นเอง หากเราป้องกันไม่ให้เกิด Error เกี่ยวกับ Permission ได้ก็จะทำให้งานราบรื่นครับ
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !