Під час роботи над побічним проектом, мені знадобився швидкий, зручний і дешевий спосіб розгорнути контейнеризований додаток у хмарі. Я знайшов це рішення, використовуючи GitHub Actions, Dockerhub та AWS ElasticBeanstalk.
Amazon ElasticBeanstalk — це сервіс, який абстрагує всі налаштування для хостингу веб-додатка, автоматично створюючи екземпляри EC2, налаштовуючи автоматичне масштабування, групи безпеки тощо.
Я завжди вибираю використовувати Infrastructure as Code (IaC), оскільки це дає змогу легко знищувати, відновлювати та керувати ресурсами інфраструктури. Це також допомагає підтримувати чистоту облікового запису вашого хмарного провайдера та запобігти несподіваним витратам.
Код Terraform
Ми створимо кілька ресурсів AWS, щоб налаштувати середовище ElasticBeanstalk для хостингу нашого додатка.
Я також створю базу даних.
Наступний файл terraform створює всі необхідні ресурси для роботи додатка в ElasticBeanstalk.
Змінні Terraform
Зверніть увагу, що я використовую блок "dynamic" для налаштування всіх змінних середовища додатка, мій файл variables.tf
виглядає так:
Розділ locals
використовується в налаштуваннях для динамічного блоку, щоб пройти через нього та згенерувати всі налаштування середовища.
Оскільки ми хочемо розгорнути лише Docker-образ, наш дескриптор додатка буде містити Dockerrun.aws.json
з наступним кодом:
Terraform код створить S3-бакет, завантажить цей файл і створить версію додатка в ElasticBeanstalk, яку ми пізніше розгорнемо за допомогою інтеграції з GitHub.
У цьому прикладі я використовую nginx:latest
, але ви можете використовувати будь-який образ на свій вибір, навіть приватно хостовані Docker образи.
Якщо ви відкриєте консоль AWS, ви повинні побачити готове середовище.
GitHub Actions
Припускаю, що у вас вже налаштований Docker registry, і ви знайомі з цими концепціями. У цьому прикладі я використовую Dockerhub для хостингу своїх образів.
Ось як виглядає мій файл workflow для GitHub:
Перший workflow побудує Docker-образ і виконає наступні дії:
- якщо це гілка
master
, вона тегуватиме образ за допомогою git-хеша та оновлюватиме тег latest. - якщо це тег, наприклад
v1.x
, він відкине v і тегуватиме образ з версією, не оновлюючи тег latest.
Другий workflow використовує aws-cli action, щоб оновити середовище. Зверніть увагу, що нам не потрібна нова версія додатка Elastic Beanstalk, нам потрібно лише оновити середовище, завантажити останній образ і перезапустити його.
Сподіваюся, це налаштування буде корисним для вас, і буду радий відповісти на будь-які питання.
Перекладено з: Deploy any containerized app on AWS ElasticBeanstalk with GitHub actions and Terraform.