重命名资源而不重新创建

AWSBeginner
立即练习

介绍

采用更清晰的配置名称,不应要求重新创建正在使用的存储。你将重命名一个受管理报告存储桶的 Terraform 地址,审查不安全的直接重命名与显式声明迁移之间的区别,并保留其原始数据。

你需要具备上一个引导实验所教的 Terraform 导入、状态和计划经验,或具有同等实践经验。此全新环境独立提供受管理的报告和财务参考报告。使用 Terminal 操作 Terraform,使用 AWS View 查看现有报告;无需个人 AWS 账户。

与认证考试的关联

认证 考试任务 实践内容
CloudOps Engineer – Associate (SOA-C03) 任务 3.1,技能 3.1.6 Terraform 基础实践:通过经过审查的配置和状态变更维护基础设施,同时保留正在使用的资源。

实验概览

概念图:维护任务保留配置、状态与现有报告存储之间的关系。

比较逻辑地址与远端资源标识

在这一步中,先检查一个正常工作的 Terraform 根目录,再重命名其中的资源。本实验已独立准备好该根目录和两份启用版本管理的报告。报告存储桶在此根目录中管理;财务存储不属于此根目录的管理范围。

cd /home/labex/project/report-refactor
terraform state list

原地址为 aws_s3_bucket.reports。读取其远端 ID:

terraform state show aws_s3_bucket.reports

id = "rename-daily-reports" 标识现有的 AWS 存储桶。重命名 Terraform 块会更改其逻辑地址,而不会更改此存储桶名称。

阅读提供的配置,确认没有待执行的变更,以此建立基线:

cat main.tf
terraform plan

预期看到 No changes。在 AWS View 中,展开 rename-daily-reports 中的报告;保持 rename-finance-reference 不变。在 Terminal 中读取相同的报告字节:

aws s3 \
  cp s3://rename-daily-reports/report.txt -

预期看到 Daily sales: 120 orders。目标是更改管理此存储的地址,同时保留存储的标识和原始对象版本。

使用 moved 块描述重命名

在这一步中,观察为什么直接重命名地址会导致破坏性计划,再告知 Terraform 新地址指向同一个资源。

here-document 将 HCL 标记之间的配置写入 main.tf;> 替换该文件。仅将本地块标签改为 report_archive,保持远端存储桶名称和属性不变:

cat > main.tf <<'HCL'
resource "aws_s3_bucket" "report_archive" {
  bucket        = "rename-daily-reports"
  force_destroy = false
  tags = { Owner = "reporting" }
}
HCL

在执行任何 apply 操作之前检查结果:

terraform plan

没有地址关系时,Terraform 会认为旧地址已不在配置中,而新地址没有对应状态。预期看到 1 to add, 0 to change, 1 to destroy。不要应用此计划,也不要删除报告来让销毁得以进行。

moved 块声明旧地址到新地址的关系。这记录的是一次配置重构,与更改 AWS 存储桶名称不同。将声明放在单独的 .tf 文件中;Terraform 会一起读取此根目录中的所有 .tf 文件:

cat > moved.tf <<'HCL'
moved {
  from = aws_s3_bucket.reports
  to   = aws_s3_bucket.report_archive
}
HCL

保存并检查修正后的计划:

terraform plan -out=rename.tfplan

预期看到 aws_s3_bucket.reports has moved to aws_s3_bucket.report_archive 和 0 to add, 0 to change, 0 to destroy。计划中的状态地址会改变,但 AWS 资源无需重新创建。将声明与配置一起保留,使较旧的状态副本也能识别此次重构。

应用地址迁移并保留报告

在这一步中,应用已保存的安全计划,并确认仅逻辑地址发生变化。已保存的计划执行时不会再次提示批准,因此应先确认摘要中的创建数和销毁数均为零。

terraform apply rename.tfplan

资源摘要应显示 0 added, 0 changed, 0 destroyed。检查执行后的映射:

terraform state list
terraform state show aws_s3_bucket.report_archive

列表中只有新地址,其存储桶 ID 仍为 rename-daily-reports。检查实际报告:

aws s3 \
  cp s3://rename-daily-reports/report.txt -

原始文本仍为 Daily sales: 120 orders。AWS View 仍显示相同的报告存储桶和财务存储桶;逻辑重命名不应产生新的资源卡片。

terraform plan

预期看到 No changes。独立检查还会比较原始 VersionId 和相邻存储,并在一次性副本中为当前配置生成计划。为下一位维护者完整保留这两份正在使用的报告。

有关保留 moved 声明在模块演进中的作用,请参阅 HashiCorp 的资源重构文档。

总结

你区分了 Terraform 地址与 AWS 资源 ID,拒绝了破坏性的直接重命名计划,并应用 moved 声明完成迁移,没有重新创建存储桶或报告。