2. Terraform 基础回顾:Provider配置、资源声明、变量与输出、状态文件管理

在深入弹性伸缩任务编排之前,必须夯实 Terraform 的核心基础。本章将围绕四个关键支柱展开:Provider 配置(与云平台建立连接)、资源声明(定义基础设施对象)、变量与输出(实现参数化与数据传递)、状态文件管理(维护基础设施的实时映射)。

学习目标: 完成本章后,你将能够独立编写一个包含变量、资源、输出的完整 Terraform 配置文件,并理解状态文件在团队协作中的重要性。

2.1 Provider 配置:连接云平台

Provider 是 Terraform 与目标 API(如 AWS、Azure、阿里云)交互的桥梁。每个 Provider 都需要声明 required_providers 并配置认证信息。

# 声明阿里云 Provider
terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"
      version = "~> 1.200.0"
    }
  }
}

# 配置 Provider 实例
provider "alicloud" {
  region = "cn-hangzhou"
  # 认证方式:环境变量 / 配置文件 / 显式指定
  access_key = var.alicloud_access_key
  secret_key = var.alicloud_secret_key
}
配置项 说明 推荐做法
source Provider 的注册地址,格式为 命名空间/类型 从 Terraform Registry 获取官方源
version 版本约束,避免意外升级导致兼容性问题 使用 ~> x.y 锁定大版本
region 目标云服务区域 通过变量传入,避免硬编码
认证信息 AccessKey/SecretKey 或角色扮演 优先使用环境变量或 CI/CD 密钥管理
安全警示: 永远不要将 AccessKey/SecretKey 硬编码在 .tf 文件中。使用 terraform.tfvars 配合 .gitignore 忽略,或通过环境变量注入。

2.2 资源声明:定义基础设施对象

资源是 Terraform 的核心抽象,使用 resource "provider_type" "local_name" 语法声明。每个资源块定义了一个云上对象及其配置参数。

# 声明一个弹性伸缩组(ESS)
resource "alicloud_ess_scaling_group" "web" {
  scaling_group_name = "web-scaling-group"
  min_size           = 2
  max_size           = 10
  vswitch_ids        = ["vsw-xxx", "vsw-yyy"]
  removal_policies   = ["OldestInstance", "NewestInstance"]
  default_cooldown   = 300

  # 标签用于资源分类
  tags = {
    Environment = "production"
    Team        = "platform"
  }
}

# 声明一个伸缩规则
resource "alicloud_ess_scaling_rule" "scale_out" {
  scaling_group_id = alicloud_ess_scaling_group.web.id
  scaling_rule_name = "scale-out-cpu-80"
  adjustment_type   = "TotalCapacity"
  adjustment_value  = 5
  cooldown          = 60
}

资源声明遵循 依赖图 机制:Terraform 自动分析资源间的引用关系(如 alicloud_ess_scaling_group.web.id),按正确顺序创建、更新或销毁资源。

关键概念: 资源地址(Resource Address)格式为 resource_type.local_name,用于在状态文件、输出值和依赖引用中唯一标识资源。

2.3 变量与输出:参数化与数据传递

变量(variable)让配置可复用;输出(output)将资源属性暴露给外部或作为模块返回值。

变量声明与使用

# variables.tf
variable "region" {
  description = "部署区域"
  type        = string
  default     = "cn-hangzhou"
}

variable "instance_types" {
  description = "ECS 实例规格列表"
  type        = list(string)
  default     = ["ecs.g6.large", "ecs.g6.xlarge"]
}

variable "enable_autoscaling" {
  description = "是否启用弹性伸缩"
  type        = bool
  default     = true
}

# 使用变量
resource "alicloud_ess_scaling_group" "app" {
  min_size = var.enable_autoscaling ? 2 : 1
  # ...
}

输出值声明

# outputs.tf
output "scaling_group_id" {
  description = "创建的伸缩组 ID"
  value       = alicloud_ess_scaling_group.web.id
}

output "scaling_group_arn" {
  value = alicloud_ess_scaling_group.web.arn
}

output "instance_private_ips" {
  description = "伸缩组内实例的私网 IP 列表"
  value = alicloud_ess_scaling_group.web.private_ip_addresses
}
元素 作用 常用类型
variable 接收外部输入,实现配置参数化 string, number, bool, list, map, object
output 暴露资源属性,供 CLI 查看或模块间传递 任意 Terraform 表达式
locals 定义内部计算值,减少重复表达式 任意 Terraform 表达式
最佳实践: 使用 terraform.tfvars 文件为变量赋值,通过 terraform plan -var-file="prod.tfvars" 切换环境。敏感变量(如密码)使用 sensitive = true 标记,避免在日志中明文显示。

2.4 状态文件管理:基础设施的“真相来源”

Terraform 状态文件(terraform.tfstate)记录了所有被管理资源的当前属性。它是 Terraform 判断“创建、更新、删除”的依据。

状态文件的核心作用

  • 映射关系: 将配置中的资源地址与云上真实资源 ID 绑定。
  • 性能优化: 避免每次 plan/apply 都调用全部 API 列举资源。
  • 依赖解析: 存储资源间的属性引用值,支持复杂依赖图。

远程状态存储(Backend)

团队协作时必须使用远程后端,避免状态文件冲突或丢失。

# backend.tf - 使用阿里云 OSS 存储状态
terraform {
  backend "oss" {
    bucket  = "my-terraform-state-bucket"
    prefix  = "prod/autoscaling"
    key     = "terraform.tfstate"
    region  = "cn-hangzhou"
    # 建议启用服务端加密
    encrypt = true
  }
}
后端类型 适用场景 优势
本地(local) 个人学习、单机实验 无需额外配置
OSS / S3 中小团队、标准项目 低成本、支持版本控制
Terraform Cloud 企业级协作、策略即代码 内置 VCS 集成、远程执行
Consul / etcd 动态锁、高可用场景 强一致性、支持事务
状态文件安全: 状态文件可能包含明文密码、密钥或敏感配置。务必启用后端加密(如 OSS 服务端加密),并限制对状态文件的访问权限。不要将 .tfstate 文件提交到 Git 仓库。

2.5 核心工作流与状态生命周期

下图展示了 Terraform 从配置到状态持久化的完整流程,以及状态文件在其中的核心位置。

Terraform 核心工作流与状态生命周期 Terraform 核心工作流与状态生命周期 1. 编写配置 *.tf 文件 2. terraform init 下载 Provider / 模块 3. terraform plan 预览变更 4. terraform apply 执行变更 terraform.tfstate 状态文件 远程 Backend OSS / S3 / Consul 状态文件核心职责 • 资源 ID 映射 • 依赖关系存储 • 变更增量计算 5. terraform destroy 清理资源

2.6 状态文件操作命令速查

命令 用途 注意事项
terraform state list 列出状态中所有资源地址 用于确认资源是否被管理
terraform state show <地址> 查看某个资源的详细属性 调试时快速获取属性值
terraform state mv <源> <目标> 重命名或移动资源地址 重构配置时保持状态一致性
terraform state rm <地址> 从状态中移除资源(不销毁) 用于将资源移出 Terraform 管理
terraform state pull 从远程后端拉取最新状态 调试远程状态冲突时使用
terraform state push 手动推送本地状态到远程 谨慎使用,可能覆盖远程状态
状态锁定: 使用支持锁定的后端(如 OSS + DynamoDB、Consul)可以防止多人同时执行 apply 导致状态损坏。Terraform Cloud 默认提供状态锁定功能。

2.7 本章小结

通过本章回顾,你已掌握 Terraform 的四大基础支柱:

  • Provider 配置:建立与云平台的认证连接,指定区域和版本约束。
  • 资源声明:使用 resource 块定义基础设施对象,利用依赖图自动编排。
  • 变量与输出:通过 variable 实现参数化,通过 output 暴露关键属性。
  • 状态文件管理:理解 terraform.tfstate 的核心作用,掌握远程后端配置与状态操作命令。