14

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

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

在阅读了 ECS 负载均衡的文档后,我的理解是我的 ASG 不应该自动向 ELB 注册我的 EC2 实例,因为 ECS 会处理这个问题。所以,我的 ASG 没有指定 ELB。同样,我的 ELB 没有任何已注册的 EC2 实例。

创建 ECS 服务时,我选择 ELB 并选择 ecsServiceRole。创建服务后,我从未在 ECS 实例选项卡中看到任何可用的实例。该服务也无法启动任何任务,出现一个非常普遍的错误......

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

我已经在这里待了大约两天,似乎无法弄清楚哪些配置设置没有正确配置。有没有人知道什么可能导致这不起作用?

更新@ 2015 年 6 月 25 日:

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

ECS_CLUSTER在我的 EC2 Auto Scaling 启动配置中,如果我将用户数据输入完全留空,则会使用“默认”值创建实例。发生这种情况时,我会看到一个自动创建的集群,名为“default”。在这个默认集群中,我看到了实例,并且可以像预期的那样向 ELB 注册任务。一旦任务向 ELB 注册,我的 ELB 健康检查 (HTTP) 就会通过,一切顺利。

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

有任何想法吗?

4

6 回答 6

13

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

于 2015-06-29T01:37:01.160 回答
13

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

/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 地址。

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

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

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

于 2016-04-06T03:17:15.913 回答
3

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

于 2015-10-08T12:24:48.293 回答
2

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

如果代理首先以“默认”集群名称启动,您需要删除此文件,然后重新启动代理。

于 2016-01-27T22:09:16.523 回答
2

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

这在 VPC 文档中进行了详细记录,特别是场景 2:具有公共和私有子网 (NAT) 的 VPC

于 2017-06-21T00:02:25.813 回答
-1

在我们的案例中存在几层问题。我会把它们列出来,这样它可能会让你对要解决的问题有所了解。

我的目标是在 1 台主机中拥有 1 台 ECS。但是 ECS 强制您在 VPC 下有 2 个子网,每个子网有 1 个 docker 主机实例。我试图在 1 个可用区中仅拥有 1 个 docker 主机,但无法使其正常工作。

然后另一个问题是,唯一的一个子网有一个连接到它的面向互联网的网关。因此,其中之一无法从公众那里获得。

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

于 2016-10-07T06:57:09.590 回答