Terraform多版本模块问题:Opensearch资源反复销毁重建
问题原因确认与解释
你的怀疑完全正确,模块源中的ref=v1.1.0参数正是导致第二个资源每次修改配置就销毁重建的核心原因,具体逻辑如下:
Terraform对模块实例的识别规则
Terraform将模块的source地址作为区分不同模块实例的核心标识之一。哪怕两个模块实际引用的是同一个Git仓库的代码,只要source地址存在差异(比如一个带?ref=v1.1.0参数,一个不带),Terraform就会将它们判定为完全独立的模块上下文,对应两套完全分离的资源状态。
配置修改触发重建的具体逻辑
当你修改主配置中的参数(比如更新domain名称、调整tags变量)并运行terraform plan时:
- Terraform会对比现有状态与新配置的差异
- 对于
mymodule2,由于它的source带版本参数,Terraform会默认认为该模块的内部资源定义可能与无版本参数的mymodule1存在差异 - 即使你只是修改了外部传入的参数,Terraform也会重新解析带版本的模块代码,重新生成资源定义
- 当新生成的资源定义与状态中已存在的资源标识(由模块上下文+资源名称组成)不匹配时,Terraform就会判定原有资源需要销毁,重新创建新资源
验证方式
你可以运行以下命令查看状态中的资源路径:
terraform state list
会看到mymodule1和mymodule2的资源路径完全独立,比如:
module.mymodule1.aws_opensearch_domain.main module.mymodule2.aws_opensearch_domain.main
这说明Terraform确实将它们视为两套完全独立的资源集合。
解决方案
- 统一模块源地址:如果两个模块需要使用相同版本的代码,将
mymodule1的source也改为gitsource.git?ref=v1.1.0,保持两者的source完全一致;或者去掉mymodule2的ref参数,统一使用仓库默认分支代码。 - 接受独立实例(若需不同版本):如果确实需要两个模块使用不同版本的代码,那么需要接受它们是独立的资源实例,修改配置时的销毁重建是正常行为;不建议通过
terraform state mv手动调整状态,容易引发状态混乱。
内容的提问来源于stack exchange,提问作者bruvio
相关产品推荐
相关产品推荐

