Terraform 核心概念回顾
Terraform 是 HashiCorp 推出的基础设施即代码(IaC)工具,通过声明式配置管理云资源和本地服务。在 SLI 口径配置变更场景中,Terraform 负责将 SLI 口径(如 Prometheus 记录规则、Grafana 面板 JSON、自定义告警阈值)以代码形式管理,并通过 CI/CD 管道实现版本化发布。本节回顾 Terraform 的三大核心概念:Provider、Resource、Data Source,以及状态管理和标准工作流。
Provider:基础设施的驱动层
Provider 是 Terraform 与目标平台(云服务商、监控系统、API 网关等)交互的插件。每个 Provider 负责定义资源类型、认证方式和 API 调用逻辑。在 SLI 配置管理中,常见的 Provider 包括:
| Provider | 用途 | SLI 场景示例 |
|---|---|---|
| prometheus | 管理 Prometheus 记录规则、告警规则 | 定义 sli_error_budget_burn_rate 记录规则 |
| grafana | 管理 Grafana 仪表盘、数据源、通知渠道 | 部署 SLI 实时监控面板 |
| kubernetes | 管理 ConfigMap、Deployment 等 K8s 资源 | 注入 SLI 口径配置到服务网格 |
| http / restapi | 调用自定义 API 管理口径配置 | 向内部 SLI 注册中心推送口径版本 |
最佳实践:Provider 版本应锁定在
required_providers 块中,避免 CI/CD 管道因 Provider 升级导致配置漂移。使用 ~> x.y 约束允许补丁版本升级,但阻止主版本或次版本自动变更。
Resource 与 Data Source:配置的读写单元
Resource 是 Terraform 管理的核心对象,代表“我要创建或管理什么”。每个 Resource 对应目标平台上的一个具体实体,例如一条 Prometheus 记录规则、一个 Grafana 仪表盘。
Data Source 用于读取外部已有数据,不创建或修改任何资源。在 SLI 场景中,Data Source 常用于获取当前生效的口径配置、查询集群状态或读取 Secret 中的认证信息。
# Resource 示例:创建 Prometheus 记录规则
resource "prometheus_rule_group" "sli_burn_rate" {
name = "sli-burn-rate"
interval = "30s"
rule {
record = "sli:error_budget_burn_rate:5m"
expr = "rate(sli_errors_total[5m]) / rate(sli_total[5m])"
}
}
# Data Source 示例:读取已有 Grafana 文件夹
data "grafana_folder" "sli_dashboard_folder" {
title = "SLI Dashboards"
}
# 使用 Data Source 的 ID 创建仪表盘
resource "grafana_dashboard" "sli_overview" {
folder_id = data.grafana_folder.sli_dashboard_folder.id
config_json = file("${path.module}/dashboards/sli_overview.json")
}
关键区别:Resource 会写入状态文件并产生实际变更;Data Source 仅读取,不改变状态。在 CI/CD 中,Data Source 常用于“先读取当前配置,再决定是否更新”,避免覆盖手动调整的临时参数。
状态管理:配置的真相来源
Terraform 状态文件(terraform.tfstate)记录了所有被管理资源的当前实际属性。它是 Terraform 判断“需要创建、更新还是删除”的唯一依据。在 SLI 口径配置变更中,状态管理尤为重要:
- 远程状态存储:团队协作时必须使用后端(如 S3、GCS、Terraform Cloud)存储状态,避免本地文件冲突。
- 状态锁定:防止并发 CI/CD 管道同时修改状态导致数据损坏。DynamoDB(AWS)或 Consul 常作为锁后端。
- 敏感数据保护:SLI 口径可能包含 、数据库连接串等敏感信息。使用
sensitive = true标记输出变量,并启用状态加密。
| 后端类型 | 适用场景 | 锁支持 |
|---|---|---|
| local | 个人开发、单机实验 | 否 |
| s3 + DynamoDB | AWS 环境团队协作 | 是(DynamoDB) |
| gcs | GCP 环境团队协作 | 是(Cloud Storage 对象版本) |
| terraform cloud | 企业级托管、VCS 集成 | 是(内置) |
常见陷阱:不要在 CI/CD 管道中使用
terraform apply -auto-approve 而不检查状态锁定。如果两个管道同时运行,可能导致状态文件损坏或资源重复创建。始终在 CI 脚本中显式配置 -lock=true(默认开启)。
Terraform 工作流:Init / Plan / Apply
Terraform 的标准工作流是 CI/CD 集成的基础。每个阶段都有明确的输入、输出和检查点:
- Init:初始化工作目录,下载 Provider 插件、配置后端、加载模块。在 CI 中,
terraform init通常放在管道最前面,且使用-upgrade=false锁定版本。 - Plan:对比当前状态与配置文件的差异,生成执行计划。Plan 阶段不修改任何资源,是 CI 中人工审核或自动审批的关键门禁。
- Apply:执行 Plan 中的变更操作。在 SLI 配置场景中,Apply 通常需要人工审批(如 GitLab MR 中的 /apply 命令),或通过受保护分支触发。
# CI/CD 管道中的典型 Terraform 命令序列
terraform init \
-backend-config="bucket=my-sli-tfstate" \
-backend-config="key=prometheus/sli-rules.tfstate" \
-backend-config="region=us-east-1"
terraform plan \
-out=tfplan.binary \
-var-file="environments/prod.tfvars"
# 人工审核后执行
terraform apply tfplan.binary
CI/CD 集成要点:Plan 产物(
tfplan.binary)应作为 CI 产物保存,确保 Apply 阶段使用的计划与审核时一致。使用 terraform show -json tfplan.binary 生成机器可读的变更报告,便于集成到审批系统。
工作流在 SLI 配置变更中的实践
将 Terraform 工作流嵌入 CI/CD 管道后,SLI 口径配置变更遵循以下步骤:
- 开发分支:开发人员在 feature 分支修改
.tf文件(如调整 SLI 阈值、新增记录规则),提交后触发 CI 运行terraform plan,输出变更预览。 - 合并请求:Plan 结果作为 MR 评论自动发布。审核人确认变更范围(如“只修改了 error_budget 阈值,未影响其他资源”)后批准合并。
- 主分支:合并到 main 分支后,CI 自动执行
terraform apply,将 SLI 口径配置推送到生产环境。Apply 成功后,状态文件更新,口径配置进入版本管理。
版本化优势:每次 SLI 口径变更都对应一次 Git commit 和一次 Terraform Apply。通过
git log 可以追溯“谁在什么时间修改了哪个 SLI 阈值”,配合 Terraform 状态文件可回滚到任意历史版本。
注意:在 SLI 配置变更中,Apply 阶段可能涉及敏感操作(如修改告警阈值导致误报或漏报)。建议在 CI/CD 管道中设置“受保护分支”规则,仅允许通过 MR 合并触发 Apply,并启用“手动批准”步骤(如 GitLab 的
when: manual 或 GitHub 的 environment 审批)。