Кластер ECS не может выполнять задачи в частной подсети при использовании EC2

У меня есть определение задачи, настроенное на использование сетевого режима awsvpc. согласно это:

Only private subnets are supported for the awsvpc network mode. Because tasks do not receive public IP addresses, a NAT gateway is required for outbound internet access, and inbound internet traffic should be routed through a load balancer.

Я установил шлюз NAT в общедоступной подсети (с интернет-шлюзом) и настроил таблицу маршрутов в частной подсети для отправки трафика на шлюз NAT. Но когда я хочу создать задачу, которая находится в частной подсети, я получаю:

Run tasks failed Reasons : ["ATTRIBUTE"]. Learn more

Если я выберу общедоступную подсеть, которую использует сам EC2, она создаст задачу. Но я не могу получить доступ к Интернету внутри своих задач.
Моя конечная цель — получить доступ к Интернету из моих задач в EC2.

ОБНОВЛЕНИЕ: определение моей задачи:

{
"ipcMode": null,
"executionRoleArn": "arn:aws:iam::783294628224:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"dnsSearchDomains": null,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/TEST-Task-Definition",
"awslogs-region": "us-west-2",
"awslogs-stream-prefix": "ecs"
}
},
"entryPoint": null,
"portMappings": [
{
"hostPort": 8500,
"protocol": "tcp",
"containerPort": 8500
},
{
"hostPort": 8501,
"protocol": "tcp",
"containerPort": 8501
}
],
"command": null,
"linuxParameters": null,
"cpu": 0,
"environment": [],
"resourceRequirements": null,
"ulimits": null,
"dnsServers": null,
"mountPoints": [],
"workingDirectory": null,
"secrets": null,
"dockerSecurityOptions": null,
"memory": null,
"memoryReservation": 500,
"volumesFrom": [],
"stopTimeout": null,
"image": "<MY ECR REPOSITORY ADDRESS FOR IMAGE 1>",
"startTimeout": null,
"dependsOn": null,
"disableNetworking": null,
"interactive": null,
"healthCheck": null,
"essential": true,
"links": null,
"hostname": null,
"extraHosts": null,
"pseudoTerminal": null,
"user": "root",
"readonlyRootFilesystem": null,
"dockerLabels": null,
"systemControls": null,
"privileged": true,
"name": "backend"
},
{
"dnsSearchDomains": null,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/TEST-Task-Definition",
"awslogs-region": "us-west-2",
"awslogs-stream-prefix": "ecs"
}
},
"entryPoint": null,
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
],
"command": null,
"linuxParameters": null,
"cpu": 0,
"environment": [],
"resourceRequirements": null,
"ulimits": null,
"dnsServers": null,
"mountPoints": [],
"workingDirectory": null,
"secrets": null,
"dockerSecurityOptions": null,
"memory": null,
"memoryReservation": 500,
"volumesFrom": [],
"stopTimeout": null,
"image": "<MY ECR REPOSITORY ADDRESS FOR IMAGE 2>",
"startTimeout": null,
"dependsOn": null,
"disableNetworking": null,
"interactive": null,
"healthCheck": null,
"essential": true,
"links": null,
"hostname": null,
"extraHosts": null,
"pseudoTerminal": null,
"user": "root",
"readonlyRootFilesystem": null,
"dockerLabels": null,
"systemControls": null,
"privileged": true,
"name": "frontend"
}
],
"memory": null,
"taskRoleArn": "arn:aws:iam::783294628224:role/ecsTaskExecutionRole",
"family": "TEST-Task-Definition",
"pidMode": null,
"requiresCompatibilities": [
"EC2"
],
"networkMode": "awsvpc",
"cpu": null,
"proxyConfiguration": null,
"volumes": [],
"placementConstraints": []
}

Используете ли вы AWS ECS Optimized EC2 AMI? docs.aws.amazon.com/AmazonECS/latest/developerguide/…

zdk 08.04.2019 18:30

@здк да. Когда я создаю кластер, он создает EC2 с соответствующим AMI.

Mostafa Farzane 08.04.2019 20:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 315
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы не используете https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html

Убедитесь, что вы установили ключ среды параметра агента ECS_ENABLE_TASK_ENI как true

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

Mostafa Farzane 08.04.2019 20:05

В частности, консоль создает AMI с идентификатором: amzn-ami-2018.03.o-amazon-ecs-optimized (ami-0d2f82a622136a696)

Mostafa Farzane 08.04.2019 20:46

@MostafaFarzane Хорошо, отлично. Вы пробовали последнее 20190301 изображение?

zdk 09.04.2019 06:24

Когда я выполняю docker image ls, он говорит: amazon/amazon-ecs-agent latest и amazon/amazon-ecs-pause 0.1.0

Mostafa Farzane 09.04.2019 07:09

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

zdk 09.04.2019 08:40
Ответ принят как подходящий

Наконец-то мне удалось решить мою проблему. Насколько мне известно, при использовании сетевого режима awsvpc в определении задачи задачи (или службы) должны создаваться в подсети EC2. Кроме того, если вы хотите, чтобы ваши задачи имели доступ к Интернету, вам следует создать шлюз NAT в другой подсети с маршрутом по умолчанию к интернет-шлюзу, находящемуся в вашем VPC. В подсети task/service/EC2 необходимо добавить маршрут по умолчанию к шлюзу NAT. Единственная проблема, которая возникает, заключается в том, что вы больше не можете подключиться к EC2 по ssh. Если вы хотите подключиться к EC2 по ssh, я думаю, вам следует настроить балансировщик нагрузки.

Если вы хотите подключиться к своим инстансам по SSH, вам следует настроить хост-бастион в общедоступной подсети и использовать его в качестве хоста для перехода к вашим инстансам. Если бы вы подключались по SSH через балансировщик нагрузки, как бы вы контролировали, в какой экземпляр вы подключаетесь по SSH?

Blueriver 02.03.2020 15:14

Другие вопросы по теме