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

cos*_*r11 97 amazon-web-services amazon-ecs docker aws-cli

我试图将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 
Run Code Online (Sandbox Code Playgroud)

3.完成任务:

aws ecs run-task --task-definition my-task
Run Code Online (Sandbox Code Playgroud)

然而,它失败了.

这是我的任务:

{
  "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
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

cos*_*r11 140

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

"在将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实例选项卡,您也尝试添加实例.

  • 选择为给定区域指定的建议ami解决了我的问题.要查找ami,您应该选中此网址http://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html (8认同)
  • 现在值得注意的是(2018年4月),如果你使用当前的Beta Fargate(https://aws.amazon.com/fargate/)来避免这种类型的麻烦,你可能希望我选择`EC2`作为出现此错误时的启动类型... (5认同)
  • 并且,在创建EC2时,不要忘记在"高级详细信息 - >用户数据"中添加`#!/ bin/bash echo ECS_CLUSTER = your_cluster_name >>/etc/ecs/ecs.config`,如果您有自己的,非默认群集.另外,新创建的EC2实例将创建默认群集. (5认同)

P_W*_*999 35

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

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

修复

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

0.0.0.0/0 igw-24b16740  
Run Code Online (Sandbox Code Playgroud)

其中igw-24b16740是您新创建的互联网网关的名称.

  • 谢谢您的提示!我已为我的实例分配了一个安全组,该组阻止了所有出站流量,除了到达负载均衡器的流量。我将其切换为允许所有出站流量,但仅限制来自负载均衡器的传入流量,然后这些实例出现在我的EC2群集中。 (2认同)
  • 我希望我能不止一次对你的答案投赞成票。这解决了我的确切问题“在您的集群中找不到容器实例”。并且原始答案投票更多与您的实际解决方案无关。再次感谢你。 (2认同)

san*_*h_p 11

其他建议检查

1)选择为给定区域指定的建议ami解决了我的问题.要查找ami - 请查看此网址http://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html

2)通过defaault将所有ec2实例添加到默认群集.所以集群的名称也很重要.

请参见此处的第10点 http://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html

此主题中提供了更多信息 https://forums.aws.amazon.com/thread.jspa?threadID=189513


Mil*_*mak 11

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

  • 使用 CLI 我添加了`--launch-type FARGATE` (2认同)
  • 感谢 Milan,即使使用 Python API,它也对我有用。 (2认同)
  • 彼此彼此。为清楚起见,只有 2 种启动类型:“FARGATE”或“EC2”。AWS文档没有很好地显示它,但ECS默认是EC2。EC2 需要预配置实例来启动任务的容器。所以它有点晦涩,但如果您使用 Fargate 但没有指定 Fargate 启动类型,您就会遇到[此处](https ://stackoverflow.com/a/55158931/7547940) (2认同)
  • 这就是我非常喜欢的东西。 (2认同)

Ash*_*hot 6

发生这种情况时,您需要注意以下事项:

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

大多数时候,出现此问题的原因是 VPC 配置错误。根据文档

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

这些就是您在 ECS 仪表板中看不到 EC2 实例列出的原因。