【问题标题】:AWS ECS Error when running task: No Container Instances were found in your cluster运行任务时出现 AWS ECS 错误:在您的集群中未找到任何容器实例
【发布时间】:2016-07-31 02:45:46
【问题描述】:

我正在尝试使用ECSdocker 容器映像部署到AWS,但没有创建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 实例开始的!!

【问题讨论】:

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


【解决方案1】:

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

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

这里是繁文缛节:

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 实例选项卡。

【讨论】:

  • 选择为给定区域指定的建议 ami 解决了我的问题。要找出 ami,您应该选择检查此 url docs.aws.amazon.com/AmazonECS/latest/developerguide/…
  • 没有看到 AmazonEC2ContainerServiceforEC2Role,自您上次发帖以来有什么变化吗?
  • @BlueDolphin 我在 IAM 中创建新角色时能够找到该策略。
  • 现在(2018 年 4 月)值得注意的是,如果您正在使用当前的 Beta Fargate (aws.amazon.com/fargate) 来避免这整个类型的麻烦,您可能会喜欢我出现此错误时已选择 EC2 作为启动类型...
  • 并且,在创建 EC2 时,如果您有自己的非默认集群,请不要忘记在 Advanced Details -> User data 中添加 #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config。否则,新创建的 EC2 实例将创建默认集群。
【解决方案2】:

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

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

修复

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

0.0.0.0/0 igw-24b16740  

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

【讨论】:

  • docs.aws.amazon.com/AWSEC2/latest/UserGuide/… [EC2-VPC] 检查子网的路由表。您需要一条将所有以 VPC 外部为目的地的流量发送到 VPC 的 Internet 网关的路由。
  • 谢谢你的线索!我已经为我的实例分配了一个安全组,它阻止了除负载均衡器的流量之外的所有出站流量。我将其切换为允许所有出站流量,但仅限制来自负载均衡器的传入流量,然后实例出现在我的 EC2 集群中。
  • 我希望我能多次投票给你的答案。这解决了我的确切问题“在您的集群中找不到容器实例”。投票的原始答案与您的实际解决方案无关。再次感谢您。
  • 除了将网关与您的 VPC 关联之外,您可能还需要通过它为您的 ECS 实例所在的特定子网路由互联网流量。 - 例如aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID - 我可以建议将其添加到答案中吗?
  • 我认为值得一提的是,当您为 0.0.0..0/0 添加指向 IGW 的路由时,子网不再是私有子网。从网络安全的角度来看,最好创建一个指向 NAT 网关的路由。
【解决方案3】:

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

【讨论】:

  • 使用 CLI 我添加了 --launch-type FARGATE
  • 感谢 Milan,即使使用 Python API,它也对我有用。
  • 为我完全修复了它。上面的答案没有意义,因为我不需要从向导中这样做。
  • 同上。为清楚起见,只有 2 种启动类型:“FARGATE”或“EC2”。 AWS 文档没有很好地显示它,但 ECS 默认是 EC2。 EC2 需要预置实例来启动容器以执行任务。所以它有点晦涩,但如果您使用 fargate 但您没有指定 fargate 启动类型,您会遇到经典的“无容器实例”问题here跨度>
【解决方案4】:

其他建议检查

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

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

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

请参阅Launching an Amazon ECS Container Instance 的第 10 点。

更多信息请访问this thread

【讨论】:

    【解决方案5】:

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

    除了这里所说的关于 EC2 实例角色的内容,正如 here 所评论的那样,在我的情况下,只有在我仍然使用简单信息配置 EC2 实例时才有效。使用用户数据的初始脚本如下:

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

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

    完成此操作后,我可以获得可用于我的 EC2 集群的 EC2 实例:

    AWS 文档说这部分是可选的,但在我的情况下,如果没有这个“可选”配置,它就无法工作。

    【讨论】:

      【解决方案6】:

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

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

      大多数情况下,出现此问题是因为 VPC 配置错误。根据Documentation

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

      • 创建 VPC 终端节点:按照文档here
      • 创建 NAT 网关:按照文档here

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

      【讨论】:

        【解决方案7】:

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

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

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              我意识到这是一个较旧的线程,但在看到 OP 在关注this tutorial 时提到的错误后,我偶然发现了它。

              更改为 ecs-optimized AMI 映像没有帮助。我的 VPC 已经有一个指向子网的路由 0.0.0.0/0。我的实例已添加到正确的集群中,并且它们具有适当的权限。

              感谢@sanath_p 对this thread 的链接,我找到了解决方案并采取了以下步骤:

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

              【讨论】:

                猜你喜欢
                • 2022-09-30
                • 2021-08-02
                • 2018-06-26
                • 2019-07-10
                • 2020-04-22
                • 1970-01-01
                • 2021-12-16
                • 2019-11-08
                • 1970-01-01
                相关资源
                最近更新 更多