
关于
Terraform 基础设施即代码最佳实践
name: terraform-skill description: "Terraform 基础设施即代码最佳实践" risk: safe source: "https://github.com/antonbabenko/terraform-skill" date_added: "2026-02-27"
Terraform Skill for Claude
全面的 Terraform 和 OpenTofu 指南,涵盖测试、模块、CI/CD 和生产模式。基于 terraform-best-practices.com 和企业实践经验。
何时使用此 Skill
在以下情况下激活此 skill:
- 创建新的 Terraform 或 OpenTofu 配置或模块
- 为 IaC 代码搭建测试基础设施
- 在测试方法之间做选择(validate、plan、框架)
- 构建多环境部署结构
- 为基础设施即代码实施 CI/CD
- 审查或重构现有 Terraform/OpenTofu 项目
- 在模块模式或状态管理方案之间做选择
不要在以下情况使用此 skill:
- 基本的 Terraform/OpenTofu 语法问题(Claude 已经掌握)
- 特定 Provider 的 API 参考(请链接到文档)
- 与 Terraform/OpenTofu 无关的云平台问题
核心原则
1. 代码结构理念
模块层级:
| 类型 | 使用场景 | 范围 | |------|----------|------| | Resource Module | 单个逻辑组的关联资源 | VPC + 子网,安全组 + 规则 | | Infrastructure Module | 为某一目的组合的资源模块集合 | 单个区域/账户中的多个资源模块 | | Composition | 完整的基础设施 | 跨多个区域/账户 |
层级关系: Resource → Resource Module → Infrastructure Module → Composition
目录结构:
environments/ # 环境特定配置
├── prod/
├── staging/
└── dev/
modules/ # 可复用模块
├── networking/
├── compute/
└── data/
examples/ # 模块使用示例(同时作为测试)
├── complete/
└── minimal/
来自 terraform-best-practices.com 的关键原则:
- 将环境(prod、staging)与模块(可复用组件)分离
- 使用 examples/ 同时作为文档和集成测试用例
- 保持模块小而专注(单一职责)
详细模块架构请参见: 代码模式:模块类型与层级
2. 命名规范
资源:
# 好的做法:描述性、有上下文
resource "aws_instance" "web_server" { }
resource "aws_s3_bucket" "application_logs" { }
# 好的做法:单例资源使用 "this"(该类型只有一个)
resource "aws_vpc" "this" { }
resource "aws_security_group" "this" { }
# 避免:非单例使用通用名称
resource "aws_instance" "main" { }
resource "aws_s3_bucket" "bucket" { }
单例资源:
当模块只创建该类型的一个资源时使用 "this":
✅ 推荐:
resource "aws_vpc" "this" {} # 模块创建一个 VPC
resource "aws_security_group" "this" {} # 模块创建一个安全组
❌ 不要对多个资源使用 "this":
resource "aws_subnet" "this" {} # 如果创建多个子网
当创建同类型的多个资源时使用描述性名称。
变量:
# 需要时添加上下文前缀
var.vpc_cidr_block # 不要只用 "cidr"
var.database_instance_class # 不要只用 "instance_class"
文件:
main.tf- 主要资源variables.tf- 输入变量outputs.tf- 输出值versions.tf- Provider 版本data.tf- 数据源(可选)
测试策略框架
决策矩阵:选择哪种测试方法?
| 场景 | 推荐方法 | 工具 | 成本 |
|------|----------|------|------|
| 快速语法检查 | 静态分析 | terraform validate、fmt | 免费 |
| Pre-commit 验证 | 静态 + lint | validate、tflint、trivy、checkov | 免费 |
| Terraform 1.6+,简单逻辑 | 原生测试框架 | 内置 terraform test | 免费-低 |
| 1.6 之前,或有 Go 经验 | 集成测试 | Terratest | 低-中 |
| 安全/合规重点 | 策略即代码 | OPA、Sentinel | 免费 |
| 成本敏感工作流 | Mock providers (1.7+) | 原生测试 + mocking | 免费 |
| 多云、复杂场景 | 完整集成 | Terratest + 真实基础设施 | 中-高 |
基础设施测试金字塔
/\
/ \ 端到端测试(昂贵)
/____\ - 完整环境部署
/ \ - 类生产环境设置
/________\
/ \ 集成测试(中等)
/____________\ - 模块隔离测试
/ \ - 测试账户中的真实资源
/________________\ 静态分析(低成本)
- validate、fmt、lint
- 安全扫描
原生测试最佳实践 (1.6+)
生成测试代码前:
-
使用 Terraform MCP 验证 schema:
搜索 provider 文档 → 获取资源 schema → 识别 block 类型 -
选择正确的命令模式:
comman

