为每个环境使用独立状态

AWSBeginner
立即练习

介绍

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 的资源、数据和状态不变。