Terraform中moved块遇unresolved reference错误的解决咨询
解决Terraform中moved块引用已删除资源名称的问题
当你修改了资源的本地名称后,直接在moved块中引用旧名称会报错,因为当前配置里已经不存在该资源定义了。这时候可以通过字符串形式的资源绝对地址来指定状态中的旧资源,而不是直接引用配置中的资源。
正确的moved块写法
将from字段改为字符串格式的旧资源地址:
moved { from = "aws_api_gateway_rest_api.test-api" to = aws_api_gateway_rest_api.prod-api }
或者两边都用字符串地址也可以:
moved { from = "aws_api_gateway_rest_api.test-api" to = "aws_api_gateway_rest_api.prod-api" }
后续操作步骤
- 保存修改后的配置文件
- 运行
terraform plan,此时Terraform会识别到需要将状态中aws_api_gateway_rest_api.test-api的记录重命名为aws_api_gateway_rest_api.prod-api,不会提示销毁旧资源或创建新资源 - 确认计划无误后执行
terraform apply,状态文件中的资源名称会被更新 - 操作完成后,你可以选择保留或删除这个moved块,后续Terraform执行不会受影响
原理说明
Terraform的moved块支持接受字符串格式的资源绝对地址,这个地址直接对应状态文件中存储的资源路径。即使当前配置里没有旧资源的定义,Terraform依然能通过这个地址找到状态中已存在的旧资源记录,从而完成重命名操作,避免不必要的资源销毁重建。
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

