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

时间:2016-04-09 22:04:54

标签: amazon-web-services docker aws-cli amazon-ecs

我尝试使用dockerAWS容器图像部署到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实例开始!!

10 个答案:

答案 0 :(得分:122)

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

  

"在将ECS实例添加到群集之前,必须首先转到EC2管理控制台并使用附加了ecs-optimized策略的IAM角色创建AmazonEC2ContainerServiceforEC2Role个实例。 #34;

以下是严谨性:

1。转到EC2 Dashboard,然后点击Launch Instance按钮。

2。在Community AMIs下,搜索ecs-optimized,然后选择最适合您项目需求的那个。任何会工作。点击下一步。

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

4。将AmazonEC2ContainerServiceforEC2Role政策附加到该角色。

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

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

答案 1 :(得分:33)

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

即使所有实例都是由亚马逊使用正确的设置创建的,我的实例也不会注册。在Amazon AWS forums我发现了一个线索。事实证明,您的群集需要互联网访问,如果您的私人VPC没有互联网网关,群集将无法连接。

修复

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

0.0.0.0/0 igw-24b16740  

igw-24b16740是新创建的互联网网关的名称。

答案 2 :(得分:11)

其他建议检查

  1. 选择为给定区域指定的建议AMI解决了我的问题。

    要找出AMI - 请检查Launching an Amazon ECS Container Instance

  2. 默认情况下,所有ec2实例都会添加到默认群集中。所以群集的名称也很重要。

  3. Launching an Amazon ECS Container Instance的第10点。

    this thread中提供了更多信息。

答案 3 :(得分:5)

使用Fargate时遇到了这个问题。我在调用launchType="FARGATE"明确地定义了run_task时修复了该问题。

答案 4 :(得分:2)

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

转到EC2实例列表中的ECS实例,并检查已分配给该实例的IAM角色。您可以轻松确定实例,实例名称以ECS Instance

开头

enter image description here

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

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

答案 5 :(得分:2)

以防其他人像我一样被此问题阻止... 我在这里尝试了所有方法,但对我没有用。

here中,除了此处所说的关于EC2实例角色外,在我的情况下,仅当我仍然使用简单的信息配置EC2实例时,EC2实例角色才起作用。使用用户数据这样的初始脚本:

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

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

完成此操作后,我可以将EC2实例用于我的EC2集群: enter image description here

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

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

在大多数情况下,此问题是由于VPC配置错误而出现的。根据{{​​3}}:

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

  • 要创建VPC端点:请遵循文档Documentation
  • 要创建NAT网关:请遵循文档here

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我意识到这是一个较旧的线程,但是在看到OP在this tutorial之后提到的错误后,我迷失了它。

更改为select pg_get_serial_sequence ('template_basic', 'id'); pg_get_serial_sequence | ----------------------------| public.template_basic_id_seq| AMI图像没有帮助。我的VPC已经有一个指向子网的路由0.0.0.0/0。我的实例已添加到正确的群集中,并且具有适当的权限。

由于@sanath_p指向this thread的链接,我找到了解决方案并采取了以下步骤:

  1. 复制了我的自动缩放组的配置
  2. 高级设置下将ecs-optimized设置为“为每个实例分配公共IP地址”
  3. 更新了我的自动伸缩组以使用此新配置。
  4. 实例刷新标签下刷新了我的实例。