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 判断“做什么”的依据,也是团队协作时防止冲突的锁机制。
⚠️ 常见陷阱: State 文件包含敏感信息(如数据库密码、证书指纹)。严禁将 State 文件提交到 Git 仓库。始终使用远程后端(如 AWS S3 + DynamoDB 锁)并启用加密,同时通过
.gitignore 排除本地 *.tfstate 文件。
2.5 四者协作关系总结
Provider、Resource、Data Source 和 State 文件在 Terraform 执行流程中形成闭环:
- 初始化阶段:Terraform 根据
required_providers下载并加载 Provider 插件。 - 读取阶段:从远程后端拉取 State 文件,同时执行所有 Data Source 查询真实基础设施的当前状态。
- 计划阶段:对比 State 中的资源属性与
.tf文件中的期望属性,生成变更计划。 - 应用阶段:通过 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 文件确保每次变更可追溯、可回滚。理解本节内容是掌握整个课程的基础。