使用Terraform更新ECS服务无法发出新任务

时间:2018-01-10 04:31:02

标签: amazon-web-services terraform aws-ecs

在推送我的容器的新图像后,我使用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.

问题是,该网站仍处于活动状态且正在运行。

1 个答案:

答案 0 :(得分:7)

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

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

在您的情况下,您拥有与群集中的容器实例一样多的任务,因此当它尝试将新任务安排到群集时,它无法放置它,因为该端口已被旧任务绑定。如果您的任务/服务存在放置限制,您也可能会发现自己处于这个位置。

由于最低健康百分比设置为100%,因此无法安排删除任何旧任务,然后释放新任务的放置选项。

群集中的容器实例可能多于运行任务的实例,这样可以让ECS在从其他实例中删除旧任务之前部署新任务,或者可以更改最小健康百分比([{{1} }}(Terraform的ECS服务资源中的https://www.terraform.io/docs/providers/aws/r/ecs_service.html#deployment_minimum_healthy_percent)到一个小于100的数字,允许部署发生。

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

将最低健康百分比设置为0%意味着ECS可以在启动新任务之前停止所有运行的任务,但这显然会导致潜在(但不能保证)的服务中断。 / p>

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