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

我试图使用 ECSdocker容器映像部署到 AWS,但是没有创建 EC2实例。我在网上搜索了一下,希望能找到一个解释,为什么我会收到以下错误:

”调用 RunTask 操作时发生客户端错误(InvalidParameter terException) : 在您的群集中没有找到容器实例

以下是我的步骤:

1. 从 Ubuntu 推送一个 docker 图片到我的 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实例,以及需要使用哪种容器实例?< em > 我认为整个过程是从创建 EC2实例开始的!

99868 次浏览

经过几个小时的调查,我终于明白了。Amazon,如果你正在听,你应该在创建集群或者向集群添加实例时在管理控制台的某个地方声明:

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

以下是冗长的说辞:

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

2.在 Community AMIs下,搜索 ecs-optimized,并选择最适合您的项目需要的那一个。任何都行。点击下一步。

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

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

5.然后,完成对 ECS 实例的配置。< br/> 注意:如果你正在创建一个 web 服务器,你需要创建一个 securityGroup 来允许访问端口80。

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

其他建议检查

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

    查找 AMI-检查 启动 Amazon ECS 容器实例

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

启动 Amazon ECS 容器实例点10。

更多信息可在 这根线中获得。

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

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

解决问题

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

0.0.0.0/0 igw-24b16740

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

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

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

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

enter image description here

在此之后,单击 IAM 角色,它将引导您到 IAM 控制台。从权限策略列表中选择 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集群: enter image description here

AWS 文档说这部分是可选的,但是在我的例子中,如果没有这个“可选”配置,它就不能工作。

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

当这种情况发生时,你需要注意以下几点:

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

大多数情况下,这个问题出现是因为 VPC 配置错误。根据 文件:

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

  • 要创建 VPC 端点: 请参阅文档 给你
  • 创建 NAT 网关: 请参阅文档 给你

这就是 ECS 仪表板中没有列出 EC2实例的原因。

我意识到这是一个较老的线程,但是在看到 OP 在跟踪 本教程时提到的错误之后,我无意中发现了它。

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

多亏了@sanath _ p 到 这根线的链接,我找到了一个解决方案,并采取了以下步骤:

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

除了 ecs 优化的实例映像。请执行以下步骤

ECS _ CLUSTER = REPLACE _ Your _ CLUSTER _ NAME

  • 将上述内容添加到/etc/ecs/ecs.config

VPC 将需要与 ECR 进行通信。

为此,附加到 VPC 的安全组将需要0.0.0.0.0的出站规则。