0Pricing
Terraform Infrastructure as Code · 课时

使用 moved 与 removed 重构状态

使用状态操作命令以及声明式 moved 和 removed 块,安全地重命名和重构资源,而不销毁基础设施。

使用 moved 与 removed 重构状态 是 CoddyKit 上的免费 Terraform Infrastructure as Code 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Terraform Infrastructure as Code 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Terraform Infrastructure as Code 课程共包含 4 节课。

重命名问题

当您在配置中重命名资源时,Terraform 会发现旧地址已消失,并出现了新地址。默认情况下,它会销毁并重新创建该资源,这可能导致停机或数据丢失。

状态重构工具可以让您告知 Terraform,资源只是移动了位置。

检查状态

首先列出状态中记录的内容。terraform state list 命令会显示每个受管理资源的地址。

terraform state list

命令式 state mv

传统方法是使用 terraform state mv,在状态中重写资源地址。这里,我们将实例从 aws_instance.web 重命名为 aws_instance.app。

terraform state mv aws_instance.web aws_instance.app

state mv 的缺点

state mv 是一次性的手动 CLI 操作。它不会记录在代码中,因此团队成员在自己的机器上执行相同更改时必须重复操作。在协作流程中,这很容易出错。

声明式 moved 块

moved 块会在配置中记录重命名操作。Terraform 会在下一次计划期间自动为所有人应用该操作,之后您可以移除这个块。

moved {
  from = aws_instance.web
  to   = aws_instance.app
}

移动到模块中

moved 块也可以处理将资源封装到模块中的情况。目标地址会包含模块路径。

moved {
  from = aws_instance.app
  to   = module.compute.aws_instance.app
}

使用计划进行验证

添加 moved 块后,请运行 terraform plan。正确的移动操作不会显示销毁或创建,只会显示地址变更。如果仍然看到替换操作,说明该块有误。

terraform plan

从状态中移除

有时,您希望 Terraform 停止管理某个资源,但不销毁实际基础设施。命令式命令是 terraform state rm。

terraform state rm aws_instance.legacy

声明式 removed 块

较新版本的 Terraform 支持 removed 块。配合 lifecycle { destroy = false } 使用时,它会将资源从状态中遗忘,但不会触碰实际基础设施。

removed {
  from = aws_instance.legacy

  lifecycle {
    destroy = false
  }
}

拆分状态文件

对于大型项目,terraform state mv -state-out 可以在独立的状态文件之间移动资源,这在将单体结构拆分为分别应用的堆栈时非常有用。

terraform state mv -state-out=network.tfstate \
  aws_vpc.main aws_vpc.main

备份与安全

Terraform 会在修改状态前写入一个 .backup 文件。不过,使用远程后端时,始终请先确认状态未被团队成员锁定,再执行手动操作,以免造成损坏。

快速检查

测试您对重构的了解。

回顾:安全地重构状态

现在,您可以在不销毁基础设施的情况下重构它:

  • 使用 state mv / state rm 执行命令式更改。
  • 使用 moved 块执行声明式重命名。
  • 使用 removed 块在不销毁资源的情况下将其遗忘。
  • 始终通过计划进行验证,确保其中不显示替换操作。

常见问题解答

「使用 moved 与 removed 重构状态」课时是免费的吗?

是的 — 「使用 moved 与 removed 重构状态」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Terraform Infrastructure as Code 课程的其余内容,请升级到 CoddyKit PRO。 Terraform Infrastructure as Code 课程共包含 4 节课。

「使用 moved 与 removed 重构状态」这节课中我会学到什么?

使用状态操作命令以及声明式 moved 和 removed 块,安全地重命名和重构资源,而不销毁基础设施。 你通过在浏览器中直接运行的动手代码来练习 Terraform Infrastructure as Code,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Terraform Infrastructure as Code 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Terraform Infrastructure as Code 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用 moved 与 removed 重构状态」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Terraform Infrastructure as Code 课中编写并运行代码吗?

能。每节 Terraform Infrastructure as Code 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 远程状态后端
  2. 状态锁定与一致性
  3. 导入现有资源
  4. 使用 moved 与 removed 重构状态
← 返回 Terraform Infrastructure as Code