Розгортання API на TypeScript та NodeJS на AWS Elastic Beanstalk за допомогою Docker

Отже, у вас є API на TypeScript-NodeJS, розроблене на локальній машині, і ви думаєте: "Як мені розгорнути це у реальному світі?". Ви можете знайти різні посібники та відео, що показують, як використовувати різні сервіси, такі як AWS, GCE і навіть Heroku.

Хоча ви можете орендувати сервер, наприклад, EC2 інстанс і розгорнути додаток з допомогою NGINX, я вважаю, що це потребує багато попередньої налаштування, на яку у вас може не бути часу. Сьогодні ми хочемо доставляти додатки якнайшвидше, тому я покажу вам, як швидко розгорнути ваш додаток (і майбутні) з мінімальною конфігурацією за допомогою сервісу AWS, який називається Elastic Beanstalk (AWS EBS) і контейнерів Docker.

Трохи про EBS та Docker

EBS (Elastic Beanstalk) займається налаштуванням, конфігурацією та наданням інших сервісів AWS, таких як EC2 та балансування навантаження, для створення веб-сервісу для вас. Завдяки правильній конфігурації ви можете отримати свій додаток в робочому стані менше ніж за годину. Автоматизація Elastic Beanstalk допоможе уникнути помилок, які можуть виникнути, коли ви намагаєтеся налаштувати все самостійно.

Для тих, хто новачок у Docker, є кілька переваг від його використання, хоча я не буду занурюватися глибоко в це: ви можете мати передбачуване та ізольоване середовище, час на розгортання значно зменшиться, ви можете запускати своє середовище будь-де, де підтримуються контейнери, ваша конфігурація та інфраструктура можуть бути безперешкодно репліковані на інші додатки, які ви хочете розгорнути.

Перед тим, як почати

Я припускаю, що у вас вже є API на TypeScript, розроблене на вашій локальній машині, з вхідним файлом, який виглядає десь так. Я використовую фреймворк Express:

Ми також будемо використовувати Docker і docker-compose (для управління нашими різними середовищами). Перейдіть на сторінку Docker (https://www.docker.com/get-started), вам потрібно буде завантажити десктопний клієнт і зареєструватися. Для Windows і MacOS десктопний клієнт включає docker-compose, для Linux ви можете слідувати цьому посібнику для його установки: https://docs.docker.com/compose/install/.

Після того, як ви встановите docker і docker-compose, ви повинні мати змогу перевірити це в командному рядку:

> docker version  
Client:  
 Cloud integration: 1.0.17  
 Version: 20.10.8  
 API version: 1.41  
 Go version: go1.16.6  
 Git commit: 3967b7d  
 Built: Fri Jul 30 19:55:20 2021  
 OS/Arch: darwin/amd64  
 Context: default> docker-compose version  
docker-compose version 1.29.2, build 5becea4c

Нарешті, я припускаю, що у вас є доступ до облікового запису AWS Console. Якщо ні, створіть його, це безкоштовно, і ви отримаєте пільги Free tier на рік.

Поїхали!

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

  1. Створимо два файли: Dockerfile та Dockerfile.dev. Як ви могли здогадатися, один буде використовуватися для продакшн-середовища, а інший для нашого розробницького або локального середовища.

Розробницький Dockerfile просто копіює файли в кореневу директорію образу і запускає yarn start для запуску нашого серверу для розробки.

Для продакшн-Dockerfile, ми, по суті, запускаємо два етапи:

Спочатку ми копіюємо файли, що використовуються для збірки проекту, і власне будуємо його. Потім встановлюємо тільки продакшн-залежності і копіюємо вміст каталогу dist в кореневу папку. Нарешті, ми встановлюємо PM2, відкриваємо порт 8000 (це може бути будь-який порт, який вам подобається) і запускаємо сервер за допомогою PM2.

  1. Як тільки ми маємо ці файли, створимо ще три файли для docker-compose: docker-compose.override.yml, docker-compose.prod.yml і docker-compose.yml. Ці файли, по суті, скажуть Docker-compose, як збирати ваші образи.
    Зараз ми створимо тільки один образ додатка, але ви можете використовувати docker-compose, щоб додавати інші образи, наприклад, образ бази даних до потоку docker.
# docker-compose.yml  
version: "3.7"  
services:  
 app:  
 container_name: app
# docker-compose.prod.yml  
version: "3.7"  
services:  
 app:  
 container_name: app  
 restart: always  
 build: .  
 env_file: .env  
 environment:  
 - PORT=${PORT}  
 ports:  
 - 80:8000
# docker-compose.override.yml  
version: "3.7"  
services:  
 app:  
 container_name: app  
 restart: always  
 build:  
 context: .  
 dockerfile: Dockerfile.dev  
 env_file: .env  
 environment:  
 - PORT=${PORT}  
 ports:  
 - 8000:8000

Отже, по суті, що ми робимо — це говоримо docker-compose використовувати файл переваг для dev середовища і prod файл для продакшн середовища (ви можете мати кілька таких файлів для інших середовищ або задач).

Нарешті, створимо файл .dockerignore, щоб docker не враховував ці файли.

# .dockerignore  
# Проект ігнорує  
.vscode# Каталоги залежностей  
node_modules/# Node Version Manager  
.nvmrc# Yarn  
yarn.lock# NPM  
package-lock.json
  1. Окей, час протестувати це на нашій локальній машині! З цими конфігураціями ми повинні бути в змозі запустити наш проект локально за допомогою docker.

У вашому терміналі запустіть: docker-compose build. Це може зайняти деякий час, якщо ви пам'ятаєте, docker встановить всі наші залежності для створення нового образу.

Якщо збірка була успішною, запустіть docker-compose up, і в браузері перейдіть за адресою localhost. Ви повинні побачити щось подібне:

pic

Круто, правда? Docker відкриває порт 8000 додатка через порт 80, тому вам не потрібно вказувати порт на localhost, оскільки порт 80 є стандартним. Ви можете змінити цю поведінку у файлі docker-compose.override.yml.

Час для AWS EBS

Добре! Тепер, коли ми маємо наш docker-образ, що працює на локальній машині, ми готові запустити його з AWS Elastic Beanstalk.

  1. Спочатку потрібно стиснути файли для завантаження в EBS, для цього запустіть команду zip -r compressed.zip . -x '*node_modules*' -x '*dist*' -x '*.env*'. Це створить файл з назвою compressed.zip, що містить весь ваш код, крім файлів node_modules/, dist/ та .env.
  2. Перейдіть до консоль AWS і відкрийте сервіс AWS EBS.
  3. Натисніть "Створити додаток".
  4. Заповніть поля, для платформи виберіть Docker та виберіть опцію Завантажте свій код. Вам буде запропоновано завантажити файл, виберіть стиснутий файл.
  5. Нарешті, натисніть Створити додаток, і чекайте! Процес повинен зайняти 5-7 хвилин, після чого ви повинні побачити щось подібне:

pic

Чудово! Ваш додаток тепер працює. Ви можете натискати на це довге посилання (повинно бути щось на зразок test.eba-bf4mq4sq.us-east-1.elasticbeanstalk.com**), щоб перевірити ваш додаток.

Що далі?

  1. Ви можете використати AWS Route53 для налаштування вашого власного домену для вашого додатка.
  2. Ви можете налаштувати pipeline CI/CD за допомогою AWS CodePipeline, щоб процес збірки та стиснення автоматично запускався, коли ви вносите зміни в репозиторій.

Перекладено з: Deploying a TypeScript NodeJS API to AWS Elastic Beanstalk with Docker

Leave a Reply

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