2. Terraform 基础回顾:Provider、Resource、Data Source、State、Plan/Apply 核心概念
在深入服务目录冷启动的资源边界设计之前,必须重新校准 Terraform 的核心执行模型。本章不追求面面俱到,而是聚焦于与资源边界、审批记录、目录封装直接相关的五个概念:Provider(提供者)、Resource(资源)、Data Source(数据源)、State(状态)和 Plan/Apply(计划/应用)。
学习提示: 如果你已经熟悉 Terraform 基础,可以跳过代码细节,重点阅读表格对比和 SVG 结构图,它们直接关联后续章节的边界划分策略。
2.1 Provider:基础设施的“驱动程序”
Provider 是 Terraform 与目标平台(云、Kubernetes、SaaS)之间的适配层。每个 Provider 负责定义资源类型、执行 API 调用、管理认证与重试逻辑。
| Provider 属性 | 说明 | 服务目录中的角色 |
|---|---|---|
| 来源 | registry.terraform.io/<namespace>/<type> | 目录模板必须锁定 Provider 版本 |
| 版本约束 | required_providers 块声明 |
冷启动时自动解析版本,避免冲突 |
| 认证 | 环境变量、静态凭证、OIDC、AssumeRole | 目录应抽象认证方式,不硬编码密钥 |
| 别名 | provider "aws" { alias = "us_east" } |
多区域/多账号边界的关键实现手段 |
# 标准 Provider 声明示例
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
# 认证通过环境变量 AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY 注入
}
边界陷阱: 服务目录中的每个产品模板必须显式声明
required_providers,不能依赖全局 Provider 配置。否则冷启动时会出现 Provider 未就绪错误,导致目录无法部署。
2.2 Resource:基础设施的“原子单元”
Resource 是 Terraform 管理的核心对象,对应云平台中的一个具体实体:一台虚拟机、一个存储桶、一条安全组规则。每个 Resource 由 资源类型 和 本地名称 唯一标识。
# 资源定义语法
resource "aws_s3_bucket" "catalog_artifacts" {
bucket = "my-catalog-artifacts-${var.environment}"
tags = {
Name = "Catalog Artifacts"
Environment = var.environment
}
}
Resource 的关键属性包括:
- arguments(参数):定义资源的期望状态,如实例类型、磁盘大小。
- attributes(属性):资源创建后由 Provider 返回的只读值,如
arn、id。 - meta-arguments(元参数):
count、for_each、depends_on、provider、lifecycle。
边界视角: 服务目录中的每个产品模板应封装一组逻辑相关的 Resource,形成“资源单元”。例如一个“VPC 基础套件”包含:VPC、子网、路由表、安全组。外部只暴露必要的输入变量,内部 Resource 之间的依赖关系由 Terraform 自动处理。
2.3 Data Source:读取外部状态
Data Source 用于查询基础设施的现有状态,而不创建或修改任何资源。它在服务目录中扮演“环境感知”角色:读取已有 VPC ID、获取最新 AMI、查询 TLS 证书。
# 查询现有 VPC
data "aws_vpc" "shared" {
tags = {
Environment = "shared"
}
}
# 在资源中引用数据源
resource "aws_subnet" "app" {
vpc_id = data.aws_vpc.shared.id
cidr_block = "10.0.1.0/24"
}
| 对比维度 | Resource | Data Source |
|---|---|---|
| 生命周期 | 创建、更新、删除 | 只读查询 |
| State 影响 | 写入 State | 不写入 State(仅缓存到内存) |
| 目录用途 | 定义产品包含的资产 | 获取共享基础设施上下文 |
| 冷启动依赖 | 需要 Provider 就绪 | 需要 Provider 就绪 + 目标资源存在 |
2.4 State:基础设施的“真相来源”
State 文件是 Terraform 的核心状态数据库,记录每个 Resource 的当前状态、元数据、依赖关系。在服务目录冷启动场景中,State 的设计直接决定资源边界能否独立管理。
# State 文件中的资源记录(简化 JSON 结构)
{
"version": 4,
"resources": [
{
"mode": "managed",
"type": "aws_s3_bucket",
"name": "catalog_artifacts",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"bucket": "my-catalog-artifacts-prod",
"arn": "arn:aws:s3:::my-catalog-artifacts-prod"
}
}
]
}
]
}
冷启动关键约束: 服务目录的每个产品实例必须拥有独立的 State 文件。共享 State 会导致资源边界模糊、并发锁竞争、审批记录混乱。推荐使用
terraform_remote_state 数据源跨 State 读取输出值,而非直接共享 State 文件。
2.5 Plan/Apply:变更的“预览与执行”
Plan 和 Apply 是 Terraform 的工作流引擎。Plan 生成执行计划,Apply 执行计划并更新 State。在服务目录中,Plan 阶段是审批记录的核心捕获点。
# Plan 输出关键信息示例
Terraform will perform the following actions:
# aws_s3_bucket.catalog_artifacts will be created
+ resource "aws_s3_bucket" "catalog_artifacts" {
+ bucket = "my-catalog-artifacts-prod"
+ arn = (known after apply)
+ tags = {
+ "Environment" = "prod"
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
| 阶段 | 动作 | 审批记录关联 |
|---|---|---|
| terraform plan | 读取 State + 对比配置 → 生成变更集 | 捕获变更摘要、资源列表、风险等级 |
| terraform apply | 执行变更集 → 更新 State | 记录执行人、时间戳、变更结果 |
| terraform destroy | 删除所有资源 → 清空 State | 需要额外审批,记录销毁清单 |
服务目录集成点: 冷启动流程应在 Plan 完成后自动生成审批工单,包含:变更摘要、受影响资源列表、成本预估(如果集成 Infracost)、安全合规扫描结果。Apply 执行后,将执行结果回写到审批记录系统。
2.6 核心概念关系图
下图展示了 Provider、Resource、Data Source、State、Plan/Apply 之间的协作关系,以及它们在服务目录冷启动中的位置。
2.7 冷启动中的概念映射
将上述五个核心概念映射到服务目录冷启动流程,形成以下对应关系:
| Terraform 概念 | 冷启动中的角色 | 边界设计影响 |
|---|---|---|
| Provider | 定义目标平台和认证方式 | 每个产品模板独立声明,支持多 Provider 别名 |
| Resource | 构成产品的原子资产 | 按业务逻辑分组,形成资源单元 |
| Data Source | 读取共享基础设施上下文 | 减少输入变量,增强模板可移植性 |
| State | 每个产品实例的独立状态 | 资源边界 = State 边界,不可共享 |
| Plan/Apply | 变更审批与执行记录 | Plan 输出作为审批依据,Apply 结果作为执行凭证 |
本章小结: 理解这五个核心概念是设计服务目录资源边界的基础。Provider 决定“在哪里”,Resource 决定“有什么”,Data Source 决定“知道什么”,State 决定“记录什么”,Plan/Apply 决定“怎么变”。下一章将基于这些概念,构建资源边界划分的具体策略。