运行任务时出现AWS ECS错误:在集群中未找到容器实例


114

我正在尝试将docker容器映像部署为AWS使用ECS,但未创建EC2实例。我在互联网上搜寻了有关为什么收到以下错误的解释:

“调用RunTask操作时发生客户端错误(InvalidParameterException):在群集中未找到容器实例。”

这是我的步骤:

1.将Docker映像从Ubuntu推送到我的Amazon ECS存储库。

2.注册了ECS任务定义:

aws ecs register-task-definition --cli-input-json file://path/to/my-task.json 

3.处理任务:

aws ecs run-task --task-definition my-task

然而,它失败了。

这是我的任务:

{
  "family": "my-task",
  "containerDefinitions": [
    {
        "environment": [],
        "name": "my-container",
        "image": "my-namespace/my-image",
        "cpu": 10,
        "memory": 500,
        "portMappings": [
            {
                "containerPort": 8080,
                "hostPort": 80
            }
        ],
        "entryPoint": [
            "java",
            "-jar",
            "my-jar.jar"
        ],
        "essential": true
    }
  ]
}

我也尝试过使用管理控制台来配置集群和服务,但是却遇到了同样的错误。如何将群集配置为具有ec2实例,我需要使用哪种容器实例?我以为整个过程都是从创建EC2实例开始的!


当我快速进入创建集群和运行任务的步骤之间时,感觉就像看到了这一点。
Ben Creasy

Answers:


156

经过几个小时的调查,我发现了这一点。亚马逊,如果您正在侦听,则在创建集群或向集群添加实例时,应在管理控制台中的某处声明以下内容:

“在将ECS实例添加到群集之前,必须首先转到EC2管理控制台并创建ecs-optimized具有AmazonEC2ContainerServiceforEC2Role附加了策略的IAM角色的实例”

这是一个难题:

1.转到您的EC2仪表板,然后单击Launch Instance按钮。

2.在下方Community AMIs,搜索ecs-optimized,然后选择最适合您的项目需求的一种。任何都可以。点击下一步。

3.当您进入配置实例详细信息时,单击create new IAM role link并创建一个名为的新角色ecsInstanceRole

4.将AmazonEC2ContainerServiceforEC2Role策略附加到该角色。

5.然后,完成配置ECS实例。
注意:如果要创建Web服务器,则需要创建一个securityGroup以允许访问端口80。

几分钟后,实例初始化并运行后,您可以刷新“ ECS实例”选项卡,您也尝试添加实例。


10
选择为给定区域指定的建议ami解决了我的问题。为了找出AMI你应该选择检查此网址docs.aws.amazon.com/AmazonECS/latest/developerguide/...
sanath_p

1
没有看到AmazonEC2ContainerServiceforEC2Role,自您上次发布以来有没有变化?
BlueDolphin

1
@BlueDolphin我在IAM中创建新角色时能够找到该策略。
cyrf

6
现在(2018年4月)值得注意的是,如果您正在使用当前的Beta Fargate(aws.amazon.com/fargate)来避免整个类型的麻烦,您可能会喜欢我EC2在遇到此错误时就选择了启动类型...
歪曲

10
而且,在创建EC2的时候,不要忘了加#!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.configAdvanced Details -> User data,如果你有你自己的,非默认的簇。否则,新创建的EC2实例将创建默认集群。
雅各布·查普利基

40

当前,Amazon AWS Web界面可以使用正确的AMI和正确的名称自动创建实例,以便将其注册到正确的集群。

即使所有实例都是由Amazon使用正确的设置创建的,我的实例也不会注册。在Amazon AWS论坛上,我找到了一个线索。事实证明,您的群集需要Internet访问,并且如果您的专用VPC没有Internet网关,则群集将无法连接。

解决方法

在VPC仪表板中,您应该创建一个新的Internet网关并将其连接到群集使用的VPC。连接后,您必须更新(或创建)VPC的路由表并添加为最后一行

0.0.0.0/0 igw-24b16740  

igw-24b16740是您新创建的Internet网关的名称。


docs.aws.amazon.com/AWSEC2/latest/UserGuide/… 中提到了这一点。[EC2-VPC]检查子网的路由表。您需要一条路由,将发往VPC之外的所有流量发送到VPC的Internet网关。
贾斯汀·凯斯

2
谢谢您的提示!我已为我的实例分配了一个安全组,该组阻止了所有出站流量,但负载均衡器的流量除外。我将其切换为允许所有出站流量,但仅限制来自负载均衡器的传入流量,然后这些实例出现在我的EC2群集中。
Mikepote

1
希望我能多次投票赞成您的答案。这解决了我的确切问题“在群集中未找到容器实例”。而最初投票的答案更多与您的实际解决方案无关。再次感谢你。
alexkb '18

除了将网关与您的VPC关联外,您可能还需要通过该路由为包含ECS实例的特定子网通过Internet路由。-例如aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID-我可以建议将此添加到答案中吗?
格雷格

我认为值得一提的是,当您添加指向IGW的0.0.0..0 / 0路由时,该子网不再是私有子网。从网络安全的角度来看,最好创建一个指向NAT网关的路由。
亨里克·平格尔



3

以防万一有人像我一样被这个问题所困扰...我已经在这里尝试了所有事情,但对我没有用。

况且什么这里说的关于EC2实例的角色,因为评论在这里,在我的情况下,只有当我还是用简单的信息配置的EC2实例工作。使用用户数据的初始脚本是这样的:

#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=quarkus-ec2
EOF

通知在此ecs配置文件中创建的相关ECS群集名称,可以解决我的问题。如果没有此配置,则EC2实例上的ECS代理日志显示无法连接到ECS的错误,这样做使EC2实例对ECS群集可见。

完成此操作后,我可以将EC2实例用于我的EC2集群: 在此处输入图片说明

AWS文档说这部分是可选的,但就我而言,没有这个“可选”的配置就无法工作。


2

如果在创建集群后遇到此问题

转到EC2实例列表中的ECS实例,并检查已分配给该实例的IAM角色。您可以使用实例名称开头的实例轻松识别实例ECS Instance

在此处输入图片说明

之后,单击IAM角色,它将把您定向到IAM控制台。选择AmazonEC2ContainerServiceforEC2Role从权限策略列表中策略,然后保存角色。

保存实例后不久,您的实例将在群集中可用。


1

真正的问题是缺乏许可。只要您创建并分配具有AmazonEC2ContainerServiceforEC2Role权限的IAM角色,问题就不会消失。


0

我遇到的另一个可能原因是将ECS集群AMI更新为“ Amazon Linux 2” AMI,而不是“ Amazon Linux AMI”,这导致我的EC2 user_data启动脚本不起作用。


0

发生这种情况时,您需要查看以下内容:

  1. 您的EC2实例应具有AmazonEC2ContainerServiceforEC2Role附加了托管策略的角色
  2. 您的EC2实例应该正在运行AMI映像ecs-optimized(您可以在EC2仪表板中进行检查)
  3. 您的VPC的专用子网未分配公共IP,或者您未配置接口VPC端点,或者未设置NAT网关

在大多数情况下,出现此问题是由于VPC配置错误。根据文档

引用:如果没有配置接口VPC端点,并且容器实例没有公用IP地址,则它们必须使用网络地址转换(NAT)来提供此访问。

  • 要创建VPC端点:请在此处遵循文档
  • 要创建一个NAT网关:按照相关文档在这里

这就是为什么您在ECS仪表板中看不到EC2实例的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.