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。
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 镜像、或从外部系统读取配置。
# 获取最新的 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 判断“当前状态”与“期望状态”差异的唯一依据。
2.5 Plan:安全预览变更
Plan 阶段执行 terraform plan 命令,它会读取当前 State 并与配置进行对比,生成一份详细的执行计划。Plan 不会对基础设施做任何实际更改,它只展示“将要创建、更新或删除哪些资源”。
- 创建(+):资源存在于配置中,但不在 State 中。
- 更新(~):资源同时存在于配置和 State 中,但属性有差异。
- 删除(-):资源存在于 State 中,但已从配置中移除。
- 替换(-/+):资源因不可变属性变更而需要重建。
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 之间的完整协作关系,帮助你建立全局视角。