2. Terraform 核心概念回顾:Provider、Resource、Data Source、State、Plan/Apply 工作流
在深入容灾自愈 Runbook 编排之前,必须重新夯实 Terraform 的五大核心支柱。这些概念不仅是日常 IaC 操作的基础,更是实现自动化故障转移与状态恢复的底层能力。本节通过结构化的对比与流程图,帮助你在 10 分钟内完成关键知识的校准。
2.1 五大核心概念速览
| 概念 | 角色 | 容灾自愈中的关键作用 |
|---|---|---|
| Provider | 云/服务 API 的抽象层 | 对接阿里云、AWS、Kubernetes 等目标平台,执行故障切换 API 调用 |
| Resource | 基础设施的声明式定义 | 定义 ECS、RDS、SLB 等资源,作为自愈操作的“目标对象” |
| Data Source | 只读查询外部数据 | 实时探测故障状态、获取可用区列表、拉取最新镜像 ID |
| State | 当前基础设施的快照 | 记录资源 ID 与属性,是判断“当前状态 vs 期望状态”的唯一依据 |
| Plan / Apply | 变更执行工作流 | 生成自愈操作计划,经审批或自动执行后完成故障恢复 |
SRE 视角: 在 Runbook 中,
terraform plan 的输出就是“自愈操作清单”,terraform apply 就是“执行手术”。State 文件则是“病历本”,必须远程存储并加锁。
2.2 Provider:基础设施的“驱动层”
Provider 是 Terraform 与目标平台之间的桥梁。每个 Provider 负责管理一组特定的资源类型和 API 版本。在容灾场景中,通常需要同时配置多个 Provider 来覆盖跨区域或跨云的操作。
# 多 Provider 配置示例:主区域与容灾区域
provider "alicloud" {
alias = "cn-hangzhou"
region = "cn-hangzhou"
profile = "production"
}
provider "alicloud" {
alias = "cn-shanghai"
region = "cn-shanghai"
profile = "dr-backup"
}
# 在资源中通过 provider 参数指定使用哪个区域
resource "alicloud_instance" "primary" {
provider = alicloud.cn-hangzhou
# ...
}
2.3 Resource 与 Data Source:声明与查询
- Resource:使用
resource块定义需要创建、更新或删除的基础设施对象。它是自愈动作的执行单元。 - Data Source:使用
data块查询外部信息,不产生副作用。在 Runbook 中常用于动态获取故障实例的当前状态、可用区库存或最新 AMI ID。
# Data Source:查询当前故障的 ECS 实例状态
data "alicloud_instances" "faulty" {
ids = ["i-xxxxxxxxxxxxx"]
status = "Running" # 实际 Runbook 中可能查询 Stopped 或异常状态
}
# Resource:基于查询结果执行重启操作
resource "alicloud_instance" "recovery" {
count = length(data.alicloud_instances.faulty.instances) > 0 ? 1 : 0
instance_id = data.alicloud_instances.faulty.instances[0].id
status = "Running"
# 触发重新部署
force_stop = true
}
2.4 State:自愈的“真相源”
State 文件记录了 Terraform 管理的所有资源及其当前属性。在容灾自愈中,State 的作用被放大:
- 依赖追踪:判断资源创建顺序,确保先恢复网络再恢复应用。
- 性能优化:避免每次 plan 都全量调用云 API。
- 协同锁:防止多个 Runbook 同时执行冲突操作。
关键实践: 必须将 State 文件存储在远程后端(如 OSS、S3、Consul),并启用状态锁(DynamoDB / OSS 锁)。本地 State 在分布式自愈场景下会导致“脑裂”。
2.5 Plan / Apply 工作流:自愈的执行引擎
标准工作流是 Terraform 的核心循环,在 Runbook 中表现为“检测 → 计划 → 执行 → 验证”的闭环。
2.6 核心概念关系图
下图展示了 Provider、Resource、Data Source、State 之间的依赖与数据流关系,这是理解 Runbook 编排架构的基础。
2.7 常见误区与避坑指南
误区 1: 在 Runbook 中直接硬编码资源 ID。
正确做法: 始终通过 Data Source 动态查询故障实例 ID,避免 State 与实际环境脱节。
正确做法: 始终通过 Data Source 动态查询故障实例 ID,避免 State 与实际环境脱节。
误区 2: 所有资源放在同一个 State 文件中。
正确做法: 按环境(prod/dr)或服务边界拆分 State,减少锁竞争和爆炸半径。
正确做法: 按环境(prod/dr)或服务边界拆分 State,减少锁竞争和爆炸半径。
误区 3: 忽略
正确做法: 在自愈场景中使用
terraform plan 的 -target 参数。正确做法: 在自愈场景中使用
-target 精确指定恢复资源,避免触发全局变更。
# 精确自愈:只针对故障实例执行 plan
terraform plan -target=alicloud_instance.recovery -out=recovery.tfplan
terraform apply recovery.tfplan