运行 任务时 AWS ECS 错误:在您的集群中找不到容器实例

AWS ECS Error when running task: No Container Instances were found in your cluster

我正在尝试使用 ECSdocker 容器映像部署到 AWS,但未创建 EC2 实例。我在互联网上搜索,寻找有关我收到以下错误的原因的解释:

"A client error (InvalidParameterException) occurred when calling the RunTask operation: No Container Instances were found in your cluster."

这是我的步骤:

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 实例开始的!!

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

"Before you can add ECS instances to a cluster you must first go to the EC2 Management Console and create ecs-optimized instances with an IAM role that has the AmazonEC2ContainerServiceforEC2Role policy attached"

这里是废话:

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

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

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

的新角色

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

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

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

其他建议检查

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

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

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

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

this thread 中提供了更多信息。

目前,Amazon AWS Web 界面可以自动创建具有正确 AMI 和正确名称的实例,因此它会注册到正确的集群。

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

修正

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

0.0.0.0/0 igw-24b16740  

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

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

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

转到 EC2 实例列表中的 ECS 实例并检查您分配给该实例的 IAM 角色。您可以使用以 ECS Instance

开头的实例名称轻松识别实例

之后单击 IAM 角色,它将引导您进入 IAM 控制台。 Select 权限策略列表中的 AmazonEC2ContainerServiceforEC2Role 策略并保存角色。

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

我 运行 在使用 Fargate 时遇到了这个问题。我在调用 run_task.

明确地 定义了 launchType="FARGATE" 时修复了它

以防其他人像我一样遇到这个问题... 我在这里尝试了一切,但没有为我工作。

除了此处所说的关于 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 文档说这部分是可选的,但就我而言,如果没有这个 "optional" 配置,它就无法工作。

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

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

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

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

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

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

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

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

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

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

  1. 复制了我的自动缩放组的配置
  2. 高级设置下的IP address type设置为“为每个实例分配一个public IP地址”
  3. 更新了我的自动缩放组以使用这个新配置。
  4. 实例刷新 选项卡下刷新了我的实例。