Terraform部署AWS ECS未自动部署最新任务定义问题
问题根因
核心问题出在aws_ecs_service资源的lifecycle配置上:你将task_definition加入了ignore_changes列表。ignore_changes规则会让Terraform在计算资源更新计划时,完全忽略指定属性的变更——哪怕你在代码里明确写了task_definition = aws_ecs_task_definition.ecsTaskDefinition.arn,当任务定义重建生成新的ARN时,Terraform也不会触发ECS服务对应字段的更新。ECS服务没有收到绑定新任务定义的指令,自然会一直运行旧的任务修订版本,不会触发新版本部署。
你贴的执行日志也能直接印证这个问题:日志中只提示aws_ecs_task_definition需要替换重建,完全没有aws_ecs_service需要更新的相关条目,正是因为忽略规则屏蔽了任务定义变更对服务资源的影响。
修复步骤
- 调整
aws_ecs_service的lifecycle配置,将task_definition从ignore_changes列表中移除,保留对desired_count的忽略即可(该配置用于避免Terraform覆盖自动伸缩或手动调整的服务实例数,属于常规合理配置)。修改后的代码块如下:
lifecycle { ignore_changes = [desired_count] }
- 执行
terraform plan校验变更,此时执行计划中除了任务定义的重建操作外,还会显示aws_ecs_service将更新task_definition属性,绑定到新生成的任务定义ARN。 - 确认计划符合预期后执行
terraform apply,Terraform会按顺序先创建新版本任务定义,再更新ECS服务绑定的任务定义,自动触发滚动部署完成版本更新。
补充说明
- 你当前配置中已经开启
force_new_deployment = true,移除错误的忽略规则后,只要任务定义发生变更,就会自动强制触发ECS服务的新部署,不需要额外配置。 - 只有当你完全通过Terraform之外的流程(比如独立的CD工具、CodeDeploy)管控ECS服务的任务定义版本更新时,才需要将
task_definition加入ignore_changes列表;如果部署流程由Terraform全链路管理,这个字段绝对不能加入忽略列表。
内容的提问来源于stack exchange,提问作者Adrian Görisch
相关产品推荐
相关产品推荐

