2. Terraform 核心概念回顾:Provider、Resource、Data Source、State、Plan/Apply 工作流
在深入 Terraform 驱动变更窗口主从切换移植适配方案 之前,必须重新校准 Terraform 的五大核心概念。这些概念构成了所有基础设施即代码(IaC)操作的基石,也是后续实现主从切换、状态迁移与适配移植的逻辑基础。
2.1 核心概念全景图
下图展示了 Terraform 核心组件之间的协作关系与数据流向,帮助建立全局视角:
2.2 Provider:基础设施适配器
Provider 是 Terraform 与目标平台(云服务商、Kubernetes、数据库、DNS 等)之间的桥梁。每个 Provider 负责暴露一组 Resource 和 Data Source,并封装 API 认证、请求重试、错误处理等细节。
| 属性 | 说明 | 示例 |
|---|---|---|
| 来源 | 官方或社区维护,通过 Terraform Registry 分发 | hashicorp/aws, hashicorp/kubernetes |
| 版本约束 | 使用 required_providers 锁定版本 |
version = "~> 5.0" |
| 配置块 | 定义 endpoint、region、认证凭据等 | provider "aws" { region = "cn-north-1" } |
| 别名 | 支持多区域/多账号配置 | provider "aws" { alias = "west" } |
🔑 主从切换场景要点: 在适配移植方案中,Provider 配置需要支持 多目标环境切换。例如,主库使用 provider "mysql" { alias = "primary" },从库使用 provider "mysql" { alias = "standby" },通过变量控制激活哪个 Provider 别名。
2.3 Resource:基础设施的声明式定义
Resource 是 Terraform 中最核心的构建块,用于声明一个基础设施对象(如虚拟机、数据库实例、DNS 记录)的期望状态。Terraform 负责将实际状态收敛到声明状态。
# 声明一个 AWS EC2 实例
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "WebServer"
}
}
Resource 的关键属性包括:
- 资源类型:
aws_instance、kubernetes_deployment、mysql_database等 - 本地名称:
web_server,用于模块内引用 - 参数:根据资源类型定义的具体配置项
- 元参数:
count、for_each、depends_on、lifecycle等
💡 最佳实践: 使用 lifecycle { prevent_destroy = true } 保护关键资源(如主数据库),避免误删除导致数据丢失。
2.4 Data Source:只读的外部数据查询
Data Source 用于从 Provider 中读取已有资源的信息,而不创建或管理任何资源。它常用于获取动态数据(如最新 AMI ID、现有 VPC 信息、Kubernetes 集群证书)。
# 查询最新的 Ubuntu AMI
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
}
# 引用 Data Source 属性
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
}
| 对比维度 | Resource | Data Source |
|---|---|---|
| 生命周期 | 创建、更新、删除 | 只读查询,无状态变更 |
| State 影响 | 写入 State 文件 | 通常不写入 State(除非使用 depends_on) |
| 典型用途 | 管理基础设施 | 获取配置参数、动态查找 |
| 主从切换角色 | 管理主/从实例 | 查询当前主库 IP、复制状态 |
2.5 State:基础设施的真实映射
State 文件是 Terraform 的核心状态数据库,记录了所有被管理资源的 实际属性 与 Terraform 配置之间的映射关系。State 的存在使得 Terraform 能够:
- 计算增量变更(而非全量重建)
- 支持资源依赖解析
- 实现团队协作(远程 State + 锁)
⚠️ 主从切换关键风险: State 文件必须与真实基础设施严格一致。在切换过程中,如果 State 与真实环境出现偏差(例如手动修改了数据库角色),会导致 terraform plan 产生错误的差异计算,甚至触发非预期的资源重建。建议在切换前执行 terraform refresh 同步 State。
State 存储方式对比:
| 存储后端 | 适用场景 | 锁机制 | 主从切换适配 |
|---|---|---|---|
| 本地文件 | 个人开发/测试 | 无 | 不推荐 |
| S3 + DynamoDB | 团队协作、生产环境 | DynamoDB 锁 | 需确保切换期间锁超时配置合理 |
| Consul | 动态基础设施 | Session 锁 | 适合频繁切换场景 |
| Terraform Cloud | 企业级管理 | 内置锁 | 支持运行环境隔离 |
2.6 Plan / Apply 工作流:变更驱动引擎
Terraform 的核心工作流围绕 Plan → Apply 循环展开,这是实现基础设施变更的标准化流程。
Plan 输出示例(关键字段说明):
# terraform plan 输出片段
Terraform will perform the following actions:
# aws_instance.web_server will be updated in-place
~ resource "aws_instance" "web_server" {
id = "i-0abcd1234efgh5678"
~ instance_type = "t3.micro" -> "t3.small"
tags = {
"Name" = "WebServer"
}
}
# aws_db_instance.primary will be destroyed
- resource "aws_db_instance" "primary" {
id = "db-ABCDEFGHIJKLMNOPQ"
# ... 删除所有属性
}
# aws_db_instance.standby will be created
+ resource "aws_db_instance" "standby" {
id = (known after apply)
# ... 创建新属性
}
Plan: 1 to add, 1 to change, 1 to destroy.
🔑 主从切换工作流适配: 在变更窗口内执行主从切换时,Plan/Apply 工作流需要增加 人工审核节点。建议流程为:plan → 人工确认切换计划 → apply -auto-approve(窗口内快速执行)→ 验证 → terraform state list 确认状态一致性。避免在切换窗口外执行 apply 导致意外变更。
2.7 概念关系总结
| 概念 | 角色 | 与主从切换的关联 |
|---|---|---|
| Provider | 平台适配层 | 多别名配置支持主/从环境隔离 |
| Resource | 期望状态声明 | 主库/从库分别声明,通过变量控制激活 |
| Data Source | 外部数据查询 | 获取复制延迟、主库角色状态等运行时信息 |
| State | 真实映射记录 | 切换前后必须保持 State 与真实环境一致 |
| Plan/Apply | 变更执行引擎 | 切换窗口内执行受控的 Plan → Apply 流程 |