2. Terraform 核心概念回顾:Provider、Resource、Data Source、State、Plan 与 Apply

在开始编写事故响应值班机器人的基础设施之前,必须牢固掌握 Terraform 的六大核心概念。它们是整个 IaC 工作流的基石,理解这些概念将帮助你更高效地构建、管理和演进云基础设施。

2.1 Provider:基础设施的驱动引擎

Provider 是 Terraform 与目标 API 之间的桥梁。它负责将 Terraform 的声明式配置翻译为特定云平台(如 AWS、Azure、GCP)或服务(如 Kubernetes、GitHub)的 API 调用。每个 Provider 都定义了一组可用的 Resource 和 Data Source。

关键点:Provider 本身也是插件,通过 terraform init 自动下载。版本锁定是生产环境的最佳实践。
# 定义 AWS Provider,锁定版本并指定区域
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-west-2"
}

2.2 Resource:基础设施的原子单元

Resource 是 Terraform 配置中最核心的要素,它代表一个真实的基础设施对象,例如一台 EC2 实例、一个 S3 存储桶、一个 Kubernetes Pod 或一个 PagerDuty 服务。每个 Resource 块使用 resource "provider_type" "local_name" 语法声明。

组件 说明 示例
Provider Type 由 Provider 定义的资源类型 aws_instance, pagerduty_service
Local Name 在配置文件中使用的唯一标识符 web_server, incident_service
Arguments 定义资源的具体配置参数 ami, instance_type
Attributes 资源创建后由 Provider 返回的只读属性 id, public_ip
# 创建一个 PagerDuty 服务资源,用于值班机器人
resource "pagerduty_service" "oncall_service" {
  name                    = "值班机器人监控服务"
  auto_resolve_timeout    = 14400
  acknowledgement_timeout = 600
  escalation_policy       = pagerduty_escalation_policy.primary.id
}

2.3 Data Source:读取外部基础设施信息

Data Source 允许 Terraform 读取由 Provider 管理或外部定义的基础设施信息,而无需创建或管理这些资源。它常用于获取现有 VPC ID、最新的 AMI 镜像、或从外部系统读取配置。

最佳实践:使用 Data Source 替代硬编码值,使配置更动态、更可移植。例如,通过 Data Source 获取当前 AWS 账号 ID 或可用区列表。
# 获取最新的 Ubuntu 22.04 AMI ID
data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
  }
  owners = ["099720109477"] # Canonical
}

# 引用 Data Source 的属性
resource "aws_instance" "app_server" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
}

2.4 State:基础设施的真实映射

State 文件(terraform.tfstate)是 Terraform 的核心组件,它记录了已管理资源及其属性的真实映射。State 是 Terraform 判断“当前状态”与“期望状态”差异的唯一依据。

⚠️ 重要:State 文件包含敏感信息(如密码、密钥),必须安全存储。团队协作时,必须使用远程 State 后端(如 S3 + DynamoDB、Terraform Cloud)。
Terraform State 工作流 Terraform 配置 期望状态 (.tf) Terraform Plan 差异对比 Terraform Apply 执行变更 State 文件 真实映射 State 的核心作用: • 将真实世界资源映射到配置 • 计算增量变更(Plan) • 支持资源依赖解析与销毁顺序

2.5 Plan:安全预览变更

Plan 阶段执行 terraform plan 命令,它会读取当前 State 并与配置进行对比,生成一份详细的执行计划。Plan 不会对基础设施做任何实际更改,它只展示“将要创建、更新或删除哪些资源”。

  • 创建(+):资源存在于配置中,但不在 State 中。
  • 更新(~):资源同时存在于配置和 State 中,但属性有差异。
  • 删除(-):资源存在于 State 中,但已从配置中移除。
  • 替换(-/+):资源因不可变属性变更而需要重建。
生产建议:在 CI/CD 流水线中,始终将 terraform plan 作为人工审核步骤。Plan 输出应保存为制品,供团队审查。

2.6 Apply:执行变更并更新 State

Apply 阶段执行 terraform apply 命令,它根据 Plan 的结果对基础设施执行实际的创建、更新或删除操作。Apply 完成后,Terraform 会自动更新 State 文件,使其与真实基础设施保持一致。

阶段 命令 是否修改基础设施 是否更新 State 典型用途
Plan terraform plan ❌ 否 ❌ 否 预览变更、CI 审核
Apply terraform apply ✅ 是 ✅ 是 部署、变更执行
Destroy terraform destroy ✅ 是(删除) ✅ 是 清理环境
# 标准工作流
terraform init          # 初始化 Provider 和模块
terraform plan -out=tfplan  # 生成计划并保存
terraform apply tfplan  # 执行计划

# 快速模式(仅用于开发环境)
terraform apply -auto-approve

2.7 核心概念关系图

下图展示了 Provider、Resource、Data Source、State、Plan 和 Apply 之间的完整协作关系,帮助你建立全局视角。

Terraform 核心概念协作架构 Provider 层(插件生态) AWS Provider PagerDuty Provider Kubernetes Provider ... 配置层(.tf 文件) Resource 声明 Data Source 声明 变量/输出/模块 Terraform 核心引擎 terraform plan terraform apply terraform destroy terraform init State 层(terraform.tfstate) 本地文件 / 远程后端(S3 + DynamoDB / Terraform Cloud)
学习路径提示:在后续章节中,我们将基于这些核心概念,逐步构建值班机器人的完整基础设施。你将看到 Provider 如何连接 PagerDuty 和 AWS,Resource 如何定义服务与告警规则,Data Source 如何读取团队信息,以及 State 如何保障团队协作的一致性。