Розгортання докеризованого додатка на AWS Elastic Beanstalk

pic

У цьому посібнику я надам покрокову інструкцію щодо розгортання докеризованого додатка (NestJS API + PostgreSQL база даних) на AWS Elastic Beanstalk (AWS EB).

Не буду заглиблюватися в деталі пов'язаних сервісів, тому ви повинні мати основні знання про IAM, EC2 (балансування навантаження, авто масштабування), RDS, S3, CloudWatch, CodePipeline, Route53, Certificate Manager, …

Цей посібник включає 3 частини:

Ви можете прочитати більше про інфраструктуру AWS Elastic Beanstalk тут:

pic

Зображення з docs.aws.amazon.com

Управління правами користувача IAM

Відкрийте IAM — Консоль користувачів (використовуйте root або IAM користувача з достатніми правами), потім натисніть Create User та надайте наступні дозволи — рекомендується призначити ці дозволи в групі користувачів:

pic

Вміст кастомної політики IAMOwnedView:

Вміст кастомної політики ServiceRoleManagement (референс документа):

Управління профілями екземплярів AWS EB (референс документа)

Відкрийте IAM — Консоль ролей, виберіть Create Role:

pic

Додайте політики дозволів:

  • AmazonEC2ContainerRegistryReadOnly
  • AWSElasticBeanstalkMulticontainerDocker
  • AWSElasticBeanstalkWebTier
  • AWSElasticBeanstalkWorkerTier

Встановіть ім'я ролі aws-elasticbeanstalk-ec2-role, потім збережіть.

pic

Управління ролями служби AWS EB (референс документа)

Відкрийте IAM — Консоль ролей, виберіть Create Role:

pic

Додайте політики дозволів:

  • AWSElasticBeanstalkEnhancedHealth
  • AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy
  • AWSElasticBeanstalkService

pic

Встановіть ім'я ролі aws-elasticbeanstalk-service-role, потім збережіть.

pic

Налаштування 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, створіть новий приватний репозиторій:

pic

Після створення на сторінці репозиторію ви зможете знайти команди для завантаження в розділі View push commands. Крім того, ви зможете переглядати всі образи, які були завантажені.

pic

Завантаження вашого 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 образів.

pic

pic

pic

Створення 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 створив її автоматично. Якщо не вказано, вам потрібно буде створити базу даних вручну.

Після завершення ви зможете отримати точку підключення та порт на головній сторінці:

pic

Ініціалізація середовища EB з демонстраційним додатком

Перейдіть до панелі керування AWS EB, створіть нове середовище з платформою Docker.

pic

Налаштування доступу до служби: Виберіть роль служби AWSEB та профіль інстансу, які ми створили раніше.

pic

Налаштування мережі, бази даних та тегів:

  • Використовуйте стандартну VPC (ви можете використовувати свою VPC, якщо вона у вас є).
  • Виберіть усі підмережі інстансів та активну публічну IP-адресу.
  • Щодо бази даних, можете ігнорувати її, оскільки ми вже налаштували її раніше.

pic

Налаштування трафіку інстансів та масштабування:

  • Групи безпеки EC2: Залиште порожнім, EB створить стандартні групи безпеки для середовища.
  • Група автоматичного масштабування: Виберіть тип середовища Load balanced; налаштуйте кількість інстансів Min — Max (якщо Min == Max, це вимикає тригер масштабування); виберіть типи інстансів відповідно до вимог вашого додатку (достатньо vCPU та пам'яті); налаштуйте тригер масштабування (метрика на середнє значення CPUUtilization, ≥ 70% спрацьовує для додавання ще 1 інстансу, ≤ 30% спрацьовує для видалення 1 інстансу).
  • Налаштування мережі балансувальника навантаження: Встановіть видимість на Public, виберіть усі доступні підмережі для балансувальника навантаження.
  • Тип балансувальника навантаження: Виберіть Application load balancer.
  • Процес перевірки здоров'я: За замовчуванням шлях /.

pic

Налаштування оновлень, моніторингу та журналювання:

  • Політика розгортання: Використовуйте політику Rolling для розгортання без часу простою. Детальніше про політики розгортання читайте в цьому документі.
  • Проксі-сервер: Виберіть none. У нас вже налаштований nginx у docker-compose.
  • Стрімінг журналів інстансів до CloudWatch logs: Активовано, виберіть метод зберігання та життя журналів.
  • Змінні середовища: Пропустіть для демонстраційного додатка, зміни можна внести пізніше.

pic

Перевірте конфігурації перед тим, як створити та надіслати.

Після завершення створення ви отримаєте панель керування середовищем, подібну до цієї.
Ви можете відвідати домен середовища, щоб перевірити, чи може демонстраційний додаток успішно працювати.

pic

Перегляд журналів: Ви можете перевірити весь процес розгортання, журнали роботи додатка в CloudWatch — Log groups, в основному потрібно зосередитися на:

  • /var/log/eb-engine.log — журнали активності aws eb.
  • /var/log/eb-docker/containers/eb-current-app/stdouterr.log — всі журнали Docker контейнерів.

pic

Потік журналів на локальній машині:

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 з джерелом до цієї групи безпеки.

pic

Розгортання вашого додатка в створене середовище EB

Редагуйте правила безпеки групи RDS бази даних Inbound: Виберіть Custom джерело, потім додайте EC2 Security Groups середовища EB до списку дозволених.

pic

Додайте необхідні змінні середовища для додатка в середовище EB:

  • Відкрийте конфігурацію середовища
  • Редагуйте Updates, monitoring, and logging
  • У розділі Environment properties задайте всі необхідні змінні середовища, потім натисніть Apply.

pic

Запустіть 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 версій.

pic

Ми вже завершили всі необхідні кроки для розгортання докеризованого додатка в середовищі 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

Leave a Reply

Your email address will not be published. Required fields are marked *