Развертывание приложений Node.js в AWS EC2 с помощью Docker

Введение После того, как вы написали веб-приложение, существуют десятки предложений, позволяющих разместить ваше приложение в сети и использовать его другими людьми. Одно хорошо известное предложение является частью платформы Amazon Web Services (AWS) - Elastic Compute Cloud [https://aws.amazon.com/ec2/] (EC2). EC2 является основной частью AWS, и многие другие сервисы AWS построены на его основе, поэтому полезно понять, что такое EC2 и как на нем развернуть. В этом руководстве мы собираемся создать базовое приложение Node.js

Вступление

После того, как вы написали веб-приложение, появятся десятки предложений по размещению вашего приложения в сети и его использованию другими людьми. Одно хорошо известное предложение является частью платформы Amazon Web Services (AWS) - Elastic Compute Cloud (EC2).

EC2 является основной частью AWS, и многие другие сервисы AWS построены на его основе, поэтому полезно понять, что такое EC2 и как на нем развернуть.

В этом руководстве мы собираемся создать базовое приложение Node.js с помощью Docker, запустить и настроить экземпляр EC2 и развернуть на нем наше приложение. В конце этого руководства у вас будет приложение Node, работающее на AWS, и вы лучше поймете, как взаимодействовать с основным сервисом AWS.

Предпосылки

Аккаунт AWS

Amazon Web Services (AWS) - это набор инструментов для создания приложений в облаке. Поскольку EC2 - это сервис AWS, нам необходимо создать учетную запись AWS.

У AWS есть уровень бесплатного пользования для множества замечательных вещей, и EC2 не исключение - вы можете бесплатно использовать 750 часов (31 день) EC2 в месяц на уровне бесплатного пользования в течение всего года.

Докер

Docker позволяет нам объединять наши приложения в небольшие, легко развертываемые модули, которые можно запускать в любом месте, где установлен Docker. Это не значит, что «но это работает на моей машине!»

В этой статье предполагается базовое знакомство с Docker, и мы не будем углубляться в него - однако, если вы хотите сделать более глубокое погружение, ознакомьтесь с Развертыванием приложения Node.js в капли DigitalOcean с помощью Docker .

Приложение узла

Давайте сделаем действительно простое приложение Node, которое отвечает на запрос. Для этого мы откроем терминал и запустим:

 $ mkdir node-ec2 
 $ cd node-ec2 
 $ npm init 

Это создаст новую папку, переместится в эту папку, а затем инициализирует новое приложение Node.

Давайте пока придерживаемся настроек NPM по умолчанию - в этой статье предполагается, что вы оставили точку входа как index.js . Это сгенерирует наш package.json , который по сути является файлом конфигурации для нашего приложения.

После создания package.json откройте его и добавьте следующую строку в начало раздела scripts

 "start": "node index.js", 

Таким образом, вместо запуска node index.js мы будем использовать npm start , который будет запускать все в нашем скрипте. В этом конкретном случае он просто запускает node index.js , хотя на самом деле это может быть гораздо больше. Например, если мы можем добавить флаги к команде, не вводя ее каждый раз, или мы можем установить некоторые переменные среды, такие как NODE_ENV=production node index.js .

Для обслуживания наших запросов мы будем использовать фреймворк Express - он минималистичный, и с ним легко начать:

 $ npm install express --save 

Теперь наш package.json должен выглядеть примерно так:

 { 
 "name": "app", 
 "version": "1.0.0", 
 "description": "", 
 "main": "index.js", 
 "scripts": { 
 "start": "node index.js" 
 }, 
 "author": "", 
 "license": "ISC", 
 "dependencies": { 
 "express": "^4.17.1" 
 } 
 } 

Дождитесь установки, а затем мы откроем предпочитаемый редактор кода, чтобы создать еще один новый файл в том же месте с именем index.js .

Файл настроит Express и определит обработчик запросов:

 const express = require('express'); 
 const app = express(); 
 const port = 3000; 
 
 app.get('/status', (req, res) => res.send({status: "I'm alive!"})); 
 
 app.listen(port, () => console.log(`Example app listening on port ${port}!`)); 

Это приложение запускается на порту 3000 и будет обслуживать конечную точку в /status . Мы можем проверить, что это работает, запустив:

 $ npm start 
 Example app listening on port 3000! 

Направляясь на http://localhost:3000/status - мы должны получить ответ с {status: "I'm alive!"} . Как только это будет успешным, обязательно остановите сервер с помощью [CTRL]{.kbd} + [C.]{.kbd}

Когда наше простое приложение Node готово, давайте превратим его в образ Docker, который мы развернем в EC2.

Докеризация Node-приложения

Dockerfile в том же каталоге, что и ваше приложение Node:

 FROM node:13-alpine 
 
 WORKDIR /usr/src/app 
 
 COPY package*.json ./ 
 
 RUN npm install 
 
 COPY . . 
 
 EXPOSE 3000 
 CMD [ "node", "index.js" ] 

Это базовый файл Dockerfile, который можно использовать для большинства простых приложений Node. Затем давайте создадим образ Docker, а затем запустим его, чтобы убедиться, что он работает правильно:

 $ docker build . -t ec2-app 
 $ docker run -p 3000:3000 ec2-app 

Если вы снова перейдете по http://localhost:3000/status , вы должны увидеть тот же ответ статуса, что и ранее. Выйдите из процесса снова, [нажав CTRL]{.kbd} + [C.]{.kbd}

Наконец, давайте отправим наш образ Docker в Docker Hub :

 $ docker login # Use your Docker Hub credentials here 
 $ docker tag ec2-app <YOUR_DOCKER_USERNAME>/ec2-app 
 $ docker push <YOUR_DOCKER_USERNAME>/ec2-app 

Настройка EC2

После того, как наше приложение "докерировано", нам нужно настроить экземпляр EC2 для его работы.

Перейдите в AWS и войдите в систему.

Щелкните раскрывающееся меню «Службы» вверху страницы и выполните поиск по запросу «EC2» . AWS в настоящее время экспериментирует со своим интерфейсом, поэтому вы должны увидеть страницу, которая выглядит примерно так, как показано ниже, но центр страницы может выглядеть немного иначе.

Щелкните ссылку "Экземпляры" слева.

Страница приветствияEC2{.ezlazyload}

На следующем экране нажмите кнопку «Запустить экземпляр» . Вы увидите страницу, которая выглядит так:

Выбор EC2AMI{.ezlazyload}

AMI

Здесь мы выбираем образ машины Amazon - или для краткости AMI. AMI - это сервер «из коробки», который может иметь несколько конфигураций.

Например, мы могли бы выбрать один из AMI быстрого запуска, на котором есть Amazon Linux 2 , или, если вы прокрутите вниз, есть экземпляры с запущенным Ubuntu и т. Д.

Каждый AMI - это замороженный образ машины с операционной системой и, возможно, установленным дополнительным программным обеспечением.

Чтобы упростить задачу, мы можем использовать это для создания экземпляра EC2 с уже настроенным для нас Docker!

Для этого нам нужно выбрать «AWS Marketplace» слева, а затем в поле поиска ввести «ECS» . Мы должны получить несколько результатов, но нам нужен образ «ECS Optimized Amazon Linux 2».

Этот образ поставляется с Docker и оптимизирован для запуска контейнеров. Нажмите «Выбрать» на выбранном изображении, и мы перейдем к следующей странице:

ВыборAMI{.ezlazyload}

Типы экземпляров

В следующем представлении мы выбираем, какой тип экземпляра мы хотим. Как правило, это определяет ресурсы, доступные запускаемому нами серверу, с масштабированием затрат для более производительных машин.

t2.micro экземпляра t2.micro имеет право на бесплатный уровень, поэтому рекомендуется использовать его:

Выбор типа инстансаEC2{.ezlazyload}

Установите соответствующий флажок и нажмите "Просмотреть и запустить" в правом нижнем углу. Нажмите «Запустить» в том же месте на следующей странице, и вы увидите всплывающее окно для выбора или создания пары ключей.

Выберите первое раскрывающееся меню и выберите «Создать новую пару ключей» . В разделе «Имя пары ключей» введите то, что вы хотите назвать своей парой ключей.

Не забудьте «Загрузить пару ключей» справа - это то, что мы будем использовать для доступа к нашему экземпляру EC2.

Если снова выбрать «Запустить экземпляр» , ваш экземпляр EC2 должен запуститься:

Запускэкземпляра{.ezlazyload}

Щелкните выделенную ссылку, чтобы перейти на страницу сведений об экземпляре.

Группы безопасности

Прежде чем мы попытаемся запустить наше приложение, нам нужно убедиться, что мы сможем получить к нему доступ.

Большинство ресурсов AWS работают в рамках «групп безопасности» - эти группы определяют, как можно получить доступ к ресурсам, через какой порт и с каких IP-адресов.

Щелкните выделенную здесь группу безопасности:

Ссылка на группубезопасности{.ezlazyload}

Отсюда вы сможете увидеть подробную информацию о группе безопасности, в том числе правила для входящего и исходящего трафика, на различных вкладках. Надеемся, что на вкладке входящих вы увидите следующее:

Входящиеправила{.ezlazyload}

Это означает, что трафик, поступающий через порт 22 с использованием протокола TCP, разрешен откуда угодно ( 0.0.0.0/0 означает где угодно ). Нам нужно добавить еще одно правило, чтобы любой мог получить доступ к нашему приложению через порт 3000 .

Вверху страницы нажмите «Действия», а затем нажмите «Изменить правила для входящих подключений» . В открывшемся диалоговом окне нажмите «Добавить правило» .

Установите диапазон портов правила на 3000 и в разделе «Источник» щелкните раскрывающийся список и выберите «В любом месте» . Остальные должны быть заполнены автоматически.

В конечном итоге у вас должно получиться что-то вроде:

Редактирование входящихправил{.ezlazyload}

Подключение к вашему экземпляру EC2

Вернитесь на страницу «Экземпляры» (щелкните ссылку слева) и выберите созданный ранее экземпляр. Адрес вашего экземпляра EC2 находится над ссылкой на группы безопасности под полем «Общедоступный DNS».

Вернитесь к терминалу и перейдите в папку, в которой находится пара ключей, которую вы скачали ранее. Он будет назван так, как вы ввели для имени пары ключей, с расширением .pem

Давайте изменим разрешения ключа, а затем SSH в экземпляр EC2:

 $ chmod 400 <NAME_OF_KEYPAIR_FILE> 
 $ ssh -i <NAME_OF_KEYPAIR_FILE> [email protected] <PUBLIC_DNS> 

Отсюда нам просто нужно запустить наше приложение через Docker:

 $ docker run -p 3000:3000 <YOUR_DOCKER_USERNAME>/ec2-app 

Вы сможете подключиться к экземпляру, используя тот же адрес, который вы использовали для SSH в экземпляре. Просто перейдите в своем браузере к:

 <PUBLIC_DNS>:3000/status 

Ваше приложение должно вернуть вам конечную точку состояния, которую мы видели ранее. Поздравляем, вы только что запустили свое первое приложение на EC2!

Что дальше?

Запускайте ваше приложение без головы

Однако быстрый выигрыш - запустить приложение «без головы». На данный момент ваше приложение работает в сеансе оболочки - и как только вы закроете этот сеанс, приложение прекратит работу!

Чтобы запустить приложение таким образом, чтобы оно продолжало работать в фоновом режиме, запустите приложение с дополнительным флагом -d

 $ docker run -d -p 3000:3000 <YOUR_DOCKER_USERNAME>/ec2-app 

Безопасность

Возможно, вы захотите вернуться и повысить безопасность экземпляра / эксперимента с помощью различных конфигураций - например, настроить его так, чтобы только мы могли получить доступ к порту SSH, например.

Измените поле «Источник» в первом правиле на «Мой IP-адрес» - AWS автоматически определит, откуда вы получаете к нему доступ.

Примечание. Если вы просматриваете это руководство на ходу или вернетесь к нему позже, ваш компьютер может иметь другой IP-адрес, чем при первоначальной настройке «Мой IP-адрес» . Если в дальнейшем у вас возникнут какие-либо трудности, обязательно вернитесь сюда и снова выберите «Мой IP» !

Другие AMI

Существуют сотни различных AMI, многие из которых принадлежат различным сообществам, с уже предустановленными приложениями - стоит посмотреть, есть ли простой способ настроить то, с чем вы хотели бы работать!

Добавление домена

Теперь, когда у вас есть приложение, работающее на сервере, вы можете настроить доменное имя и указать его на свое приложение.

Заключение

EC2 действительно является основой многих сервисов AWS - например, RDS (сервис базы данных AWS) на самом деле является просто сильно оптимизированными инстансами EC2 с красивой панелью управления.

Понимание этого основного продукта в арсенале AWS обязательно откроет двери для новых способов реализации идей.

В этом руководстве мы создали простое приложение Node.js с помощью Express, добавили его в докер, настроили EC2 для развертывания и, наконец, развернули его в экземпляре EC2.

comments powered by Disqus