这更像是 ECS 问题而不是 Terraform 问题,因为 Terraform 正在更新您的任务定义并更新服务以使用新的任务定义,但是 ECS 无法将新任务安排到容器实例上,因为您(可能)定义了一个容器必须运行的特定端口并将其直接映射到主机或使用主机网络而不是桥接(或新的aws-vpc
CNI 插件)。
ECS 有几个参数来控制服务更新的行为:最小健康百分比和最大健康百分比。默认情况下,它们分别设置为 100% 和 200%,这意味着 ECS 将尝试部署与新任务定义匹配的新任务,并等待它被认为是健康的(例如通过 ELB 健康检查),然后再终止旧任务。
在您的情况下,您的任务与集群中的容器实例一样多,因此当它尝试将新任务安排到集群上时,它无法放置它,因为该端口已被旧任务绑定。如果您的任务/服务有放置限制,您也可能会发现自己处于这个位置。
由于最小健康百分比设置为 100%,因此无法安排删除任何旧任务,从而释放新任务的放置选项。
集群中的容器实例可能比正在运行的任务实例多,这将允许 ECS 在从其他实例中删除旧任务之前部署新任务,或者您可以将最小健康百分比(deployment_minimum_healthy_percent
在 Terraform 的 ECS 服务资源中)更改为数量小于 100 以允许进行部署。
例如,如果您通常在服务中部署 3 个任务实例,则将最小健康百分比设置为 50% 将允许 ECS 在调度与新任务定义匹配的新任务之前从服务中删除一项任务。然后它将继续滚动升级,确保新任务在替换旧任务之前是健康的。
将最低健康百分比设置为 0% 意味着 ECS 可以在开始新任务之前停止所有正在运行的任务,但这显然会导致潜在的(但不能保证)服务中断。
或者,如果这对您的服务可行,您可以通过切换主机网络来消除放置约束。