繁体   English   中英

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

[英]Why can't my ECS service register available EC2 instances with my 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中注册任务。

有任何想法吗?

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

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

/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

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

可能出现的另一个问题是未将具有适当策略的角色分配给启动配置。 我的角色没有此处指定AmazonEC2ContainerServiceforEC2Role策略(或其包含的权限)。

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

如果代理首先使用群集名称“default”启动,则需要删除此文件,然后重新启动代理。

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

这在VPC文档中有详细记录,特别是方案2:带有公共和私有子网(NAT)的VPC

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM