为什么我的ECS服务无法使用我的ELB注册EC2实例?

Rya*_*yan 14 amazon-ec2 amazon-web-services amazon-ecs amazon-elb

我有一个EC2启动配置,可以构建ECS优化的AMI.我有一个自动缩放组,确保我始终至少有两个可用的实例.最后,我有一个负载均衡器.

我正在尝试创建一个ECS服务,在负载均衡器中的实例之间分配我的任务.

在阅读了ECS负载平衡的文档之后,我的理解是我的ASG不应该自动向ELB注册我的EC2实例,因为ECS负责这一点.所以,我的ASG没有指定ELB.同样,我的ELB没有任何已注册的EC2实例.

当我创建我的ECS服务时,我选择ELB并选择ecsServiceRole.创建服务后,我从未在ECS实例选项卡中看到任何可用实例.该服务也无法启动任何任务,其中包含非常一般的错误...

服务无法放置任务,因为无法找到资源.

我已经在这里工作了大约两天,似乎无法弄清楚哪些配置设置没有正确配置.有没有人对可能导致这种情况不起作用的想法有任何想法?

更新@ 06/25/2015:

我认为这可能与ECS_CLUSTER用户数据设置有关.

在我的EC2自动缩放启动配置中,如果我将用户数据输入完全清空,则会创建ECS_CLUSTER值为"default" 的实例.发生这种情况时,我会看到一个自动创建的集群,名为"default".在这个默认集群中,我看到了实例,并且可以像预期的那样向ELB注册任务.一旦任务在ELB中注册,我的ELB运行状况检查(HTTP)就会通过,并且一切都在世界上很好.

但是,如果我将该ECS_CLUSTER设置更改为自定义设置,我永远不会看到使用该名称创建的集群.如果我手动创建具有该名称的集群,则实例永远不会在集群中可见.在这种情况下,我无法在ELB中注册任务.

有任何想法吗?

Rya*_*yan 12

最后,最终我的EC2实例没有被分配公共IP地址.似乎ECS需要能够与每个EC2实例直接通信,这将要求每个实例具有公共IP.我没有为我的容器实例分配公共IP地址,因为我认为我将它们全部放在公共负载均衡器后面,并且每个容器实例都是私有的.

  • 您的实例不需要公共IP地址,但只需要访问ECS端点(这可能意味着通过IGW或NAT访问Internet,或者允许访问ECS的HTTP代理). (11认同)
  • 你绝对不需要为每个私有实例提供公共IP地址.正确的方法是设置一个Nat Gateway并将该网关连接到连接到您的私有子网的路由表. (3认同)
  • @SamuelK似乎确实需要公共IP:如果我在没有公共IP的IGW子网中运行实例,它就不会注册.相同的设置,但使用公共IP并注册.安全组不需要打开任何传入端口,因此无论如何它都是安全的,如果需要,还可以使用SSH. (2认同)

小智 11

我有类似的症状,但最终在日志文件中找到答案:

/var/log/ecs/ecs-agent.2016-04-06-03:

2016-04-06T03:05:26Z [ERROR] Error registering: AccessDeniedException: User: arn:aws:sts::<removed>:assumed-role/<removed>/<removed is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws:ecs:us-west-2:<removed:cluster/MyCluster-PROD
    status code: 400, request id: <removed>
Run Code Online (Sandbox Code Playgroud)

在我的情况下,资源存在但无法访问.听起来OP指的是不存在或不可见的资源.您的群集和实例是否在同一区域?日志应确认详细信息.

回应其他帖子:

您不需要公共IP地址.

您需要:ecsServiceRole或分配给EC2实例的等效IAM角色,以便与ECS服务进行通信.您还必须指定ECS群集,并且可以在实例启动或启动配置定义期间通过用户数据完成,如下所示:

#!/bin/bash
echo ECS_CLUSTER=GenericSericeECSClusterPROD >> /etc/ecs/ecs.config
Run Code Online (Sandbox Code Playgroud)

如果在新启动的实例上未能执行此操作,则可以在实例启动后执行此操作,然后重新启动该服务.