Terraform部署ECS Cluster时containerInsights配置重复触发变更问题
问题原因
- 核心原因是低于3.74.0版本的HashiCorp AWS Provider存在已知BUG:ECS集群的
setting块做状态比对时未适配AWS API的大小写返回规则。AWS API实际返回的containerInsights配置项名称为首字母大写的ContainerInsights,老版本Provider做字符串匹配时区分大小写,因此每次比对都会判定本地配置和云端实际状态不一致,触发重复更新。 - 小概率场景是未显式配置
default_capacity_provider_strategy参数时,老版本Provider刷新资源状态时会漏读setting块的配置,即使state中已存储该配置,也会判定为需要新增。
解决方法
方案1(优先推荐):升级AWS Provider版本
将AWS Provider升级到3.74.0及以上的稳定版本,官方已在该版本修复了ECS集群setting块的大小写匹配和状态读取问题,绝大多数场景升级后重新执行terraform init拉取新版本Provider,再执行terraform apply即可消除重复变更。
Provider版本配置参考:
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" # 可替换为更高的稳定版本 } } }
方案2(兼容旧版本Provider):调整配置匹配API返回规则
如果受环境限制无法升级Provider,可以直接将setting块的name参数修改为AWS API返回的首字母大写格式ContainerInsights,即可匹配状态比对逻辑:
setting { name = "ContainerInsights" value = "enabled" }
修改后重新执行terraform apply一次,后续就不会再触发重复变更。
方案3(临时规避):添加生命周期忽略规则
如果以上两种方案都无法落地,可以在资源配置中添加lifecycle规则忽略setting块的变更,适合配置不会频繁调整的场景:
resource "aws_ecs_cluster" "doesntmatter" { name = var.doesntmatter_name capacity_providers = ["FARGATE", "FARGATE_SPOT"] setting { name = "containerInsights" value = "enabled" } tags = var.tags lifecycle { ignore_changes = [setting] } }
注意该方案会导致后续setting块的配置变更不会被Terraform识别,仅适合临时规避使用。
内容的提问来源于stack exchange,提问作者Hooch
相关产品推荐
相关产品推荐

