У меня есть определение задачи, настроенное на использование сетевого режима 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": []
}
@здк да. Когда я создаю кластер, он создает EC2 с соответствующим AMI.
Если вы не используете https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html
Убедитесь, что вы установили ключ среды параметра агента ECS_ENABLE_TASK_ENI
как true
Я использую консоль для создания кластера. Таким образом, он создает EC2 с соответствующим AMI.
В частности, консоль создает AMI с идентификатором: amzn-ami-2018.03.o-amazon-ecs-optimized (ami-0d2f82a622136a696)
@MostafaFarzane Хорошо, отлично. Вы пробовали последнее 20190301
изображение?
Когда я выполняю docker image ls
, он говорит: amazon/amazon-ecs-agent latest
и amazon/amazon-ecs-pause 0.1.0
Кроме того, поделитесь своим определением задачи, потому что я думаю, что оно содержит параметр, требующий определенного атрибута экземпляра контейнера, который недоступен в ваших экземплярах контейнера.
Наконец-то мне удалось решить мою проблему. Насколько мне известно, при использовании сетевого режима awsvpc
в определении задачи задачи (или службы) должны создаваться в подсети EC2. Кроме того, если вы хотите, чтобы ваши задачи имели доступ к Интернету, вам следует создать шлюз NAT в другой подсети с маршрутом по умолчанию к интернет-шлюзу, находящемуся в вашем VPC. В подсети task/service/EC2 необходимо добавить маршрут по умолчанию к шлюзу NAT. Единственная проблема, которая возникает, заключается в том, что вы больше не можете подключиться к EC2 по ssh. Если вы хотите подключиться к EC2 по ssh, я думаю, вам следует настроить балансировщик нагрузки.
Если вы хотите подключиться к своим инстансам по SSH, вам следует настроить хост-бастион в общедоступной подсети и использовать его в качестве хоста для перехода к вашим инстансам. Если бы вы подключались по SSH через балансировщик нагрузки, как бы вы контролировали, в какой экземпляр вы подключаетесь по SSH?
Используете ли вы AWS ECS Optimized EC2 AMI? docs.aws.amazon.com/AmazonECS/latest/developerguide/…