是否可在Terraform Schema迁移中实现资源重命名(terraform state mv)
Terraform资源重命名纳入Schema迁移流程的方案说明
核心结论:无法通过实现StateUpgraders属性完成foo -> fooo这类跨资源标识的重命名迁移,不需要手动执行terraform state mv的自动化方案是存在的。
为什么StateUpgraders做不到资源重命名
StateUpgraders从设计上就只负责单资源内部的Schema结构升级:
- 它和具体资源类型强绑定,只有当Terraform在状态文件里读到当前资源类型地址下存的旧版本Schema数据时才会触发
- 它的升级逻辑只能修改该资源自身的参数结构,没有权限改动资源在状态里的地址标识,更没法把A资源地址下的状态数据挪到B资源的地址下
- 如果你直接把旧的
foo资源从Provider代码里删掉、换成新的fooo资源,Terraform读状态的时候会直接把foo判定为待删除的残留资源,把配置里的fooo判定为待新建资源,根本不会触发fooo上挂的StateUpgraders——毕竟状态里根本就没有fooo类型的条目。
可行的自动化迁移方案
两种方案都不需要手动敲terraform state mv命令:
- 配置层
moved块(官方首推,适配绝大多数场景)
直接在Terraform配置代码里写moved块声明新旧地址的映射关系就行,Terraform跑plan/apply的时候会自动完成状态里的地址迁移,整个过程会在plan输出里明确提示,不会意外重建资源,还能跟着配置一起做版本管理:moved { from = foo.example to = fooo.example } - Provider内置资源别名(仅适用于Provider开发者做自有资源更名)
如果你是Provider的维护者,想让用户升级Provider版本的时候自动完成资源更名,不需要用户自己写moved块,需要用满足版本要求的Terraform Plugin开发套件声明资源的历史别名,对接Terraform核心的资源移动协议做自动映射,旧版SDK里的StateUpgraders不支持这个能力。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

