137

我试图将docker容器映像部署到AWSusing 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 实例开始的!!

4

10 回答 10

192

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

“在您可以将 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 服务器,您将需要创建一个安全组以允许访问端口 80。

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

于 2016-04-10T18:14:40.703 回答
45

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

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

修复

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

0.0.0.0/0 igw-24b16740  

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

于 2017-01-03T07:24:12.247 回答
35

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

于 2019-02-09T12:31:34.907 回答
12

其他建议的检查

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

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

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

请参阅启动 Amazon ECS 容器实例中的第 10 点。

此线程中提供了更多信息。

于 2016-06-26T05:58:47.440 回答
4

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

除了这里所说的关于 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 文档说这部分是可选的,但在我的情况下,如果没有这个“可选”配置,它就无法工作。

于 2019-07-30T09:34:03.753 回答
3

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

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

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

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

这就是您在 ECS 控制面板中看不到 EC2 实例的原因。

于 2020-06-21T20:42:04.330 回答
2

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

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

在此处输入图像描述

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

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

于 2018-12-19T16:58:21.333 回答
1

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

于 2018-03-14T23:06:26.180 回答
0

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

于 2019-07-30T23:20:50.977 回答
0

我意识到这是一个较旧的线程,但是在看到 OP 在遵循本教程时提到的错误后,我偶然发现了它。

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

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

  1. 复制了我的 Autoscaling Group 的配置
  2. 在高级设置IP address type设置为“为每个实例分配一个公共 IP 地址”
  3. 更新了我的自动缩放组以使用这个新配置。
  4. 在Instance refresh选项卡下刷新了我的实例。
于 2020-08-19T15:33:40.973 回答