Я пытаюсь внедрить мультисервисный кластер ECS, используя обнаружение служб между службами. Для этого я пытаюсь следовать инструкциям на https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cli-tutorial-servicediscovery.html - НО ПОЧЕМУ ОНИ ПУБЛИЛИ SH ТАКИХ НЕПОЛНЫХ ИНСТРУКЦИЙ? Он не включает в себя полный рабочий пример, но является кратким описанием того, что делать.
Я определил две службы - используя docker-compose.yml
и ecs-params.yml
для определения служб.
Я легко могу запустить кластер ECS и две службы. Все выглядит правильно. Но одна из служб нуждается в общедоступном IP-адресе c. Поэтому в соответствующий файл ecs-params.yml
я положил assign_public_ip: ENABLED
. Но никакой публичный c IP-адрес не назначается. В консоли ECS в деталях службы указано Auto-assign public IP DISABLED
, а для задачи - частный IP-адрес, а не общедоступный c IP-адрес.
К сожалению, это может оказаться невозможным. В документации я нахожу это (в https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html)
Сетевой режим awsvp c не предоставляет ENI задач с опубликованными c IP-адресами для задач, которые используют тип запуска EC2. Для доступа к inte rnet задачи, использующие тип запуска EC2, должны быть запущены в закрытом su bnet, настроенном для использования шлюза NAT. Дополнительную информацию см. В разделе «Шлюзы NAT» в руководстве пользователя Amazon VP C. Входящий сетевой доступ должен осуществляться из VP C с использованием частного IP-адреса или маршрутизироваться через балансировщик нагрузки из VP C. Задачи, запущенные в подсетях publi c, не имеют доступа к исходящей сети.
Вопрос заключается в том, как обойти это ограничение AWS Тип запуска ECS EC2.
Я не могу понять, почему тип запуска EC2 не поддерживает публичные c IP-адреса? Или - я использую другой сетевой режим, и тогда будет назначен публичный c IP-адрес? Почему документация AWS не является более ясной по этому поводу?
Кластер создается с использованием:
ecs-cli up --cluster-config ecs-service-discovery-stack --ecs-profile ecs-service-discovery-stack --keypair notes-app-key-pair --instance-type t2.micro --capability-iam --force --size 2
Существует две службы, определенные в соответствии с предложенным выше руководством. Службы backend
(простое приложение Node.js в контейнере) и frontend
(простой сервер NGINX, настроенный для прокси-сервера на бэкэнд) находятся в своем собственном каталоге. В каждом каталоге находится docker-compose.yml
и ecs-params.yml
файлов.
Интерфейс службы вызывается с помощью:
ecs-cli compose --project-name frontend service up --private-dns-namespace tutorial --vpc ${VPC_ID} --enable-service-discovery --container-port 80 --cluster ecs-service-discovery-stack --force-deployment
Его docker-compose.yml
:
version: '3'
services:
nginx:
image: USER-ID.dkr.ecr.REGION.amazonaws.com/nginx-ecs-service-discovery
container_name: nginx
ports:
- '80:80'
logging:
driver: awslogs
options:
awslogs-group: simple-stack-app
awslogs-region: REGION
awslogs-stream-prefix: nginx
И ecs-params.yml
:
version: 1
task_definition:
task_execution_role: ecsTaskExecutionRole
ecs_network_mode: awsvpc
task_size:
mem_limit: 0.5GB
cpu_limit: 256
run_params:
network_configuration:
awsvpc_configuration:
subnets:
- "subnet-00928d3fc1339b27b"
- "subnet-0ad961884e5f93fb1"
security_groups:
- "sg-0c9c95c6f02597546"
# assign_public_ip: ENABLED
Бэкэнд-сервис вызывается с помощью аналогичной команды и похожих файлов docker-compose.yml
и ecs-params.yml
.