Рубрики
Без рубрики

Как развернуть приложение Spring Boot в кластере AWS ECS

В этом посте вы узнаете, как настроить AWS ECS (Сервис эластичных контейнеров) Скопление. Вы будете… С тегами java, aws, учебник.

В этом посте вы узнаете, как настроить AWS ECS (Сервис эластичных контейнеров) Скопление. Вы создадите кластер и развернете образ Docker, содержащий приложение Spring Boot. Наслаждайтесь!

1. Вступление

Amazon Elastic Container Service – это управляемая служба управления контейнерами, которая позволяет развертывать и масштабировать контейнерные приложения. Обзор функций и цен можно найти на веб-сайте AWS .

ECS состоит из нескольких компонентов:

  • Хранилище эластичных контейнеров (ECR) : Хранилище Docker для хранения ваших изображений Docker (аналогично Docker Hub, но теперь предоставляется AWS).
  • Определение задачи : Версионный шаблон задачи, которую вы хотели бы запустить. Здесь вы укажете используемый образ Docker, память, процессор и т.д. для вашего контейнера.
  • Кластер ECS : Само определение кластера, в котором вы укажете, сколько экземпляров вы хотели бы иметь и как оно должно масштабироваться.
  • Служба : На основе определения задачи вы развернете контейнер с помощью Службы в своем кластере. Это в основном все, что вам нужно знать, чтобы начать работу с этим практическим руководством. Источники, используемые в этом посте, доступны на GitHub .

Вы создадите образ Docker для базового приложения Spring Boot, загрузите его в ECR, создайте определение задачи для образа, создайте кластер и разверните контейнер с помощью Службы в Кластере. В конце вы также сделаете что-то подобное, но включая балансировщик нагрузки приложений.

На момент написания статьи разрабатывается новый пользовательский интерфейс. Для большинства действий, описанных в этом посте, был включен переключатель Новый опыт ECS .

2. Создайте приложение

Приложение Spring Boot – это базовое приложение с конечной точкой Hello Rest, которая возвращает приветственное сообщение, включая хост, на котором запущено приложение. Приложение использовалось ранее в предыдущем посте . Контроллер является следующим:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        String message = "Hello AWS!";
        try {
            InetAddress ip = InetAddress.getLocalHost();
            message += " From host: " + ip;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return message;
    }

}

Чтобы иметь возможность создать образ Docker, вам необходимо добавить dockerfile-maven-плагин в файл pom .


    11
   mydeveloperplanet

...

    
        ...
        
            com.spotify
            dockerfile-maven-plugin
            1.4.12
            
                
                    default
                    
                        build
                        push
                    
                
            

            
                ${docker.image.prefix}/myawsplanet
                ${project.version}
                
                    target/${project.build.finalName}.jar
                
            
        
    


Вам также необходимо добавить файл Dockerfile в корневой каталог репозитория. Файл Dockerfile следует некоторым рекомендациям из предыдущего сообщения .

FROM openjdk:11-jdk
VOLUME /tmp

RUN useradd -d /home/appuser -m -s /bin/bash appuser
USER appuser

HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost:8080/actuator/health/ || exit 1

ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Запустите сборку, чтобы создать файл jar и соответствующий образ Docker.

$ mvn clean verify

Проверьте, доступен ли образ Docker в вашем локальном репозитории Docker.

$ docker images
REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
mydeveloperplanet/myawsplanet                       0.0.1-SNAPSHOT      765984f7cfc2        24 seconds ago      666MB

3. Загрузить изображение в OCR

Теперь, когда вы создали образ Docker, вам необходимо загрузить его в ECR, репозиторий AWS Docker. Перейдите в AWS к сервису ECS и выберите в левом меню раздел Репозитории . Первое, что нужно сделать, это создать репозиторий, нажав кнопку Создать репозиторий .

Дайте репозиторию узнаваемое имя, например моя планета разработчиков/myawsplanet и нажмите кнопку Создать репозиторий .

Чтобы увидеть, как вы можете отправить изображение Docker в хранилище, нажмите команды Просмотр push кнопка, доступная в обзоре репозитория.

Выполните шаг 1, который предоставит вам временные учетные данные, чтобы иметь возможность получить доступ к хранилищу. <идентификатор учетной записи> будет заменен вашим идентификатором учетной записи AWS.

$ aws ecr get-login-password --region eu-west-3 | docker login --username AWS --password-stdin .dkr.ecr.eu-west-3.amazonaws.com

Пропустите шаг 2, создание образа Docker уже выполнено с помощью сборки Maven. На шаге 3 измените команду, чтобы использовать версию 0.0.1-СНИМОК вместо последней для идентификации локального образа Docker.

$ docker tag mydeveloperplanet/myawsplanet:0.0.1-SNAPSHOT .dkr.ecr.eu-west-3.amazonaws.com/mydeveloperplanet/myawsplanet:latest

На шаге 4 вы отправляете локальный образ Docker в удаленное хранилище AWS Docker.

$ docker push .dkr.ecr.eu-west-3.amazonaws.com/mydeveloperplanet/myawsplanet:latest

После успешной загрузки изображение Docker добавляется в репозиторий.

4. Создание Определения Задачи

Теперь, когда изображение Docker доступно в ECR, следующее, что нужно сделать, это создать Определение задачи, создав кнопку Создать новое определение задачи в разделе Определения задач (меню слева).

На шаге 1 выберите для самостоятельной задачи EC2 и нажмите кнопку Следующий шаг .

На шаге 2 дайте определению задачи имя myawsplanet .

Выберите Роль выполнения задачи в разделе Выполнение задачи Я роль . Эта роль необходима для извлечения образа Docker. Если роль еще не существует, выберите Создать новую роль в раскрывающемся списке. Память задач и Процессор задач поля необязательны, оставьте их пока пустыми. На скриншоте ниже контейнер уже добавлен. Смотрите ниже скриншот, как это сделать.

Нажмите кнопку Добавить контейнер . Дайте контейнеру имя myawsplanet . Заполните изображение, которое нужно вытащить. Это должен быть URL-адрес изображения изображения Docker из репозитория ECR, за которым следует тег. Установите Ограничения памяти на 300 и добавьте запись Сопоставления портов для порта хоста 8080 в порт контейнера 8080 (приложение Spring Boot запускается на порту 8080 внутри контейнера). Наконец, нажмите кнопку Добавить , чтобы добавить контейнер в Определение задачи.

Единственное, что осталось сделать, это завершить шаг 2, нажав кнопку Создать в нижней части страницы.

5. Создать Кластер

Перейдите в меню слева в раздел Кластеры и нажмите кнопку Создать кластер .

На шаге 1 выберите EC2 Linux + Сеть и нажмите кнопку Следующий шаг .

На шаге 2 дайте Кластеру имя myawplanet и выберите t2.micro как тип экземпляра EC2 . Это позволит вам остаться на Свободном уровне. Оставьте другие параметры по умолчанию. Это запустит 1 экземпляр EC2 в ваш кластер.

В разделе Сеть выберите VPC по умолчанию и выберите все доступные подсети. Выберите Создайте новую группу безопасности как Группа безопасности . Вы также можете выбрать пару ключей если вы хотите иметь возможность подключаться по SSH к экземплярам EC2. На скриншоте ниже доступ по SSH не включен.

Новая группа безопасности должна разрешить весь трафик для порта 8080, иначе конечная точка Rest будет недоступна. Это настраивается в разделе Правила входящих сообщений группы безопасности . Затем выберите ранее созданную Роль IAM экземпляра контейнера или выберите Создать новую роль , когда вы собираетесь использовать это в первый раз. Нажмите кнопку Создать .

Через несколько минут кластер ECS будет запущен. Перейдите к службе EC2 и обратите внимание, что создана группа автоматического масштабирования и запущен один экземпляр EC2.

Экземпляр EC2:

6. Создать Службу

Вы создали кластер и Определение задачи. Теперь пришло время развернуть Определение задачи, содержащее конфигурацию контейнера Docker, в кластере. Перейдите к кластеру и щелкните Кнопка Развернуть .

Разверните раздел Конфигурация компьютера (дополнительно) и выберите EC2 как Тип запуска .

В разделе Конфигурация развертывания выберите Определение задачи myawsplanet как Семейство и выберите последнюю версию. Как вы можете видеть, определения задач управляются версиями. Дайте Службе имя myawsplanetservice и создайте Службу.

Перейдите в службу EC2 и скопируйте общедоступный URL-адрес экземпляра EC2. Используйте этот URL-адрес, чтобы проверить, доступна ли конечная точка.

$ curl http://ec2-13-36-172-189.eu-west-3.compute.amazonaws.com:8080/hello
Hello AWS! From host: a035a951c3c8/172.17.0.2

7. Создайте Сервис Со ВСЕМИ

С предыдущей конфигурацией можно запускать больше задач с большим количеством экземпляров EC2. Однако невозможно перенаправить трафик для порта 8080 в разные контейнеры, работающие на 1 экземпляре EC2. Другими словами, вы ограничены выполнением 1 задачи в каждом экземпляре EC2. Решением для этого является создание Службы с балансировщиком нагрузки приложений (ALB). Однако изменить существующий сервис для использования ALB невозможно. Поэтому вам необходимо создать новую услугу. Само определение задачи может быть использовано повторно.

Во-первых, вы удалите существующую службу. Перейдите к Сервису и нажмите кнопку Изменить . Установите для Желаемых задач значение 0. Это необходимо до того, как вы сможете удалить Сервис (не обращайте внимания на номер редакции на скриншоте ниже, я просто повозился при создании этого блога). Нажмите на Обновите кнопку и удалите службу.

Перейдите к Определению задачи и нажмите кнопку Создать новую редакцию . Перейдите к определению контейнера и установите порт хоста равным 0. Таким образом, ЛАБОРАТОРИЯ выберет случайный порт для связи между ALB и каждым контейнером Docker. Нажмите кнопку Обновить , чтобы обновить определение контейнера, и нажмите кнопку Создать , чтобы создать новую редакцию определения задачи.

Создайте новую службу, как и раньше, но в разделе Балансировка нагрузки выберите для Балансировщик нагрузки приложений . Дайте АЛЬБУ имя MyAwsAlb и определите порт 8080, который должен прослушивать ALB. Дайте Целевой группе имя ecs 2 контейнера и выберите HTTP как протокол. Наконец, нажмите кнопку Кнопка Развернуть внизу страницы.

Через несколько минут Сервис будет создан. Проверьте, доступна ли конечная точка Rest, используя общедоступный IP-адрес ALB.

$ curl http://MyAwsAlb-4611708.eu-west-3.elb.amazonaws.com:8080/hello
curl: (28) Failed to connect to MyAwsAlb-4611708.eu-west-3.elb.amazonaws.com port 8080: Connection timed out

Происходит тайм-аут, означающий, что с Группами безопасности что-то не так.

Перейдите в службу EC2 в раздел Группы безопасности . Создайте новую группу безопасности для ALB, в которой разрешен входящий трафик для порта 8080.

Прикрепите эту группу безопасности к ALB с помощью вкладки Подробности в разделе Группа безопасности .

Перейдите в службу EC2 к экземпляру EC2. Щелкните Группу безопасности на вкладке Безопасность . Нажмите кнопку Изменить входящие правила на вкладке Входящие правила и добавьте правило Весь трафик с группой безопасности АЛЬБОМА в качестве источника. Удалите существующее правило 8080.

Проверьте еще раз, доступна ли конечная точка, и теперь она работает!

$ curl http://MyAwsAlb-555143254.eu-west-3.elb.amazonaws.com:8080/hello
Hello AWS! From host: 9a71b51064ee/172.17.0.2

Цель состояла в том, чтобы иметь возможность развернуть образ в нескольких контейнерах, работающих на одном экземпляре EC2. Перейдите к Сервису и измените количество задач на 2. Проверьте еще раз с помощью curl и вы заметите, что IP-адрес меняется. В одном экземпляре EC2 выполняются две задачи. Возможно, что 502 Плохой шлюз возникает после обновления задач, но это должно прекратиться через несколько секунд.

Наконец, давайте активируем 2 экземпляра EC2, обновив ASG в службе EC2.

В службе ECS вы можете установить количество задач равным 4.

В классическом представлении (отключите переключатель New ECS Experience ) вы можете видеть, что с каждым 2 задачами запущено 2 экземпляра EC2.

Бегущий скручивающийся снова показывает вам, что четыре задачи опрашиваются одна за другой.

$ curl http://MyAwsAlb-555143254.eu-west-3.elb.amazonaws.com:8080/hello
Hello AWS! From host: 5e97f1d8c823/172.17.0.3
$ curl http://MyAwsAlb-555143254.eu-west-3.elb.amazonaws.com:8080/hello
Hello AWS! From host: ef015b5e2050/172.17.0.2
$ curl http://MyAwsAlb-555143254.eu-west-3.elb.amazonaws.com:8080/hello
Hello AWS! From host: e70d69bb7d02/172.17.0.2
$ curl http://MyAwsAlb-555143254.eu-west-3.elb.amazonaws.com:8080/hello
Hello AWS! From host: 1b2af349eb95/172.17.0.3

8. Уборка

Выполните следующие действия, чтобы удалить все ресурсы:

  • Установите количество задач равным 0 в службе ECS;
  • Удалите кластер, это на момент написания доступно только в классическом представлении;
  • Щелкните Определение задачи, выберите все изменения и через меню Действия выберите пункт Отмена регистрации ;
  • Удалите репозиторий ECR;
  • Удалите ALB, Целевую группу и группу безопасности my- ecs-alb-sg ;
  • В службе CloudFormation удалите созданный стек. Вы не создавали это сами, но служба ECS использует формирование облаков в фоновом режиме для создания необходимых ресурсов.

9. Вывод

В этом блоге вы узнали, как создать и настроить кластер ECS и развернуть в нем образ Docker, содержащий приложение Spring Boot. Вы также узнали, как масштабировать экземпляры EC2 и как запускать несколько задач на нескольких экземплярах EC2 с помощью ALB.

Оригинал: “https://dev.to/mydeveloperplanet/how-to-deploy-a-spring-boot-app-on-aws-ecs-cluster-146a”