使用 Terraform 更新 ECS 服务无法放置新任务

Updating ECS service with Terraform fails to place a new task

推送容器的新映像后,我使用 Terraform apply 更新任务定义。这似乎工作正常,但在 ECS 服务任务列表中,我可以看到该任务处于非活动状态并且我有一个事件:

service blahblah was unable to place a task because no container instance met all of its requirements. The closest matching container-instance [guid here] is already using a port required by your task.

事实是,该站点仍然有效并且可以正常工作。

这更像是 ECS 问题而不是 Terraform 问题,因为 Terraform 正在更新您的任务定义并更新服务以使用新的任务定义,但 ECS 无法将新任务安排到容器实例上,因为您(大概)定义容器必须 运行 的特定端口并将其直接映射到主机或使用主机网络而不是网桥(或新的 aws-vpc CNI 插件)。

ECS 有几个参数来控制服务更新的行为:最小健康百分比和最大健康百分比。默认情况下,它们分别设置为 100% 和 200%,这意味着 ECS 将尝试部署与新任务定义匹配的新任务,并等待它被认为是健康的(例如通过 ELB 健康检查),然后再终止旧任务。

在您的情况下,您的任务与集群中的容器实例一样多,因此当它尝试将新任务安排到集群上时,它无法放置它,因为端口已经被老任务如果您在 task/service.

上有放置限制,您也会发现自己处于这个位置

因为最小健康百分比设置为 100%,所以无法安排删除任何旧任务,然后为新任务释放放置选项。

您可以在集群中拥有比您拥有的任务实例更多的容器实例 运行ning 这将允许 ECS 在从其他实例中删除旧任务之前部署新任务,或者您可以更改最小健康百分比(deployment_minimum_healthy_percent 在 Terraform 的 ECS 服务资源中)到允许部署发生的小于 100 的数字。

例如,如果您通常在服务中部署 3 个任务实例,则将最小健康百分比设置为 50% 将允许 ECS 在安排与新任务定义匹配的新任务之前从服务中删除一个任务。然后它将继续进行滚动升级,确保新任务在替换旧任务之前是健康的。

将最小健康百分比设置为 0% 意味着 ECS 可以在开始新任务之前停止 所有 任务 运行ning 但这显然会导致潜在(但不保证)服务中断。

或者,如果您的服务可行,您可以通过切换主机网络来移除放置限制。