2. Terraform 基础回顾:Provider、Resource、Data Source、State 文件的核心概念

在深入制品供应链误差预算台账的编排之前,必须重新校准 Terraform 的四个核心支柱:Provider、Resource、Data Source 和 State 文件。这四个概念构成了所有基础设施即代码(IaC)操作的底层契约,也是后续构建复杂台账系统的语法基础。

2.1 Provider:基础设施的驱动适配器

Provider 是 Terraform 与外部 API 之间的桥梁。每个 Provider 负责将 Terraform 的通用声明式语言翻译成特定平台(如 AWS、Azure、Kubernetes、GitHub)的 API 调用。没有 Provider,Terraform 就无法与任何真实基础设施交互。

Provider 属性 说明 典型示例
来源 从 Terraform Registry 或私有镜像拉取 hashicorp/aws、integrations/github
版本约束 通过 required_providers 锁定主版本 ~> 5.0 表示允许 5.x 但不允许 6.0
配置块 定义认证方式、区域、端点等全局参数 region = "us-east-1"
别名 同一 Provider 多份配置(多区域/多账号) provider "aws" { alias = "west" }
📌 台账场景关联: 在误差预算台账编排中,通常需要同时配置 GitHub Provider(管理制品仓库与 Release)和 Kubernetes Provider(管理台账服务的部署与 ConfigMap),通过 Provider 别名实现多集群、多环境的统一管理。

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

Resource 是 Terraform 中最核心的声明式对象。它描述了一个“应该存在”的基础设施组件——一台虚拟机、一个 DNS 记录、一个 IAM 策略、一个 GitHub 分支保护规则。Terraform 通过对比 State 文件中的当前状态与配置中的期望状态,决定是创建、更新还是删除该资源。

# 声明一个 AWS S3 存储桶作为台账制品存储
resource "aws_s3_bucket" "budget_artifacts" {
  bucket = "sre-budget-artifacts-prod"
  tags = {
    Environment = "production"
    ManagedBy   = "terraform"
  }
}

# 声明一个 GitHub 仓库分支保护规则
resource "github_branch_protection" "main" {
  repository_id = github_repository.budget_repo.node_id
  pattern       = "main"

  required_status_checks {
    strict = true
    contexts = ["ci/pipeline-pass"]
  }
}

Resource 的关键行为特征:

  • 幂等性:多次 apply 产生相同结果,除非外部手动修改。
  • 依赖图:通过隐式引用(resource.attribute)或 depends_on 显式声明执行顺序。
  • 生命周期:支持 create_before_destroy、prevent_destroy 等元参数控制更新策略。

2.3 Data Source:基础设施的只读查询器

Data Source 用于从已有基础设施中读取信息,而不创建或修改任何资源。它解决了“如何获取现有资源的属性”这一核心问题,是构建动态配置的关键工具。

对比维度 Resource Data Source
副作用 创建/更新/删除基础设施 纯读取,无副作用
State 记录 写入 State 文件 通常不持久化(仅缓存于内存)
典型用途 部署新资源 查询现有 VPC ID、AMI ID、K8s 集群端点
声明方式 resource "type" "name" {} data "type" "name" {}
# 查询现有 AWS VPC 信息,用于后续资源部署
data "aws_vpc" "selected" {
  tags = {
    Name = "production-vpc"
  }
}

# 在台账服务中使用查询到的 VPC ID
resource "aws_security_group" "budget_sg" {
  name   = "budget-service-sg"
  vpc_id = data.aws_vpc.selected.id
}
💡 台账最佳实践: 使用 Data Source 查询制品供应链中已有的 CI/CD 流水线 ID、Kubernetes 命名空间 UID 或监控告警端点,避免硬编码,使台账配置随基础设施自动适配。

2.4 State 文件:基础设施的真实性快照

State 文件是 Terraform 的核心状态数据库,记录了所有被管理资源的当前属性、依赖关系和元数据。它既是 Terraform 判断“做什么”的依据,也是团队协作时防止冲突的锁机制。

Terraform State 文件生命周期与核心作用 Terraform Core 声明式配置解析 State 文件 terraform.tfstate 资源 ID / 属性 / 依赖 / 元数据 真实基础设施 AWS / K8s / GitHub API 读取/写入 驱动 API 调用 🔍 功能一:映射 将配置中的逻辑名称 映射到真实资源 ID 📊 功能二:差异分析 对比期望配置与当前状态 生成精确的变更计划 🔒 功能三:锁与并发 通过 State 锁防止 多人同时执行冲突 State 存储后端:本地 / S3 + DynamoDB / Terraform Cloud / Consul 生产环境必须使用远程后端 + 状态锁
⚠️ 常见陷阱: State 文件包含敏感信息(如数据库密码、证书指纹)。严禁将 State 文件提交到 Git 仓库。始终使用远程后端(如 AWS S3 + DynamoDB 锁)并启用加密,同时通过 .gitignore 排除本地 *.tfstate 文件。

2.5 四者协作关系总结

Provider、Resource、Data Source 和 State 文件在 Terraform 执行流程中形成闭环:

  1. 初始化阶段:Terraform 根据 required_providers 下载并加载 Provider 插件。
  2. 读取阶段:从远程后端拉取 State 文件,同时执行所有 Data Source 查询真实基础设施的当前状态。
  3. 计划阶段:对比 State 中的资源属性与 .tf 文件中的期望属性,生成变更计划。
  4. 应用阶段:通过 Provider 调用目标 API 执行创建、更新或删除操作,并将结果写回 State 文件。
组件 角色 在台账编排中的典型用途
Provider API 适配器 对接 GitHub(制品版本)、K8s(台账部署)、Datadog(误差监控)
Resource 声明式创建单元 创建 S3 存储桶、GitHub 分支规则、K8s ConfigMap 台账配置
Data Source 只读查询 获取现有 VPC、K8s 集群 CA 证书、制品仓库 ID
State 文件 真实状态快照 记录台账资源 ID、版本映射、依赖关系,支持增量变更
🎯 课程衔接: 在后续章节中,我们将基于这四个核心概念构建“误差预算台账资源编排”。Provider 负责连接制品供应链各环节,Resource 定义台账的存储与展示单元,Data Source 动态拉取实时误差数据,State 文件确保每次变更可追溯、可回滚。理解本节内容是掌握整个课程的基础。