Terraform 1.0.10移除模块count参数后如何避免资源销毁重建
Terraform移除模块count参数避免资源重建方案
问题根因
该问题是由模块资源的状态地址变更导致:
使用count参数部署的模块,所有资源在Terraform状态文件中的地址前缀为module.<模块名>[0].;移除count参数后,模块资源的地址前缀变为module.<模块名>.。Terraform无法自动识别这两种地址指向同一批云上资源,因此会判定为需要销毁旧地址对应资源、创建新地址对应资源。
解决步骤
- 第一步:备份当前Terraform状态文件
如果你使用S3远程后端,可先手动下载当前状态文件到本地做备份,避免操作失误导致状态损坏。 - 第二步:确认当前已部署的模块对应的旧状态地址
执行以下命令查看现有状态中的模块地址:
输出中会显示类似terraform state list | grep "^module\."module.moduleA[0].aws_kms_key.xxxx的地址,确认当前生效模块的索引后缀为[0]。 - 第三步:执行模块级状态地址迁移
用terraform state mv命令直接迁移整个模块的所有资源地址,不需要逐个调整单个资源:
如果你当前部署的是moduleA,执行:
如果你当前部署的是moduleB,执行:# 先加-dry-run参数预览迁移结果,确认无误后去掉-dry-run执行实际迁移 terraform state mv -dry-run module.moduleA[0] module.moduleAterraform state mv -dry-run module.moduleB[0] module.moduleB该操作仅修改Terraform状态文件中的地址映射关系,不会对实际运行的AWS资源产生任何变更。
- 第四步:验证迁移结果
执行terraform plan命令检查,此时不会再出现全量销毁重建的提示,若配置无其他变更会提示No changes. Your infrastructure matches the configuration.。
多模块切换适配
后续你用-target参数切换部署另一个模块时,如果该模块之前已经用count模式部署过,首次切换前也需要执行对应模块的terraform state mv迁移操作;如果是首次部署该模块,无历史状态则不需要迁移,直接执行-target命令部署即可。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

