我尝试使用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
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实例开始!!
答案 0 :(得分:122)
经过几个小时的调查,我发现了这一点。亚马逊,如果您正在收听,则应在创建集群或向集群添加实例时在管理控制台中的某处说明:
"在将ECS实例添加到群集之前,必须首先转到EC2管理控制台并使用附加了
ecs-optimized
策略的IAM角色创建AmazonEC2ContainerServiceforEC2Role
个实例。 #34;
以下是严谨性:
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实例选项卡,您也尝试添加实例。
答案 1 :(得分:33)
目前,Amazon AWS Web界面可以使用正确的AMI和正确的名称自动创建实例,以便它将注册到正确的群集。
即使所有实例都是由亚马逊使用正确的设置创建的,我的实例也不会注册。在Amazon AWS forums我发现了一个线索。事实证明,您的群集需要互联网访问,如果您的私人VPC没有互联网网关,群集将无法连接。
修复
在VPC仪表板中,您应创建一个新的Internet网关并将其连接到群集使用的VPC。 连接后,您必须更新(或创建)VPC的路由表并添加为最后一行
0.0.0.0/0 igw-24b16740
igw-24b16740是新创建的互联网网关的名称。
答案 2 :(得分:11)
其他建议检查
选择为给定区域指定的建议AMI解决了我的问题。
要找出AMI - 请检查Launching an Amazon ECS Container Instance。
默认情况下,所有ec2实例都会添加到默认群集中。所以群集的名称也很重要。
见Launching an Amazon ECS Container Instance的第10点。
this thread中提供了更多信息。
答案 3 :(得分:5)
使用Fargate时遇到了这个问题。我在调用launchType="FARGATE"
时明确地定义了run_task
时修复了该问题。
答案 4 :(得分:2)
如果在创建集群后遇到此问题
转到EC2实例列表中的ECS实例,并检查已分配给该实例的IAM角色。您可以轻松确定实例,实例名称以ECS Instance
之后,单击IAM角色,它将把您定向到IAM控制台。从权限策略列表中选择AmazonEC2ContainerServiceforEC2Role
策略,然后保存角色。
您的实例将在保存后不久在群集中可用。
答案 5 :(得分:2)
以防其他人像我一样被此问题阻止... 我在这里尝试了所有方法,但对我没有用。
在here中,除了此处所说的关于EC2实例角色外,在我的情况下,仅当我仍然使用简单的信息配置EC2实例时,EC2实例角色才起作用。使用用户数据这样的初始脚本:
#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=quarkus-ec2
EOF
通知在此ecs配置文件中创建的相关ECS群集名称,可以解决我的问题。如果没有此配置,则EC2实例上的ECS代理日志显示无法连接到ECS的错误,这样做使EC2实例对ECS群集可见。
AWS文档说这部分是可选的,但就我而言,没有这个“可选”的配置就无法工作。
答案 6 :(得分:1)
真正的问题是缺乏许可。只要您使用AmazonEC2ContainerServiceforEC2Role权限创建和分配IAM角色,问题就会消失。
答案 7 :(得分:1)
发生这种情况时,您需要查看以下内容:
AmazonEC2ContainerServiceforEC2Role
个托管策略的角色ecs-optimized
的AMI映像(您可以在EC2仪表板中进行检查)在大多数情况下,此问题是由于VPC配置错误而出现的。根据{{3}}:
QUOTE:如果您没有配置接口VPC端点,并且您的容器实例没有公共IP地址,则它们必须使用网络地址转换(NAT)来提供此访问权限。
这就是为什么您没有在ECS仪表板中看到EC2实例的原因。
答案 8 :(得分:0)
我遇到的另一个可能原因是将ECS集群AMI更新为“ Amazon Linux 2” AMI,而不是“ Amazon Linux AMI”,这导致我的EC2 user_data启动脚本无法工作。
答案 9 :(得分:0)
我意识到这是一个较旧的线程,但是在看到OP在this tutorial之后提到的错误后,我迷失了它。
更改为select pg_get_serial_sequence ('template_basic', 'id');
pg_get_serial_sequence |
----------------------------|
public.template_basic_id_seq|
AMI图像没有帮助。我的VPC已经有一个指向子网的路由0.0.0.0/0。我的实例已添加到正确的群集中,并且具有适当的权限。
由于@sanath_p指向this thread的链接,我找到了解决方案并采取了以下步骤:
ecs-optimized
设置为“为每个实例分配公共IP地址”