[Update] การตั้งค่าที่จำเป็นเพื่อ Deploy Laravel ใน Elastic Beanstalk

การตั้งค่าโปรเจกต์ Laravel ก่อน Deploy จะช่วยให้ไม่เกิด Error ขณะที่เราใช้งานโปรเจกต์ Laravel โดยรันบน Elastic Beanstalk ดังนั้นแนะนำให้ตั้งค่าตามเนื้อหาในบทความนี้ก่อนที่จะทำการ Deploy ครับ

สวัสดีครับ 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 ที่เราใช้งานในสภาพแวดล้อมของเรา

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) ครับ !

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