我正在尝试设置一项服务,通过应用程序负载均衡器启动 20 个单容器任务。问题是每个任务都停留在
PROVISIONING
该服务记录了一条错误,指出“服务 service_name 无法始终如一地成功启动任务”,这似乎没有多大帮助,因为文档基本上解释了任务启动失败并且有多次重试。
我的集群正在使用 AutoScaleGroup 容量提供程序,其启动模板使用支持 ecs 的 AMI,并具有附加了 AmazonEC2ContainerServiceforEC2Role 策略的角色。实例类型为 t2.micro(尝试过 t2.small 但没有结果)
有人可以帮我解决这个问题吗?任务定义可能是造成这种情况的原因吗? 预先感谢
最后,我意识到每个任务必须有一个名为 /health 的 HTTP 端点,该端点应返回 200。通过调用该端点,负载均衡器确定容器是 PROVISIONING 还是 READY
在我的例子中,任务陷入 PROVISIONING 状态,因为任务定义需要 16GB 内存,但 AutoScaleGruping EC2 实例只有 15GB 可用。我将任务定义中的内存更改为 15GB,然后我就可以开始任务了。
因此,您需要一个将策略 ecsInstanceRole 附加到 LC(启动配置)的 IAM 角色,以将实例注册到 ecs 集群并将用户数据设置为:
#!/bin/bash
echo ECS_CLUSTER=YOU_CLUSTER_NAME_HERE >> /etc/ecs/ecs.config
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html
在我的情况下,我修改了 EC2 实例的用户数据:
[设置.ecs] 集群 =“您的集群名称”
此次更新后,集群在集群概览中显示了一个已注册的容器实例。后来我解决了这个问题。
为了其他可能遇到此问题的人的利益,搜索为什么他们的 ECS 任务/服务可能会在 CREATE_IN_PROGRESS 上使用 CloudFormation 进行配置:
确保您没有重复使用不同 ECS 集群中的启动模板。正如其他答案所指出的:模板创建页面底部的“高级”部分中有一个 bash 脚本,其中包含特定于一个集群的信息。您可以重复使用它,但必须更改集群名称。如果该实例出现在 ECS 集群的“基础设施”选项卡中,您就会知道您的设置是否正确。
更新:
带着另一个可能的原因回到这个答案:如果您的容器想要在没有容量的可用区域中启动(在我的例子中,我想要 us-east-1a,但我的单个测试实例位于 us-east-1f),则该任务将保持在配置状态。该实例位于具有可用容量的 ASG 中,并且它不会自动在该可用区中添加实例。启动 5 个新实例(其中一个最终位于正确的区域)后,任务从“配置”变为“自行运行”。