У цьому посібнику я надам покрокову інструкцію щодо розгортання докеризованого додатка (NestJS API + PostgreSQL база даних) на AWS Elastic Beanstalk (AWS EB).
Не буду заглиблюватися в деталі пов'язаних сервісів, тому ви повинні мати основні знання про IAM, EC2 (балансування навантаження, авто масштабування), RDS, S3, CloudWatch, CodePipeline, Route53, Certificate Manager, …
Цей посібник включає 3 частини:
- Частина 1: Розгортання Docker-додатку на AWS Elastic Beanstalk
- Частина 2: Налаштування безперервного розгортання для AWS Elastic Beanstalk
- Частина 3: Налаштування користувацького домену для AWS Elastic Beanstalk (Незабаром)
Ви можете прочитати більше про інфраструктуру AWS Elastic Beanstalk тут:
- Початок роботи
- Концепції
- AWS EB з використанням Docker контейнера
- Управління середовищем AWS EB
- Конфігурація середовища AWS EB
Зображення з docs.aws.amazon.com
Управління правами користувача IAM
Відкрийте IAM — Консоль користувачів (використовуйте root або IAM користувача з достатніми правами), потім натисніть Create User
та надайте наступні дозволи — рекомендується призначити ці дозволи в групі користувачів:
Вміст кастомної політики IAMOwnedView
:
Вміст кастомної політики ServiceRoleManagement
(референс документа):
Управління профілями екземплярів AWS EB (референс документа)
Відкрийте IAM — Консоль ролей, виберіть Create Role
:
Додайте політики дозволів:
AmazonEC2ContainerRegistryReadOnly
AWSElasticBeanstalkMulticontainerDocker
AWSElasticBeanstalkWebTier
AWSElasticBeanstalkWorkerTier
Встановіть ім'я ролі aws-elasticbeanstalk-ec2-role
, потім збережіть.
Управління ролями служби AWS EB (референс документа)
Відкрийте IAM — Консоль ролей, виберіть Create Role
:
Додайте політики дозволів:
AWSElasticBeanstalkEnhancedHealth
AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy
AWSElasticBeanstalkService
Встановіть ім'я ролі aws-elasticbeanstalk-service-role
, потім збережіть.
Налаштування CLIs та профілів AWS
Встановіть awscli
, awsebcli
на macOS:
brew update
# встановіть awscli
brew install awscli
aws --version
# встановіть awsebcli
brew install awsebcli
eb --version
Додайте профіль aws до вашого awscli:
# Використовуйте: aws configure --profile AWS_PROFILE
aws configure --profile crewcall
Далі введіть ваші Access key ID
, Secret access key
, Region
— використовуйте IAM обліковий запис, який ми вже створили на попередніх кроках.
Рекомендація: Рекомендую використовувати ім'я проєкту для вашого AWS профілю.
Пропозиція: Рекомендую використовувати ім'я проєкту для вашого профілю AWS.
FYI: Профілі AWS зберігаються в ~/.aws/credentials
та ~/.aws/config
. Це дозволяє легко оновлювати ваш профіль, змінюючи ці файли.
Створення Docker-образу
У кореневій теці проєкту додайте файл Dockerfile
з наступним вмістом:
Додайте файл .dockerignore
:
Переконайтеся, що ваш Docker-образ успішно створено перед тим, як переходити до наступного кроку:
docker build --target production -t crewcall-api-production:latest .
Створення репозиторію AWS ECR
Відкрийте панель ECR, створіть новий приватний репозиторій:
Після створення на сторінці репозиторію ви зможете знайти команди для завантаження в розділі View push commands
. Крім того, ви зможете переглядати всі образи, які були завантажені.
Завантаження вашого Docker-образу в репозиторій ECR
Отримайте токен автентифікації та авторизуйте ваш Docker-клієнт для вашого реєстру:
aws ecr get-login-password --profile crewcall --region ap-southeast-1 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com
Побудуйте ваш Docker-образ за допомогою наступної команди. Ви можете пропустити цей крок, якщо ваш образ уже створено:
docker build --target production -t crewcall-api-production:latest .
Після завершення складання створіть новий тег для вашого образу:
docker tag crewcall-api-production:latest xxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/crewcall-api-production:latest
Завантажте цей образ у ваш новостворений репозиторій AWS:
docker push xxxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/crewcall-api-production:latest
Пропозиція: Для зменшення витрат на зберігання в ECR, налаштуйте Lifecycle Policy
, яка автоматично видаляє попередні образи. Давайте встановимо правила, які видаляють всі не помічені образи та зберігають тільки останні 5 образів.
Створення docker-compose.yml
AWS Elastic Beanstalk для Docker-середовища вимагає наявність docker-compose.yml
для запуску контейнерів, основаних на визначених сервісах. За замовчуванням EB перенаправляє всі запити на машину безпосередньо на PORT 80
. Тому ваш docker-compose.yml
має включати відображення на порт 80 на хості.
У моєму випадку є два сервіси:
api
: основний додаток NestJS.nginx
: зворотний проксі для обслуговування публічних статичних файлів.
Нарешті, переконайтеся, що ваш docker-compose.yml
може виконуватись без проблем на вашій локальній системі: налаштуйте змінні середовища, а потім запустіть docker-compose up
.
Налаштування PostgreSQL бази даних з AWS RDS
Хоча EB має вбудовану функціональність для створення екземпляра RDS, я вважаю, що набагато простіше налаштувати його вручну.
Слідуйте офіційній документації для створення екземпляра PostgreSQL бази даних тут. Під час створення потрібно звернути увагу на наступні налаштування:
- Доступність і надійність: Залежно від вимог вашого додатку, ви можете вибрати
Multi-AZ DB instance
(з одним основним екземпляром бази даних) абоMulti-AZ DB Cluster
(з одним основним екземпляром бази даних + 2 читабельні резервні екземпляри бази даних). - Налаштування облікових даних: Вкажіть ім'я користувача та пароль для бази даних.
- Тип екземпляра бази даних: Виберіть тип екземпляра бази даних. Ви можете переглянути доступні класи у списку, наданому тут: https://aws.amazon.com/rds/instance-types.
- Віртуальна приватна мережа (VPC): Виберіть
Default VPC
.
Альтернативно, ви можете використовувати власну VPC, якщо вона у вас є. - Публічний доступ: Виберіть
No
. Лише інстанси Amazon EC2 та інші ресурси всередині VPC можуть підключатися до вашого кластера. - Група безпеки VPC (фаєрвол): Виберіть
Create New
, потім надайте ім'я групи безпеки. - Додаткова конфігурація: Встановіть
Initial database name
, щоб RDS створив її автоматично. Якщо не вказано, вам потрібно буде створити базу даних вручну.
Після завершення ви зможете отримати точку підключення та порт на головній сторінці:
Ініціалізація середовища EB з демонстраційним додатком
Перейдіть до панелі керування AWS EB, створіть нове середовище з платформою Docker.
Налаштування доступу до служби: Виберіть роль служби AWSEB та профіль інстансу, які ми створили раніше.
Налаштування мережі, бази даних та тегів:
- Використовуйте стандартну VPC (ви можете використовувати свою VPC, якщо вона у вас є).
- Виберіть усі підмережі інстансів та активну публічну IP-адресу.
- Щодо бази даних, можете ігнорувати її, оскільки ми вже налаштували її раніше.
Налаштування трафіку інстансів та масштабування:
- Групи безпеки EC2: Залиште порожнім, EB створить стандартні групи безпеки для середовища.
- Група автоматичного масштабування: Виберіть тип середовища
Load balanced
; налаштуйте кількість інстансівMin — Max
(якщо Min == Max, це вимикає тригер масштабування); виберіть типи інстансів відповідно до вимог вашого додатку (достатньо vCPU та пам'яті); налаштуйте тригер масштабування (метрика на середнє значенняCPUUtilization
, ≥ 70% спрацьовує для додавання ще 1 інстансу, ≤ 30% спрацьовує для видалення 1 інстансу). - Налаштування мережі балансувальника навантаження: Встановіть видимість на
Public
, виберіть усі доступні підмережі для балансувальника навантаження. - Тип балансувальника навантаження: Виберіть
Application load balancer
. - Процес перевірки здоров'я: За замовчуванням шлях
/
.
Налаштування оновлень, моніторингу та журналювання:
- Політика розгортання: Використовуйте політику
Rolling
для розгортання без часу простою. Детальніше про політики розгортання читайте в цьому документі. - Проксі-сервер: Виберіть
none
. У нас вже налаштований nginx у docker-compose. - Стрімінг журналів інстансів до CloudWatch logs: Активовано, виберіть метод зберігання та життя журналів.
- Змінні середовища: Пропустіть для демонстраційного додатка, зміни можна внести пізніше.
Перевірте конфігурації перед тим, як створити та надіслати.
Після завершення створення ви отримаєте панель керування середовищем, подібну до цієї.
Ви можете відвідати домен середовища, щоб перевірити, чи може демонстраційний додаток успішно працювати.
Перегляд журналів: Ви можете перевірити весь процес розгортання, журнали роботи додатка в CloudWatch — Log groups, в основному потрібно зосередитися на:
/var/log/eb-engine.log
— журнали активності aws eb./var/log/eb-docker/containers/eb-current-app/stdouterr.log
— всі журнали Docker контейнерів.
Потік журналів на локальній машині:
aws logs tail /aws/elasticbeanstalk/crewcall-api-production/var/log/eb-docker/containers/eb-current-app/stdouterr.log --follow --profile crewcall
Більше інформації про перегляд журналів середовища EB можна знайти в офіційному документі AWS.
Конфігурація середовища: Ви можете знайти або змінити будь-які налаштування середовища EB тут.
Отримайте ім'я головної групи безпеки інстансів у середовищі. Будь-які ресурси, що використовуються в додатку (наприклад, RDS PostgreSQL, ElasticCache — Redis, …), повинні мати правила трафіку Inbound
з джерелом до цієї групи безпеки.
Розгортання вашого додатка в створене середовище EB
Редагуйте правила безпеки групи RDS бази даних Inbound
: Виберіть Custom
джерело, потім додайте EC2 Security Groups
середовища EB до списку дозволених.
Додайте необхідні змінні середовища для додатка в середовище EB:
- Відкрийте конфігурацію середовища
- Редагуйте
Updates, monitoring, and logging
- У розділі
Environment properties
задайте всі необхідні змінні середовища, потім натиснітьApply
.
Запустіть eb init
у директорії вашого проєкту, щоб ініціалізувати репозиторій awsebcli: Виберіть відповідний регіон і додаток, а також вимкніть CodeCommit.
eb init --profile crewcall
Примітка: Ця команда змінює .gitignore
. Будь ласка, переконайтеся, що ви закомітили свої зміни.
Розпочніть розгортання вашого додатка в середовище EB:
# eb deploy EB_ENVIRONMENT --profile AWS_PROFILE
eb deploy crewcall-api-production --profile crewcall
Дочекайтеся завершення процесу розгортання, а потім перевірте знову. Якщо під час розгортання виникли помилки, ви можете дослідити їх за допомогою CloudWatch — Log groups.
Доступ по SSH до EC2 інстансів — потрібно увімкнути публічну IP-адресу в налаштуваннях інстансу:
# Налаштування пари ключів для інстансів
eb ssh crewcall-api-production --profile crewcall --setup
# Підключення до EC2 інстансів за допомогою створеної пари ключів
eb ssh crewcall-api-production --profile crewcall
# Надання прав root, якщо ви хочете використовувати команди Docker
sudo su
docker ps
docker exec -it container_id_or_name sh
# Більшість логів сервісів можна знайти в директорії /var/log.
cd /var/log
# Перегляд логів Docker контейнера
tail -f /var/log/eb-docker/containers/eb-current-app/eb-stdouterr.log
# Перегляд журналів активності eb
tail -f /var/log/eb-engine.log
Менший zip-файл архіву — опціонально:
Зазвичай, awsebcli
використовує git archive
для створення zip-файлу архіву — він виключає файли, вказані в .gitignore
та директорії .git
. Однак, для Docker-платформи, нам потрібні лише docker-compose.yml
та відповідні конфігураційні файли. Для керування цим додайте файл .ebignore
з наступним вмістом.
Закомітьте зміни, а потім повторно розгорніть додаток.
Налаштування життєвого циклу версії додатка — опціонально: Коли ви розгортаєте код, EB створює нову версію додатка в форматі zip і зберігає її в S3. Щоб зменшити витрати на зберігання в S3, ми повинні обмежити кількість збережених версій.
Як і для політики життєвого циклу ECR, я зберігаю тільки останні 5 версій.
Ми вже завершили всі необхідні кроки для розгортання докеризованого додатка в середовищі AWS EB. Якщо в коді є зміни, будь ласка, дотримуйтесь цих кроків для повторного розгортання додатка:
- Якщо ви додали нові змінні середовища (ENVs), додайте їх як у файл
docker-compose.yml
, так і в налаштування середовища EB. - Побудуйте та завантажте новий Docker-образ на ECR.
- Оновіть файл
docker-compose.yml
, щоб використовувати новостворений Docker-образ. - Ініціюйте розгортання, виконавши команду
eb deploy EB_ENVIRONMENT --profile AWS_PROFILE
. - Дочекайтеся завершення розгортання, а потім перевірте, чи працює новий код, як очікується.
Це все для першої частини цієї серії, більшість кроків виконуються вручну за допомогою команд з локальної машини. Для наступної частини ми налаштуємо CI/CD для автоматизованого розгортання за допомогою AWS CodePipeline або GitHub Actions.
Перекладено з: Deploy Dockerized Application To AWS Elastic Beanstalk