2. Terraform 核心概念回顾:Provider、Resource、Data Source、State、Plan/Apply 工作流

在深入 Terraform 驱动变更窗口主从切换移植适配方案 之前,必须重新校准 Terraform 的五大核心概念。这些概念构成了所有基础设施即代码(IaC)操作的基石,也是后续实现主从切换、状态迁移与适配移植的逻辑基础。

2.1 核心概念全景图

下图展示了 Terraform 核心组件之间的协作关系与数据流向,帮助建立全局视角:

Terraform 核心概念协作关系图 Terraform 核心概念协作关系 Provider 云/API 适配器 Resource 基础设施对象 Data Source 只读查询 State 状态映射文件 Plan / Apply 执行计划与部署 💡 核心要点 Provider 定义能力边界 → Resource 声明期望状态 → Data Source 获取外部数据 State 记录实际映射 → Plan/Apply 驱动差异计算与变更执行

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 循环展开,这是实现基础设施变更的标准化流程。

Terraform Plan/Apply 工作流 Plan / Apply 工作流 terraform init terraform validate terraform plan terraform apply plan 审核不通过时回退 📋 工作流详解 1. init:初始化工作目录,下载 Provider 插件和模块 2. validate:检查配置文件语法和内部引用是否正确 3. plan:对比 State 与配置,生成变更执行计划(创建/修改/删除) 4. apply:执行计划中的变更,更新 State 文件

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 流程