SuperAPI AI 工具集

terraform-module-design

部署与运维

查看项目

更新于 10-16 06:00

技能介绍

用途

本技能用于掌握 Terraform 模块设计,创建可复用、可测试、文档完善的基础设施组件。学习何时进行模块化、模块结构模式、输入/输出设计以及组合策略。

何时使用

适用场景:

  • 创建可复用基础设施模式:为重复出现的资源组构建模块
  • 封装复杂配置:简化多资源配置
  • 跨项目标准化:确保基础设施一致性
  • 组织代码以便维护:结构化大型 Terraform 项目
  • 构建可组合系统:组合模块以创建更大架构
  • 版本化基础设施组件:发布并版本化模块

不适用场景:

  • 单个一次性资源
  • 仅使用一次的资源
  • 各次使用之间无变化

触发短语:

  • "Create reusable Terraform module"
  • "Design module structure"
  • "Define module inputs and outputs"
  • "Compose multiple modules"
  • "Version Terraform module"

主要能力

模块结构

标准模块布局:

modules/pubsub-topic/
├── main.tf           # 资源
├── variables.tf      # 输入变量
├── outputs.tf        # 输出值
├── versions.tf       # Provider 要求
└── README.md         # 文档

根模块(主配置):

terraform/
├── main.tf          # Provider、变量
├── iam.tf           # IAM 资源
├── pubsub.tf        # Pub/Sub 资源
├── modules/         # 本地模块
│   └── pubsub-topic/
├── .terraform.lock.hcl
└── terraform.tfvars

模块路径支持本地模块、GitHub 远程模块和 Terraform Registry。

输入设计(变量)

原则:保持输入简单直观、使用描述性名称、提供合理默认值、验证约束。

支持简单输入、带默认值、列表、映射(配置对象)和灵活对象等模式。变量可包含 validation 块进行约束验证。

输出设计

原则:仅导出必要值、使用描述性名称、为每个输出编写文档、标记敏感输出。

模块组合

将多个模块组合以构建更大系统,可将一个模块的输出作为另一个模块的输入,并导出组合输出。

版本与维护

使用语义化版本(MAJOR.MINOR.PATCH),支持 ~> 1.0、>= 1.0, < 2.0 等版本约束。维护清单包括:定期更新 Provider 版本、使用新 Terraform 版本测试模块、记录所有破坏性变更、提供迁移指南。

使用方式

快速开始:创建可复用 Pub/Sub 模块

  1. 创建模块结构:
mkdir -p modules/pubsub-topic
cd modules/pubsub-topic
  1. 创建 main.tf、variables.tf、outputs.tf 文件(包含 topic、subscription、DLQ 资源及变量输出定义)。

  2. 使用模块:

module "incoming_charges" {
  source = "./modules/pubsub-topic"

  topic_name  = "supplier-charges-incoming"
  retention_days = 7
  labels = {
    environment = "production"
  }
}
  1. 部署:
terraform init
terraform apply

实施步骤

  1. 决定何时创建模块:模式重复多次、封装复杂资源组(5+ 相关资源)、具有可配置输入、产生清晰输出时创建;单个一次性资源、仅使用一次、无变化、过度设计时不创建。

  2. 理解模块结构。

  3. 设计模块输入(变量),包含验证约束。

  4. 设计模块输出,标记敏感输出。

  5. 创建模块文档(README.md),包含 Usage、Arguments、Outputs 等部分。

  6. 组合模块,将输出作为其他模块输入。

  7. 版本与维护模块。

适用场景

  • 重复出现的基础设施模式(如 Pub/Sub topic + subscription + DLQ + IAM)
  • 需要跨项目标准化的资源配置
  • 大型 Terraform 项目的代码组织
  • 需要发布和版本化的基础设施组件
  • 使用 for_each 动态创建多个模块实例

限制

  • 不适用于单个一次性资源或仅使用一次的资源
  • 不适用于各次使用之间无变化的场景
  • 不适用于过度设计简单配置
  • 要求 Terraform 1.x+
  • 模块应具有清晰的输入/输出契约
  • 需要良好的 README 文档
  • 需使用典型用例进行测试