为何无法使用Terraform move块迁移Azure SQL Database至不同资源名?
首先,错误提示里的「跨资源类型/提供者不支持」,大概率不是资源类型本身的问题,而是提供者实例或命名空间不匹配,和你提到的公司私有镜像仓库直接相关:
核心排查点
提供者命名空间/实例差异
你的私有镜像提供者是terraformregistry.mycompany.com/hashicorp/azurerm,如果两个模块(myproj_sqldbs和sqldb)里的azurerm提供者配置不一致——比如一个用了私有镜像,另一个不小心引用了官方的hashicorp/azurerm,或是用了不同的提供者别名,Terraform会判定这是两个完全不同的提供者,进而禁止跨提供者的moved操作。资源地址与配置匹配问题
检查from和to的资源地址:from是带索引的集合资源["mydb"],to是单个资源,要确保module.sqldb.azurerm_mssql_database.sql_database的配置完全对应原mydb的实体,没有核心参数(如数据库名称、所属服务器、SKU等)的差异,否则Terraform仍会判定为新资源。
解决步骤
统一提供者配置
检查两个模块的provider "azurerm"块,确保都引用了公司私有镜像的提供者,且未使用不同的别名。如果模块里用了别名,需要在moved块里显式指定provider参数:moved { from = module.myproj_sqldbs.azurerm_mssql_database.sql_database["mydb"] to = module.sqldb.azurerm_mssql_database.sql_database provider = azurerm.mycompany # 对应私有镜像的提供者别名 }验证提供者版本一致性
确认两个模块使用的azurerm提供者版本完全一致,版本差异可能导致Terraform对资源类型的判定出现偏差。手动导入辅助迁移
如果以上配置都没问题,可以先手动将原数据库导入目标模块的资源地址,再配合moved块完成关联:terraform import module.sqldb.azurerm_mssql_database.sql_database <原mydb的Azure资源ID>导入后执行
terraform plan,确认无销毁/重建提示后,再通过moved块完成状态迁移。
内容的提问来源于stack exchange,提问作者Mutation Person

