Terraform管理多版本ES:ebs_options重复变更问题求助
解决Terraform管理不同版本Elasticsearch时的EBS IOPS重复变更问题
问题根源很明确:AWS Elasticsearch 6.8默认使用gp2存储,该类型无默认IOPS配置;而7.10默认用gp3存储,默认IOPS为3000。由于你的Terraform模块未针对不同版本显式处理IOPS字段,每次执行terraform plan或apply时,Terraform会试图将7.10实例的IOPS置为null,与AWS实际状态冲突,导致重复变更提示。
以下是两种可行的解决方案:
方案1:给实例添加可选IOPS配置项
通过扩展变量结构,让不同实例按需设置IOPS,匹配各自存储类型的默认值:
- 修改
variables.tf,给实例对象添加可选的iops字段:
variable domain_names { type=list(object({ domain_name = string elasticsearch_version = string iops = optional(number) })) }
- 更新
terraform.tfvars,为7.10实例设置IOPS为3000(匹配gp3默认值),6.8实例留空:
domain_names = [ { domain_name = "elastic" elasticsearch_version = "6.8" }, { domain_name = "new-elastic" elasticsearch_version = "7.10" iops = 3000 } ]
- 修改
main.tf中的ebs_options块,仅当实例配置了IOPS时才设置该字段:
ebs_options { ebs_enabled = true volume_size = 50 iops = lookup(var.domain_names[count.index], "iops", null) }
这种方案灵活性高,后续添加其他版本或自定义IOPS的实例时,只需更新tfvars即可。
方案2:根据ES版本自动设置IOPS
无需修改变量和tfvars,直接在资源配置中根据版本判断是否设置IOPS:
修改main.tf中的ebs_options块:
ebs_options { ebs_enabled = true volume_size = 50 iops = var.domain_names[count.index].elasticsearch_version >= "7.10" ? 3000 : null }
这个方案更简洁,适合版本与存储类型对应关系固定的场景,无需额外维护实例的IOPS配置。
两种方案都能解决重复变更问题,执行terraform apply后,后续的plan就不会再出现IOPS的变更提示了。
内容的提问来源于stack exchange,提问作者mek
相关产品推荐
相关产品推荐

