“Посібник з розгортання веб-додатку на Laravel в AWS Elastic Beanstalk за допомогою контейнеризації Docker”
Ця стаття зосереджена на розгортанні додатку Laravel в AWS Elastic Beanstalk з використанням образу Ubuntu 20.04 LTS для інстансу, у простих конфігураціях, зручних для розробників, для цілей розробки.
Передумови для продовження
- Основи команд Laravel
- Основи команд Docker
- Основи команд Linux
- Основи роботи з консоллю AWS для створення EB
Розгортання додатку Laravel в AWS EB
Увійдіть до консолі AWS та знайдіть або перейдіть до консолі Elastic Beanstalk, як показано на зображенні нижче, та натисніть на створення інстансу для створення сервера.
Створення додатку 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 -y \
libpng-dev \
libzip-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install gd \
&& docker-php-ext-install exif \
&& docker-php-ext-install gettext \
&& docker-php-ext-install pcntl \
&& docker-php-ext-install shmop \
&& docker-php-ext-install sockets \
&& docker-php-ext-install sysvmsg \
&& 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
Тут ми вибираємо варіант "Engine" як MySQL, оскільки наш додаток працює з MySQL.
Частина 1
Далі у відповідних полях потрібно ввести DB Instance Identifier (1) — назву вашої бази даних, Master Username (2) для бази даних, а також Master Password для бази даних. Пам'ятайте, що Master Username і Master Password будуть використовуватися як DBUSERNAME та DBPASSWORD. Потім виберіть конфігурацію інстансу згідно з потребами вашого проєкту (я вибрав db.t3.micro, щоб зменшити витрати, але ви можете збільшити розмір інстансу пізніше).
Частина 2
Після заповнення вищезазначених полів, прокрутіть вниз і ви побачите ще кілька полів для заповнення:
Public access: Виберіть "Yes", оскільки нам потрібно протестувати базу даних на нашій локальній машині, але після завершення тестування та розгортання поверніться та змініть на "No" для забезпечення безпеки.
Потім змініть порт бази даних на потрібний та надайте ім'я базі даних, яку ви хочете створити.
Після заповнення всіх полів натисніть кнопку "Create database" і зачекайте, поки база даних буде створена. Пам'ятайте, що облікові дані, які ви заповнили, потрібно буде додати в файл .env.
Після успішного створення ви отримаєте консоль бази даних, як показано на зображенні, і візьмете звідти ендпоінти, що будуть використовуватися як DB_HOST для вашого додатку.
Створення RDS
Далі потрібно оновити правила груп безпеки для відкриття порту MySQL. Для цього перейдіть до Security Groups та знайдіть групу безпеки для RDS.
Тепер вам потрібно оновити правила групи безпеки для відкриття порту RDS (для тестування). Перейдіть до RDS і знайдіть групу безпеки.
Група безпеки RDS
Натисніть на групу безпеки (я вибрав стандартну, але досвідчені користувачі можуть створити свою групу безпеки). Ви будете перенаправлені на сторінку, як показано на зображенні нижче.
текст перекладу
Security Groups
Натисніть на групу безпеки та додайте нове правило для вхідного трафіку, як показано на зображенні, і збережіть зміни.
Оновлення правила
Після виконання всіх кроків потрібно додати поля для бази даних у файл .env вашого додатку.
Перейдіть до файлу .env в кореневому каталозі вашого проєкту та додайте значення, як показано на зображенні нижче.
.env налаштування
Тепер нам потрібно зробити пробний запуск для створення Docker-образу. Для цього відкрийте термінал у VSCode і введіть наступну команду для створення Docker-образу.
текст перекладу
Ви можете змінити ім'я projectx на будь-яке інше.
docker build -t projectx .
docker build
Цей процес побудує проєкт і чекатиме завершення побудови.
Створення образу
Після завершення побудови ви отримаєте повідомлення про успіх без помилок.
Успішне створення
Далі перевірте зображення, які ви створили, виконавши наступну команду:
docker images
Далі потрібно протестувати, чи правильно працюють Docker-образи. Для цього потрібно запустити Docker-образ за допомогою наступної команди. Зверніть увагу на ваш image ID і вставте його в відповідну частину.
docker run -dp 80:80
Після цього контейнер має запуститися успішно, і вам потрібно перевірити працюючий контейнер, виконавши наступну команду:
docker ps
Якщо ви не бачите жодного контейнера, запустіть команду:
docker ps -a
Ця команда відобразить виведення з усіма завершеними контейнерами, і ви можете перевірити журнали контейнера, щоб дізнатися, чому він знаходиться в стані "Exited", за допомогою:
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. Я вибираю вже створений проєкт.
Вибір проєкту
Далі вас запитають, чи хочете ви завантажувати код через CodeCommit. Оскільки в цьому посібнику я показую, як код буде безпосередньо завантажуватися з вашої локальної машини та Docker Hub, я вибираю n та натискаю Enter.
Вибір методу завантаження коду
Тепер все налаштовано! Ви побачите нову папку для конфігурацій EB та файлів, як показано на зображенні нижче.
текст перекладу
Конфігурації EB
Далі потрібно створити файл Dockerrun.aws.json, як показано на зображенні нижче.
текст перекладу
Файл визначає місце розташування Docker-образу, порти для відкриття, змінні середовища та інші деталі, необхідні для запуску Docker-контейнера на Elastic Beanstalk.
Dockerrun.aws.json
Зверніть увагу, що ім'я образу вказано як назва вашого проєкту, який ви створили.
Для просунутих користувачів, які можуть вказати змінні середовища разом із цим, створивши секрети
Далі ми можемо розгорнути наш код на EB безпосередньо, запустивши нижченаведену команду з кореня вашої проєктної директорії, і почекати, поки він буде розгорнутий.
eb deploy
eb deploy
EB розгортання в AWS Beanstalk
Після очікування ви отримаєте виведення в терміналі, як-от Environment update completed successfully, і зможете перевірити лінк EB, щоб побачити застосунок.
Далі потрібно забезпечити безпеку нашої бази даних та її портів. Оскільки ми відкрили порти БД для тестування на локальному середовищі, ми хочемо зробити її приватною та дозволити доступ лише з EB. Для цього йдемо в RDS, знаходимо групу безпеки VPC і змінюємо вхідні правила, як показано на зображеннях нижче.
RDS Security Groups
Редагування вхідних правил
Знайдіть групу безпеки для вашого Elastic Beanstalk і виберіть її, як показано на зображенні нижче, замість 0.0.0.0/0.
Вхідне правило групи безпеки встановлено на групу безпеки EB
Все готово!!!
Перекладено з: Docker Deploy Laravel In Elastic Beanstalk