В этом посте вы узнаете, как настроить 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”