В этом модуле выполняется разбивка приложения node.js на несколько взаимосвязанных сервисов и отправка образа каждого из них в репозиторий Amazon Elastic Container Registry (Amazon ECR). Начать разработку

В итоговой архитектуре приложения используются Amazon Elastic Container Service (Amazon ECS) и Application Load Balancer (ALB). 

обзор архитектуры

a. Клиент
Клиент выполняет запрос на трафик через порт 80.

b. Балансировщик нагрузки
Балансировщик ALB определяет маршрут внешнего трафика на необходимый сервис. Балансировщик ALB проверяет запрос клиента и использует правила маршрутизации для направления запроса к инстансу и порту для целевой группы, соответствующей правилу.

c. Целевые группы
В каждом сервисе есть целевая группа, которая отслеживает инстансы и порты каждого контейнера, запущенного для этого сервиса.

d. Микросервисы
Amazon ECS развертывает каждый сервис в контейнере в кластере EC2. Каждый контейнер обрабатывает только одну функцию.

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

Изоляция для безопасности
Если одна функция монолитного приложения имеет уязвимость в системе безопасности, например возможность удаленного выполнения кода, следует предположить, что злоумышленник мог получить доступ к любой из функций системы. Это может быть опасным. К примеру, если функция загрузки аватара имеет проблему с безопасностью, в итоге под угрозой оказывается база данных с паролями пользователей. Разделение функций на микросервисы с помощью сервиса Amazon ECS позволяет защитить доступ к ресурсам AWS путем предоставления каждому сервису собственной роли AWS Identity and Access Management (IAM). Использование микросервисов – это оптимальный способ защиты. Если злоумышленник взломает один сервис, у него будет доступ только к его ресурсам. Он не сможет получить параллельный доступ к ресурсам из других сервисов, не взломав также их.

Независимое масштабирование
При разделении функций на микросервисы можно по отдельности увеличивать и уменьшать объем инфраструктуры и количество инстансов, используемых каждым классом микросервисов. Это облегчает измерение стоимости конкретной функции и определение функций, которые необходимо оптимизировать в первую очередь. Если для одной конкретной функции необходимы дополнительные ресурсы, это не оказывает влияния на другие функции, и производительность не снижается.

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

Время выполнения: 20 минут

Используемые сервисы:


Чтобы разделить монолитное приложение, следуйте пошаговой инструкции, приведенной ниже. Нажимайте на номер каждого шага, чтобы развернуть раздел.

break-the-monolith
  • Шаг 1. Формирование репозиториев ECR

    В предыдущих двух модулях вы выполнили развертывание монолитного приложения, используя один сервис и один репозиторий образов контейнера. Чтобы развернуть приложение в виде трех микросервисов, необходимо сформировать три репозитория (по одному для каждого сервиса) в реестре Amazon ECR.

    Три сервиса – это:

    1. users (пользователи)
    2. threads (потоки)
    3. posts (публикации)

    Создайте три репозитория. Для каждого сервиса выполняйте шаги, указанные ниже.

    • Перейдите к консоли Amazon ECR.
    • Выберите Создать репозиторий.
    • На странице Создать репозиторий в поле Имя репозитория создайте репозиторий для сервиса (posts, threads или users).
      ⚐ Примечание. Для параметров Неизменяемый тег оставьте значения по умолчанию.

    В реестре Amazon ECR необходимо создать четыре репозитория. Запишите информацию о репозитории для каждого созданного микросервиса. Эта информация понадобится в следующем шаге. Необходимая информация должна иметь следующий формат:
    [идентификатор аккаунта].dkr.ecr.[регион].amazonaws.com/[имя сервиса]

    репозитории
  • Шаг 2. Вход в сервис Docker с помощью платформы AWS (необязательно)

    Доступ к сервису Docker понадобится для создания и отправки образов для каждого сервиса. Если вы работаете с этим учебным пособием время от времени, возможно, вы вышли из сервиса Docker. В этом случае выполните следующие шаги, чтобы снова войти в сервис Docker.

    • Выполните команду $(aws ecr get-login --no-include-email --region [ваш регион])
      Замените заполнитель [ваш регион], например: $(aws ecr get-login --no-include-email --region us-west-2).

    Если аутентификация прошла успешно, вы получите сообщение с подтверждением: Вход в систему успешно выполнен.

  • Шаг 3. Создание и отправка образов для каждого сервиса

    В папке проекта amazon-ecs-nodejs-microservices/3-microservices/services содержатся папки с файлами для каждого сервиса. Обратите внимание, что каждый микросервис – это клон первоначального монолитного сервиса.

    Предназначение сервиса можно узнать, сравнив файл db.json в каждом из них и в монолитном сервисе api. Ранее публикации, потоки и пользователи хранились в одном файле базы данных. Теперь они хранятся в отдельных файлах для соответствующего сервиса.

    Откройте терминал и задайте путь ~/amazon-ecs-nodejs-microservices/3-microservices/services

    Создайте образы и присвойте им теги

    • В терминале выполните команду docker build -t [имя сервиса] ./[имя сервиса]
      Замените заполнитель [имя сервиса], например: docker build -t posts ./posts

    • После завершения создания присвойте образу тег, чтобы передать его в репозиторий:
      docker tag [имя сервиса]:latest [идентификатор аккаунта].dkr.ecr.[регион].amazonaws.com/[имя сервиса]:v1
      Замените заполнители [имя сервиса], [идентификатор аккаунта] и [регион], например: docker tag posts:latest [идентификатор аккаунта].dkr.ecr.us-west-2.amazonaws.com/posts:v1

    • Отправьте образ в реестр ECR: docker push [идентификатор аккаунта].dkr.ecr.[регион].amazonaws.com/[имя сервиса]:v1
      Замените заполнители [имя сервиса], [идентификатор аккаунта] и [регион].

    Перейдя в репозиторий реестра ECR, можно увидеть, что образам присвоены теги v1. 

    ♻ Выполните эти шаги для каждого образа микросервиса.  

    ⚐ ПРИМЕЧАНИЕ. Обязательно создайте все три образа и присвойте им теги.