【问题标题】:ECS cluster cannot run tasks in private subnet when using EC2ECS 集群在使用 EC2 时无法在私有子网中运行任务
【发布时间】:2019-08-29 17:22:15
【问题描述】:

我有一个配置为使用 awsvpc 网络模式的任务定义。 根据this:

awsvpc 网络模式仅支持私有子网。 因为任务不接收公共 IP 地址,所以 NAT 网关是 出站互联网访问和入站互联网流量所需 应该通过负载平衡器路由。

我在公共子网(具有互联网网关)中设置了 NAT 网关,并在私有子网中配置路由表以将流量发送到 NAT 网关。但是当我想创建一个驻留在私有子网中的任务时,我得到:

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

如果我选择 EC2 本身使用的公共子网,它会创建任务。但我无法在我的任务中访问互联网。
我的最终目标是通过我在 EC2 中的任务访问 Internet。

更新:我的任务定义:

{
"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": []
}

【问题讨论】:

标签: amazon-web-services amazon-ec2 amazon-ecs


【解决方案1】:

我终于成功解决了我的问题。据我所知,在任务定义中使用awsvpc网络模式时,任务(或服务)必须在EC2子网中创建。此外,如果您希望您的任务能够访问 Internet,您应该在另一个子网中创建一个 NAT 网关,该网关具有到位于您的 VPC 中的 Internet 网关的默认路由。在 task/service/EC2 子网中,您必须添加到 NAT 网关的默认路由。发生的唯一问题是您无法再通过 ssh 连接到您的 EC2。如果你想 ssh 到你的 EC2,我认为你应该设置一个负载均衡器。

【讨论】:

  • 如果您想通过 SSH 连接到您的实例,您应该在公共子网中设置一个堡垒主机并将其用作您的实例的跳转主机。如果您通过负载均衡器 SSH,您将如何控制您通过 SSH 连接到哪个实例?
【解决方案2】:

如果你不使用https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html

确保您已将代理参数环境密钥ECS_ENABLE_TASK_ENI 设置为true

【讨论】:

  • 我使用控制台创建集群。因此它使用适当的 AMI 创建 EC2
  • 具体是控制台创建 AMI 的 id 为: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
  • 另外,请分享您的任务定义,因为我认为它包含一个需要特定容器实例属性的参数,而该属性在您的容器实例上不可用。
猜你喜欢
  • 2020-12-16
  • 2021-08-10
  • 2019-11-08
  • 2022-01-26
  • 2022-01-10
  • 2020-04-17
  • 2023-01-18
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多