Skip to main content
Деплой Laravel в AWS Beanstalk

Деплой Laravel приложения в AWS Beanstalk

Недавно довелось поработать с интересным сервисом от AWS — Elastic Beanstalk. Сервис специально разработан для быстрого развёртывания приложений на различных языках программирования, в том числе и PHP. Сервис будет заниматься обслуживанием, мониторингом и масштабированием вашего приложения в автоматическом режиме, что довольно удобно и позволяет избавится от ручной настройки серверов, баллансировщиков и т.д., предлагая что-то похожее на IaC (Инфраструктура как код).

Почему я решил написать этот гайд? В интернете нет нормальных руководств по настройке деплоя вашего приложения в Beanstalk, авторы большинства гайдов предлагают вручную архивировать код приложения, открывать браузер, загружать туда код, что меня не устраивает, этот процесс должен быть автоматизирован.

Оглавление

Создание окружения

Процесс регистрации аккаунта описывать я не буду, там всё тривиально, мы сразу приступим к работе.

Находим в меню сервисов, Elastic Beanstalk (раздел Compute). Переходим в в этот сервис и нажимаем кнопку Create Application:

Application name — это имя вашего приложения, пишем своё. В моем случае — laravel test deploy.

Application tags — опционально, можно не добавлять теги. Они используются для группировки/фильтрации ваших ресурсов.

Platform — Выбираем PHP, версию PHP выбираем по желанию, я выбрал 7.4

Application code — оставляем Sample Application, позже загрузим свой код

Вы также можете настроить больше параметров нажав на кнопку внизу формы Configure more options, но нам пока это не нужно, нажимаем Create application.

Ожидаем пару минут пока AWS сделает все нужные настройки и по завершению мы попадаем на страницу нашего приложения. Слева вверху есть ссылка по которой мы можем просмотреть сайт в браузере.

Переходим по ссылке и видим:

Это значит, что вы всё правильно сделали. Пора приступать к деплою Laravel приложения.

Подготовка приложения

Вы можете использовать уже готовое приложение, но для деплоя я создам новый проект.

composer create-project --prefer-dist laravel/laravel aws-beanstalk

Дожидаемся установки всех компонентов и переходим к следующему шагу.

Установка утилит AWS

Подробно процесс установки утилит для работы с AWS и AWS Beanstalk описан по этой ссылке — https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-advanced.html. Выбирайте вашу операционную систему и запускайте команды по очереди. Мы же приступим к настройке.

Настройка eb cli

Открываем терминал, переходим в директорию проекта и запускаем команду eb init:

Выбираем регион, можно оставить стандартный который предлагают.

Теперь нужно установить ключи доступа, как их получить описано в статье — https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys.

Краткое руководство:

  • Переходим по ссылке — https://console.aws.amazon.com/iam/home?#/users
  • Нажимаем кнопку Add User
  • Вводим имя пользователя и ставим галочку Programmatic access
  • Переходим к следующему шагу.
  • Выбираем — Attach existing policies directly
  • В строке поиска пишем beanstalk, находим — AWSElasticBeanstalkFullAccess
  • Шаг с тегами прокликиваем
  • В конце нажимаем Create User

После этих действий мы увидим ключи доступа для юзера, желательно их скачать.

Возвращаемся в консоль и копируем нужные значения. Сначала Access key ID, следом — Secret access key. Нажимаем ENTER.

Выбираем приложение которое мы создали и на этом начальная настройка утилит закончена, приступаем к деплою приложения.

Загрузка приложения в Elastic Beanstalk

Создадим директорию в корне проекта с именем .ebextensions, а внутри этой директории создаем файл php-settings.config, скопируйте в него данный код:

option_settings:
  aws:elasticbeanstalk:container:php:phpini:
    document_root: /public
    memory_limit: 128M
    zlib.output_compression: "Off"
    allow_url_fopen: "On"
    display_errors: "Off"
    max_execution_time: 60
    composer_options: --optimize-autoloader

Теперь можем приступить к деплою, запускаем команду eb deploy и ждем. Через некоторое время проверяем вашу ссылку и видим:

Приложение удалось загрузить, всё работает, но еще нет подключения к базе данных и переменных окружения. Об этом я напишу в следующей статье.

Laravel Form Request, как использовать один класс для обновления и создания записи

С появлением Form Request, хорошей практикой стало выносить валидацию из контроллера в отдельный класс. Однако в отдельных редких случаях это вызывает неудобства. Сегодня я покажу как использовать один класс для валидации данных при обновлении или создании записи.

Подробнее

Laravel whereHas / has. Выбираем только модели со связями

Очень часто возникает ситуация, когда нужно выбрать только те модели у которых есть связь. Например посмотреть сколько пользователей оставили комментарий, статьи с комментариями, вывести список пользователей у которых есть корзина с товарами и так далее. Для этого разработчики фреймворка подготовили нам несколько полезных методов — has, whereHas.

Подробнее
Сортировка по полю из связанной модели

Laravel — Сортировка по полю из связанной модели

Очень часто возникает ситуация, когда вам необходимо получить коллекцию моделей отсортированную по полю из связанной модели. Например, вы хотите получить список постов отсортированных по последнему оставленному комментарию. Сегодня мы разберем один способ применения такой сортировки используя Eloquent.

Подробнее

Laravel Single Action Controller

Single Action Controller — это контроллер в приложении который включает в себя магический метод __invoke который и является обработчиком запроса. 

Пакет написал разработчик Илья Сакович, смысл пакета заключается в том, чтобы не раздувать контроллеры до больших размеров и сделать маршруты более приятными.

Подробнее

Исправляем ошибку в Laravel: Specified key was too long

Я думаю многие из вас сталкивались с ошибкой при попытке запуска миграций в Laravel. Дело в том, что начиная с версии 5.4, Laravel использует другой набор символов для базы данных, а именно utf8m4 который поддерживает emoji (ну куда же без них). Однако, если вы используете в качестве движка базы данных MySQL v5.7.7 и выше, то все у вас будет работать из коробки, ничего делать не нужно.
Подробнее

Laravel BelongsTo — стандартные модели.

Думаю каждый кто использовал в своей работе фреймворк Laravel и кто пользовался связями belongsTo() часто сталкивался с проверкой на существование этой связи. Сегодня я покажу вам простой способ как можно упростить себе жизнь используя стандартные модели.
Подробнее