将现有资源纳入管理

AWSBeginner
立即练习

介绍

你正在接手一个正常使用中的报告存储桶,它是在 Terraform 之外创建的。你需要将其纳入管理,不能重新创建存储桶或重写其中的报告。随后,审查并应用一项小幅配置调整,同时保持财务团队的相邻存储不变。

你应已了解 Terraform 配置、资源地址、init、plan、apply 和本地状态,以及基本的 S3 对象操作。此全新环境已准备好 Terraform、AWS Provider、访问配置和两个独立的报告存储桶。无需个人 AWS 账户,也不依赖之前实验中的资源。

与认证考试的关联

认证 考试任务 实践内容
CloudOps Engineer – Associate (SOA-C03) 任务 3.1,技能 3.1.6 Terraform 基础实践:接管现有存储,审查并应用一项不会造成破坏的受管理变更。

实验概览

概念图:import 通过状态将 aws_s3_bucket.reports 映射到现有 S3 存储桶,同时保留原始报告。

检查现有存储和期望配置

在这一步中,比较 AWS 中已存在的资源与你即将管理的配置。Terminal 上方的 AWS View 显示与你通过 CLI 读取的相同 S3 资源。展开 handover-daily-reports 卡片中的 report.txt,查看报告数据;finance-reference-reports 属于另一个团队,必须保持不变。

Terraform 资源地址(例如 aws_s3_bucket.reports)标识一个配置块。存储桶名称标识远端的 AWS 资源。状态记录这两种标识之间的映射。仅有配置文件并不会建立该映射。

进入已准备好的根目录,阅读期望的存储桶配置:

cd /home/labex/project/report-storage
cat main.tf

bucket 参数选择 handover-daily-reports。Owner 必须保持为 reporting;新增的 ManagedBy 标签将记录此次交接。force_destroy = false 可防止 Terraform 在之后执行销毁时自动清空非空存储桶。这是 Terraform 的行为设置,与存储桶中保存的报告相互独立。

检查现有标签:

aws s3api \
  get-bucket-tagging \
  --bucket handover-daily-reports

最初只有 Owner=reporting。将 - 作为目标位置,把原始报告读取到标准输出:

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

预期报告内容:

Daily sales: 120 orders

初始化工作目录。init 为此根目录安装固定版本的 Provider;它不会导入或创建存储桶:

terraform init

查看计划执行的操作,但不要应用:

terraform plan

计划显示 1 to add,因为此根目录尚无受管理资源的映射。存储桶已经存在;这说明状态中缺少管理映射,并不意味着可以替换该存储。不要应用这个创建计划。 下一步将显式建立映射。

继续之前,请手动确认你能识别报告存储桶、读取其中的报告,并将它与财务存储区分开来。本检查步骤的后台检查会验证预置资源是否保持不变,不会判断你是否理解了所显示的计划。

导入现有存储桶并审查差异

在这一步中,将现有存储桶映射到预期的 Terraform 地址。CLI 的 import 会读取远端资源,并在状态中记录其标识。它不会生成期望配置,也不会导入存储桶中的每个对象。

执行导入时,先指定配置地址,再指定现有存储桶名称:

terraform import aws_s3_bucket.reports handover-daily-reports

留意 Import successful!。验证现在哪个地址已纳入管理:

terraform state list

预期地址:

aws_s3_bucket.reports

读取其属性:

terraform state show aws_s3_bucket.reports

id 和 bucket 都应指向 handover-daily-reports。report.txt 仍存储在 S3 中;导入存储桶不会将该对象纳入独立的 aws_s3_object 地址进行管理。财务存储桶不得出现在此根目录的状态中。

导入并不保证马上得到没有变更的计划。一些设置来自远端服务;另一些设置(包括 force_destroy)描述 Terraform 自身的行为,导入后可能需要与配置对齐。这类差异不表示报告已损坏。

保存一个计划以供审查。-out=handover.tfplan 保存计划操作,使下一步可以应用同一份已审查的计划:

terraform plan -out=handover.tfplan

读取已保存的计划:

terraform show handover.tfplan

预期看到就地更新(~)、新增 ManagedBy=Terraform 标签,以及可能需要将 force_destroy 调整为 false。摘要必须为:

Plan: 0 to add, 1 to change, 0 to destroy.

如果计划提出删除、替换、创建、使用不同的存储桶名称,或更改财务存储,请停止并检查根目录、资源地址和导入 ID。不要通过删除现有报告来解决意外的计划。

应用配置调整并确认资源保留

在这一步中,仅应用你已审查的计划,并证明原始报告得以保留。向 apply 提供已保存的计划会直接执行该计划,不会再次提示批准。只有确认上一步摘要中的创建数和销毁数均为零后,才能运行:

terraform apply handover.tfplan

预期看到 Resources: 0 added, 1 changed, 0 destroyed.。存储桶现已纳入管理,交接标签也已与配置一致。

读取当前标签,验证 AWS 中的结果:

aws s3api \
  get-bucket-tagging \
  --bucket handover-daily-reports

应同时存在 Owner=reporting 和 ManagedBy=Terraform;标签顺序不重要。

再次读取报告:

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

报告必须仍包含 Daily sales: 120 orders。在 AWS View 中,展开两份报告,确认报告内容和财务参考报告仍可访问。调整标签不需要新建存储桶或重写对象。

实际 AWS View 检查点:交接后,报告存储桶保留了原始报告,相邻的财务存储桶仍然存在。存储桶名称和报告文本为本实验提供的示例。

检查当前配置、状态与刷新后的 AWS 资源是否收敛:

terraform plan

预期结果:

No changes. Your infrastructure matches the configuration.

仅凭没有变更的计划不足以证明交接安全:你还检查了预期资源地址和原始数据;后台检查则会比较原始对象版本和相邻存储,并在一次性副本中对当前配置生成计划,以确认已收敛。此次交接需保留两个存储桶。不要运行 terraform destroy:报告仍在使用中。在实际交接中,应将状态作为敏感运维数据加以保护,并为下一位维护者安排访问权限;不要将状态或包含敏感值的已保存计划提交到公共仓库。

如需更多背景信息,请参阅 HashiCorp 的 CLI 导入工作流。

总结

你比较了现有存储桶与 Terraform 配置,将其标识导入到预期的状态地址,并在应用前审查了一项不会造成破坏的配置调整。你确认了计划没有变更,同时保留了原始报告和财务存储。导入负责建立管理关系;配置审查则决定 Terraform 接下来应更改哪些内容。