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 之间的协作关系,以及它们在服务目录冷启动中的位置。

Terraform 核心概念关系图 Terraform 核心概念关系图(服务目录视角) Provider AWS / Azure / GCP Resource S3 Bucket / EC2 / VPC Data Source 查询现有 VPC / AMI State terraform.tfstate Plan / Apply 预览 → 执行 → 记录 服务目录冷启动层 产品模板 → 审批记录 → 资源边界 → 独立 State 关键说明 • Resource 写入 State • Data Source 不写入 • Plan 读取 State • Apply 更新 State

2.7 冷启动中的概念映射

将上述五个核心概念映射到服务目录冷启动流程,形成以下对应关系:

Terraform 概念 冷启动中的角色 边界设计影响
Provider 定义目标平台和认证方式 每个产品模板独立声明,支持多 Provider 别名
Resource 构成产品的原子资产 按业务逻辑分组,形成资源单元
Data Source 读取共享基础设施上下文 减少输入变量,增强模板可移植性
State 每个产品实例的独立状态 资源边界 = State 边界,不可共享
Plan/Apply 变更审批与执行记录 Plan 输出作为审批依据,Apply 结果作为执行凭证
本章小结: 理解这五个核心概念是设计服务目录资源边界的基础。Provider 决定“在哪里”,Resource 决定“有什么”,Data Source 决定“知道什么”,State 决定“记录什么”,Plan/Apply 决定“怎么变”。下一章将基于这些概念,构建资源边界划分的具体策略。