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

时间:2015-06-24 20:40:29

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

我有一个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值为"默认为"。发生这种情况时,我会看到一个自动创建的群集,名为"默认"。在这个默认集群中,我看到了实例,并且可以像预期的那样向ELB注册任务。一旦任务在ELB中注册,我的ELB运行状况检查(HTTP)就会通过,并且一切都在世界上很好。

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

有什么想法吗?

6 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:9)

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

/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>

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

回应其他帖子:

您不需要公共IP地址。

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

#!/bin/bash
echo ECS_CLUSTER=GenericSericeECSClusterPROD >> /etc/ecs/ecs.config

如果您在新启动的实例上无法执行此操作,则可以在实例启动后执行此操作,然后重新启动该服务。

答案 2 :(得分:2)

可能出现的另一个问题是没有为启动配置分配具有适当策略的角色。我的角色没有AmazonEC2ContainerServiceforEC2Role政策(或其中包含的权限)为specified here

答案 3 :(得分:2)

也可能是ECS代理在/ var / lib / ecs / data中创建了一个存储集群名称的文件。

如果代理首次使用群集名称&#39;默认&#39;启动,则您需要删除此文件,然后重新启动代理。

答案 4 :(得分:2)

您肯定需要每个私有实例的公共IP地址。正确(和最安全)的方法是设置NAT网关并将该网关连接到连接到您的私有子网的路由表。

VPC文档中详细记录了这一点,特别是Scenario 2: VPC with Public and Private Subnets (NAT)

答案 5 :(得分:-1)

在我们的案例中有几层问题。我会把它们列出来,这样可能会让你知道要追究的问题。

我的监狱是在1个主机中拥有1个ECS。但ECS会强制您在VPC下拥有2个子网,每个子网都有1个docker host实例。我试图在1个可用区域中只有一个docker主机,但无法使其工作。

然后另一个问题是,只有一个子网有一个连接互联网的网关。因此其中一个无法从公众访问。

最终结果是DNS为我的ELB提供了2个IP。其中一个IP可以工作而另一个没有。所以当使用公共DNS访问NLB时,我看到了随机的404。