介绍
采用更清晰的配置名称,不应要求重新创建正在使用的存储。你将重命名一个受管理报告存储桶的 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 声明完成迁移,没有重新创建存储桶或报告。



