介绍
preview 工作根目录选择了错误环境的状态,尽管两个环境及其有效状态对象都已存在。你将建立正确的根目录与键的对应关系,并在不影响 dev 的情况下执行仅针对 preview 的变更。
你需要具备前面单元介绍的本地模块、远端 S3 状态和原生锁概念。这个独立的全新环境包含两套报告存储和两份状态;无需之前的虚拟机或个人 AWS 账户。
与认证考试的关联
| 认证 | 考试任务 | 实践内容 |
|---|---|---|
| CloudOps Engineer – Associate (SOA-C03) | 任务 3.1,技能 3.1.6 | Terraform 基础实践:通过经过审查的配置和状态变更维护基础设施,同时保留正在使用的资源。 |
实验概览

变更前识别各个环境
在这一步中,区分两个环境与同一环境的两个副本。以下每个根目录都有自己的变量和现有报告存储桶。两份有效的远端状态已存在于启用版本管理的 environment-team-state 后端中。
cd /home/labex/project/environment-states
cat dev/terraform.tfvars
cat preview/terraform.tfvars
输入中指定的名称分别为 isolated-dev-reports 和 isolated-preview-reports。根目录或变量文件不会自动隔离状态:后端存储桶和键决定 Terraform 使用哪份映射。
检查 preview 根目录选中的资源:
terraform -chdir=preview state show aws_s3_bucket.reports
它目前显示的是 dev 存储桶 ID,尽管 preview 的输入描述的是另一个存储桶。检查当前选择的后端:
cat preview/environment.s3.tfbackend
缓存的后端和文件均选择 environments/dev.tfstate。预期使用的两个键已经分别存在:
aws s3api \
list-objects-v2 \
--bucket environment-team-state \
--prefix environments/
确认 environments/dev.tfstate 和 environments/preview.tfstate 均存在。AWS View 也会显示两套报告存储;展开各自的 report.txt 对象,查看不同的原始数据。
检查不安全的 preview 计划,但不要应用:
terraform -chdir=preview plan
它尝试使 dev 的映射与 preview 输入一致,可能提出替换错误的存储桶。不要应用此计划。不同的变量值并不意味着应接管另一个环境的状态。
选择现有 preview 状态而不复制状态
在这一步中,将 preview 根目录重新绑定到它已有的有效状态。迁移将当前映射复制到另一个后端。重新配置丢弃缓存的后端选择,并初始化所请求的现有后端,不复制旧映射。
保持 dev 的文件不变。修正 preview 选择的存储桶和键:
cat > preview/environment.s3.tfbackend <<'HCL'
bucket = "environment-team-state"
key = "environments/preview.tfstate"
region = "us-east-1"
use_lockfile = true
HCL
使用 -reconfigure 初始化这个现有键。提供的连接文件仍与你的环境选择相互独立:
terraform -chdir=preview init \
-reconfigure \
-backend-config=backend-connection.hcl \
-backend-config=environment.s3.tfbackend
此处不要使用 -migrate-state 或 -force-copy。将当前选中的 dev 状态复制到 preview 的有效键,会覆盖 preview 的管理记录,而不是选择该记录。
terraform -chdir=preview state show aws_s3_bucket.reports
terraform -chdir=preview plan
预期看到 ID isolated-preview-reports 和 No changes。独立检查 dev:
terraform -chdir=dev state show aws_s3_bucket.reports
terraform -chdir=dev plan
dev 仍选择 isolated-dev-reports,同样显示 No changes。两个有效键和两份原始报告都必须完整保留;这是环境选择,不是损坏状态恢复。
证明 preview 变更仅影响 preview
在这一步中,建立正确绑定后,仅更改 preview 的修订值。terraform.tfvars 为该根目录声明的变量提供值;不同环境可以保持相同的源配置和资源地址。
cat > preview/terraform.tfvars <<'HCL'
bucket_name = "isolated-preview-reports"
environment = "preview"
revision = "two"
HCL
审查 preview 计划:
terraform -chdir=preview plan -out=preview.tfplan
预期看到 0 to add, 1 to change, 0 to destroy,仅影响 preview 的修订标签。从同一个根目录应用已保存的计划:
terraform -chdir=preview apply preview.tfplan
检查各环境的当前标签:
aws s3api \
get-bucket-tagging \
--bucket isolated-preview-reports
preview 应具有 Environment=preview 和 Revision=two。
aws s3api \
get-bucket-tagging \
--bucket isolated-dev-reports
dev 应仍具有 Environment=dev 和 Revision=one。读取两份原始报告:
aws s3 \
cp s3://isolated-preview-reports/report.txt -
aws s3 \
cp s3://isolated-dev-reports/report.txt -
预期看到 preview daily report 和 dev daily report。后台检查还会比较 dev 的原始状态字节、两个对象版本,以及两个后端键中的资源映射。
terraform -chdir=preview plan
terraform -chdir=dev plan
两个根目录都应显示 No changes。为各自所有者保留两套报告存储及其后端。目录名称、for_each 键和 Terraform 变量不能替代显式的状态隔离;dev 的另一个工作副本应有意选择相同的 dev 键,而 preview 必须选择自己的键。
总结
你区分了工作副本与环境,通过重新配置后端选择了已有状态,并证明仅针对 preview 的更新保持了 dev 的资源、数据和状态不变。



