“Посібник з розгортання веб-додатку Laravel в AWS Elastic Beanstalk з використанням Docker-контейнеризації”
Ця стаття зосереджена на розгортанні додатку Laravel в AWS Elastic Beanstalk з використанням образу Ubuntu 20.04 LTS для простих, зручних для розробника налаштувань для розробки.
Передумови для подальших кроків
- Базові знання команд Laravel
- Базові знання команд Docker
- Базові знання команд Linux
- Базові знання консолі AWS для створення EB
Розгортання додатку Laravel на AWS EB
Увійдіть до консолі AWS та знайдіть або перейдіть до консолі Elastic Beanstalk, як показано на зображенні нижче, і натисніть "Create instance" для створення сервера.
Створення додатку в Elastic Beanstalk
Далі потрібно створити додаток EB, для цього натисніть кнопку Create Application, як показано на зображенні вище.
Після цього вам потрібно вказати інформацію про додаток, як показано на зображенні нижче. Змініть ім’я додатку на назву вашого проекту та виберіть платформу Docker. Використовуйте останню версію та натисніть Create Application, як показано на зображенні нижче.
Зачекайте, поки додаток буде створено, ви побачите журнал створення додатку, як показано на зображенні нижче.
Після кількох хвилин ви будете перенаправлені на сторінку додатку, як показано на зображенні нижче.
Далі потрібно «докеризувати» ваш PHP Laravel додаток, для цього перейдіть в корінь вашого проекту, відкрийте його у вашому улюбленому редакторі, я особисто використовую Vscode.
Створіть Dockerfile у корені вашого проекту, як показано на зображенні нижче, і додайте до нього команди Docker.
FROM php:7.4-fpm
# Встановлення необхідних системних пакетів і PHP розширень
RUN apt-get update && apt-get install -
zip \
unzip \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install gd \
&& docker-php-ext-install zip \
&& docker-php-ext-install opcache \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install calendar \
&& docker-php-ext-install exif \
&& docker-php-ext-install gettext \
&& docker-php-ext-install pcntl \
&& docker-php-ext
&& docker-php-ext-install sysvsem \
&& docker-php-ext-install sysvshm
# Встановлення Nginx
RUN apt-get update && apt-get install -y nginx
# Налаштування Nginx для обробки PHP файлів
RUN rm /etc/nginx/sites-enabled/default
COPY nginx.conf /etc/nginx/sites-enabled/default
# Встановлення Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
&& php -r "unlink('composer-setup.php');"
# Встановлення робочої директорії
WORKDIR /var/www/html
# Копіювання коду в контейнер
COPY .
/var/www/html/
# Встановлення залежностей
RUN composer install
# Налаштування прав доступу до директорій storage і bootstrap
RUN chgrp -R www-data storage bootstrap/cache && \
chmod -R ug+rwx storage bootstrap/cache
RUN php artisan migrate
RUN php artisan optimize:clear
# Відкриття порту 80
EXPOSE 80
# Запуск Nginx і PHP-FPM
CMD service nginx start && php-fpm && --restart=on-failure
Dockerfile
Тут ми використовуємо php:7.4-fpm як базовий образ для запуску нашого додатку, також ми використовуємо nginx для маршрутизації Laravel-додатку з Docker-контейнера. Тепер нам потрібно створити конфігураційний файл nginx. Для цього створіть файл nginx.conf у корені вашого проекту, як показано нижче.
server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Отже, Nginx допомагає обслуговувати додаток на порту 80, коли контейнер створюється.
Далі нам потрібно створити базу даних для нашого додатку. Тут ми використовуємо AWS RDS як базу даних, тому створимо її в AWS.
Увійдіть до консолі AWS і знайдіть або перейдіть до консолі RDS, як показано на зображенні нижче, та натисніть "Create database" для створення сервера.
Створення RDS
Тут ми вибираємо як рушій MySQL, оскільки мій додаток працює на MySQL.
Частина 1
Далі вкажіть DB Instance Identifier (1) як ім'я вашої бази даних, потім вкажіть Master Username для бази даних (2). Також вкажіть Master Password для бази даних. Запам'ятайте ці дані, адже вони будуть використовуватись як DBUSERNAME та DBPASSWORD. Потім виберіть конфігурацію інстанції, що підходить для вашого проекту (я вибрав db.t3.micro для зменшення перевитрат).
Частина 2
Після заповнення всіх полів, прокрутіть вниз і заповніть додаткові поля:
Public access: Виберіть Yes, оскільки нам потрібно протестувати базу даних на нашій локальній машині, але після тестування та розгортання потрібно буде повернути це значення на No (тільки для безпеки).
Далі змініть порт бази даних за бажанням і дайте ім'я базі даних.
Після заповнення всіх полів натискайте Create DB і зачекайте на створення бази даних. Запам'ятайте введені дані, оскільки ми вставимо їх у наш файл .env.
Після успішного створення ви побачите консоль бази даних, як на зображенні нижче, де буде вказано DB_HOST для нашого додатку.
Створення RDS
Далі потрібно оновити правила безпеки груп, щоб налаштувати порт для MySQL. Перейдіть до Security Groups та знайдіть безпекову групу для RDS.
Далі потрібно оновити правила безпеки для відкриття порту RDS (для тестування). Для цього перейдіть до RDS і знайдіть відповідну безпекову групу.
Безпекова група RDS
Натисніть на безпекову групу (я вибрав стандартну, але просунуті користувачі можуть створити свою власну групу безпеки). Вас буде перенаправлено на сторінку, як показано на зображенні нижче.
Безпекові групи
Натискайте на безпекову групу і додайте нове правило для вхідного трафіку, як показано на зображенні нижче, і збережіть його.
Оновлення правил
Після завершення всіх кроків, нам потрібно додати поля бази даних у файл .env нашого додатку.
Перейдіть до файлу .env у корені вашого проекту та додайте значення, як показано на зображенні нижче.
Налаштування .env
Тепер нам потрібно зробити пробний запуск для створення образу Docker. Щоб побудувати образ Docker, відкрийте термінал у vscode і введіть нижчевказану команду для побудови Docker-образу.
Ви можете змінити назву проекту на будь-яку іншу
docker build -t projectx .
Створення Docker образу
Це побудує проект і буде чекати до завершення побудови.
Побудова образу
Після завершення побудови ви отримаєте сповіщення про успіх без помилок.
Успішна побудова
Тепер перевірте образи, які ви побудували, за допомогою наступної команди:
docker images
Тепер потрібно перевірити, чи правильно працює Docker-образ. Для цього запустіть Docker-образ за допомогою наступної команди. Зверніть увагу на ID образу і вставте його в цей розділ:
docker run -dp 80:80
Після цього образ запуститься успішно, і ви можете перевірити працюючі контейнери, використовуючи наступну команду:
docker ps
Якщо ви не бачите жодного контейнера, запустіть наступну команду:
docker ps -a
Це покаже зупинені контейнери, і ви зможете перевірити журнали контейнера, чому він знаходиться в стані "зупинено", за допомогою команди:
docker logs
Якщо все працює правильно на першій команді docker ps, ви готові до наступного кроку.
Тепер нам потрібно отримати IP-адресу Docker-контейнера, для цього запустіть наступну команду:
docker inspect
Інспекція контейнера
Запишіть IP-адресу та вставте її в браузер, щоб побачити результат.
Після успішної Docker-кастомізації та тестування на локальній машині, тепер нам потрібно надіслати це в середовище Elastic Beanstalk. Для цього потрібно встановити AWS CLI на вашу систему.
НАТИСНІТЬ ЦЕ ДЛЯ ВСТАНОВЛЕННЯ AWS CLI
Після цього перейдіть до налаштувань безпеки у верхньому правому меню вашого облікового запису AWS, як показано на зображенні нижче:
Основне меню налаштувань AWS
Після цього перейдіть до Access Key і створіть новий ключ доступу, запишіть Access Key ID та Secret Key ID.
Створення ключів доступу
Введіть наступну команду у вашому терміналі, як показано на зображенні нижче, і введіть деталі, які вас просять.
Далі перейдіть до каталогу проекту, відкрийте термінал і ініціюйте Elastic Beanstalk [EB], виконавши наступну команду і вибравши регіон, в якому ви створили EB. Для мого проекту це регіон ap-south-1 (Мумбаї), тому я вибираю 6 і натискаю Enter.
eb init
Вибір регіону для розгортання EB
Далі вас попросять ввести ім'я проекту. Виберіть ім'я проекту, який ви раніше створили для EB, або створіть новий EB. Я вже створив його на початку документа, тому вибираю свій проект.
Вибір проекту
Далі вони запитають, чи хочете ви завантажити код через Code Commit. Оскільки в цьому документі я показую, як код буде безпосередньо завантажуватися з нашої локальної машини та Docker Hub, я вибираю n та натискаю Enter.
Вибір способу розгортання коду через Code Commit
Тепер все готово! Ви побачите нову папку для конфігурацій EB та файли, створені, як показано на зображенні нижче.
Конфігурації EB
Далі нам потрібно створити файл Dockerrun.aws.json, як показано на наступному зображенні.
Файл визначає місцезнаходження Docker-образу, порти для відкриття, змінні середовища та інші деталі, необхідні для запуску Docker-контейнера на Elastic Beanstalk.
Dockerrun.aws.json
Зверніть увагу, що ім'я образу вказано як назва вашого проекту, який ви побудували.
Для досвідчених користувачів, які можуть вказати середовище разом із цим, створивши секрети.
Далі ми можемо розгорнути наш код на EB безпосередньо, виконавши нижчевказану команду з кореневої директорії нашого проекту, і почекати, поки він буде розгорнутий.
eb deploy
eb deploy
EB deploying in AWS Beanstalk
Після деякого очікування ви побачите журнал подій у терміналі, наприклад, Environment update completed successfully., і ви зможете перевірити посилання EB, щоб переглянути додаток.
Далі ми повинні захистити нашу базу даних і її порт, оскільки ми хочемо протестувати її локально, ми відкриємо порти бази даних, щоб зробити її приватною та дозволити доступ лише з EB. Для цього перейдімо до RDS, знайдемо групу безпеки VPC і змінимо правила вхідного доступу, як показано на нижчевказаних зображеннях.
RDS Security Groups
Edit Inbound rules
Знайдіть групу безпеки для Elastic Beanstalk і виберіть, як показано на зображенні нижче, замість 0.0.0.0/0.
Security Group Inbound is Set to EB Security group
Все готово!!!
Перекладено з: Docker Deploy Laravel In Elastic Beanstalk