У цьому посібнику ми використаємо Docker для розгортання Node.js (Express і Typescript) додатку на AWS Elastic Beanstalk (EBS) за допомогою AWS Elastic Compute Cloud (EC2) і надамо доступ через HTTPS. Я спробую бути максимально лаконічним, тому не буду пояснювати Docker і його переваги або інші специфічні деталі. Вважаю, що ви вже знаєте, що таке Docker і маєте його встановленим. Крім того, припускаю, що ви маєте уявлення про налаштування NginX. З іншого боку, я сподіваюся, що це дозволить вам розгорнути ваш Node.js додаток на EBS, використовуючи NginX та SSL.
Щоб дати контекст, ось дерево директорій, і все знаходиться на GitHub. Я позначу контейнер Docker як efraimrodrigues/app-ebs-docker, що відповідає моєму віддаленому репозиторію на hub.docker.com, тому налаштуйте ваш відповідно.
.
├── app
│ ├── Dockerfile
│ ├── package.json
│ ├── package-lock.json
│ ├── server.ts
│ └── tsconfig.json
├── Dockerrun.aws.json
└── nginx
└── user_conf.d
└── personal.conf
Node.js додаток
Додаток, який ми будемо розгортати, це простий сервер Express.
Одне з перших завдань — побудувати образ нашого додатку та завантажити його до Docker репозиторію. Для цього я буду використовувати hub.docker.com у цьому посібнику. Нижче наведено Dockerfile, який описує, як будується образ додатку. Він просто встановлює залежності, компілює код Typescript і, нарешті, вказує, як запускати образ у рядку 23.
Цей образ використовує alpine, оскільки він дуже легкий.
Побудова, тестування та завантаження образу додатку
Якщо ви хочете протестувати це локально, вам потрібно включити файли package.json і tsconfig.json. Потім ви можете побудувати і запустити образ за допомогою наступних команд. Зверніть увагу на параметр -t в першій команді, який відповідає моєму раніше створеному віддаленому репозиторію, і це дозволить нам його завантажити.
sudo docker build ./app -t efraimrodrigues/app-ebs-docker
sudo docker run -p 3001:3001 efraimrodrigues/app-ebs-docker
Після виконання другої команди додаток має бути доступний за адресою 127.0.0.1:3001. Щоб зупинити його, просто знайдіть id контейнера за допомогою sudo docker ps і зупиніть його командою sudo docker stop. Потім просто завантажте його на hub.docker.com за допомогою наступної команди. Docker може попросити вас увійти.
sudo docker push efraimrodrigues/app-ebs-docker
NginX налаштування та розгортання
На цьому етапі у нас вже є образ додатку в віддаленому репозиторії, і тепер ми можемо перейти до налаштувань NginX. Для цього ми будемо використовувати образ від jonasal/nginx-certbot, який автоматизує процес отримання SSL сертифікатів від Let’s Encrypt за допомогою Certbot. Будь ласка, зверніться до цього посилання для детальніших відомостей про налаштування цього образу. Я раніше керував своїми SSL сертифікатами через Certbot на AWS CodePipeline, але це стало нестабільним, тому я вирішив перейти на цей образ, і він працює добре.
AWS EBS використовує Elastic Container Service (ECS) для розгортання середовища, і ECS налаштовує Docker за допомогою файлу Dockerrun.aws.json, замість docker-compose.yml.
Приватні репозиторії та автентифікація
Рядки з 3 по 6 використовуються EC2 для автентифікації на вашому віддаленому репозиторії. Це необхідно лише в тому випадку, якщо ви використовуєте приватні репозиторії. Вони вказують на файл S3 AWS, який містить інформацію про розташування репозиторію та облікові дані. Цей файл можна отримати на вашій локальній машині після входу в віддалений репозиторій. Він має виглядати ось так.
Здається, що це не сумісно з версією Docker за замовчуванням, яка використовується EC2. Мені довелося оновити його, щоб EC2 міг автентифікуватися та завантажити мій приватний образ.
Після того, як ви завантажите це в S3 бакет, важливо надати EC2 (aws-elasticbeanstalk-ec2-role) доступ для читання файлів з S3.
Ви можете зробити це, зайшовши в Identity and Access Management (IAM) > Roles > aws-elasticbeanstalk-ec2-role > Attach policies > AmazonS3ReadOnlyAccess. Моя сторінка політик aws-elasticbeanstalk-ec2-role виглядає ось так.
Копіювання конфігураційних файлів NginX в контейнер
Рядки з 7 по 14 визначають том на EC2 машині, який позначено як nginx-proxy-conf. Рядки з 34 по 40 інструктують його скопіювати том з міткою nginx-proxy-conf в контейнерну папку /etc/nginx/user_conf.d. Важливо не змінювати папку призначення, оскільки саме в цьому місці образ jonasal/nginx-certbot буде шукати конфігураційні файли.
Опис контейнерів
Блок опису контейнерів досить простий та зрозумілий. Однак важливо зазначити, що поля для образів вказують на віддалені репозиторії, тому це не працюватиме, якщо образи, які ви визначаєте, не доступні або недоступні. Крім того, зверніть увагу на визначення посилань (рядок 21), яке використовується для опису контейнерів, від яких може залежати NginX. Нарешті, ім’я хоста, визначене для додатку Node (рядок 45), буде доступне в нашому конфігураційному файлі NginX, і важливо, щоб воно збігалося з сервером, який ми будемо оголошувати наступним.
Конфігураційний файл NginX
Конфігураційний файл повинен проксувати запити до додатку Node.js. Це відбувається під контейнером NginX, який може взаємодіяти з контейнером додатку Node.js.
Це має бути зрозуміло, якщо ви знайомі з налаштуваннями NginX. Зверніть увагу, що всі запити перенаправляються до бекенд-усупстріму, який є групою серверів і може використовуватися як балансувальник навантаження. Будь ласка, зверніться до цього посилання, якщо ви хочете це зробити.
Зверніть увагу, що рядок 2 визначає сервер для нашого додатку Node.js з міткою app в файлі Dockerrun.aws.json.
Важливо оновити рядок 9 відповідно до вашого домену.
Створення середовища EBS
Увійшовши до свого облікового запису AWS, перейдіть до сервісу EBS і почніть створення Web server environment. Початкова сторінка має виглядати ось так.
Завантажте вихідний код проєкту в це останнє вікно. Але не створюйте середовище ще. Нам потрібно визначити деякі змінні середовища, які будуть використовуватися контейнером NginX для отримання SSL сертифікатів. Тому натискайте на кнопку Configure more options.
Тепер натискайте кнопку Edit у вікні Software і визначте змінну CERTBOT_MAIL з вашою електронною поштою. Це необов’язково, але рекомендується визначити STAGING як 1 для тестування, оскільки Let's Encrypt обмежує кількість сертифікатів, які ви можете отримати в продукційному середовищі. Ваша конфігурація має виглядати ось так.
Цього повинно бути достатньо, щоб налаштувати середовище та запустити його. Тому можете зберегти і створити середовище. Але я рекомендую вам визначити пару ключів у розділі безпеки, щоб ви могли підключатися до середовища через SSH і переглядати свої Docker контейнери в браузері.
Останнє, що потрібно зробити — дозволити HTTPS запити до вашого EC2 екземпляра. Перейдіть в EC2 > Network & Security > Security Groups і знайдіть групу безпеки, підключену до вашого середовища EBS.
Тепер оновіть вхідні правила, щоб дозволити трафік через порт HTTPS (443).
Готово, ми налаштували все правильно.
Зверніть увагу, що ваш браузер може вивести попередження про проблему безпеки, оскільки ми не використовуємо продукційне середовище Let’s Encrypt. Ви можете оновити змінну середовища STAGING до 0, якщо хочете використовувати продукційне середовище.
Сподіваюся, це допоможе вам розгорнути ваш додаток у безпечнішому середовищі. Будь ласка, дайте знати, якщо у вас є питання.
Перекладено з: Using Docker to containerize your Node.js application and serve it over HTTPS in the AWS Elastic Beanstalk