mcpField
T
terraform-review

terraform-review

github.com/c0x12c测试与质量109107 次安装19 周前更新
代码仓库

关于 terraform-review

面向审查基础设施变更或审计现有代码的工程师的 Terraform 审查技能。它按八类清单检查,并给出 Approved、Needs Changes 或 Blocked 结论,附带文件和行号定位的问题。

主要功能

  1. 01八类审查清单
  2. 02安全与状态安全检查
  3. 03区分阻断项与建议
  4. 04定位到文件和行的问题
  5. 05结构化结论与报告

适用场景

  1. 01审查 Terraform 拉取请求
  2. 02合并前验证基础设施变更
  3. 03提交 PR 前自查
  4. 04审计现有 Terraform 代码

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/c0x12c/ai-toolkit --skill terraform-review

安装后在 Claude Code 中输入/terraform-review确认已加载。

详细介绍

Terraform 审查

对 Terraform 变更执行包含 8 个类别的审查清单,并给出“批准 / 需要修改 / 阻止”结论。

适用场景

  • 审查 Terraform 拉取请求
  • 基础设施变更的合并前验证
  • 创建 PR 前进行自我审查
  • 审计现有 Terraform 代码

流程

1. 结构
  • 文件遵循标准布局:live/、modules/、envs/
  • 模块中每个文件只包含一个资源
  • terraform.tf 包含后端和提供程序配置
  • variables.tf、outputs.tf、locals.tf 分别存放在独立文件中
  • PR 中不包含 .terraform/ 或 *.tfstate*
# CORRECT structure
terraform/
  live/terraform.tf        # backend + provider
  live/variables.tf        # inputs
  live/locals.tf           # computed values
  live/outputs.tf          # exports
  modules/{service}/       # one resource per file
  envs/{env}/              # per-environment config

# WRONG — everything in one file
terraform/main.tf          # 500 lines of mixed resources
2. 状态安全
  • 自动化中不使用 terraform state 命令
  • 状态存储在 S3 中,并使用 DynamoDB 锁定
  • 对关键资源(RDS、含数据的 S3)设置 prevent_destroy
  • 移除资源前,需记录 terraform state rm 计划
  • 对安全组和启动配置设置 create_before_destroy
  • 采用现有资源时使用导入块(而非 terraform import CLI)
# CORRECT — protect critical resources
resource "aws_db_instance" "main" {
  lifecycle {
    prevent_destroy = true
  }
}

# CORRECT — zero-downtime SG updates
resource "aws_security_group" "app" {
  name_prefix = "${local.name_prefix}-app-"
  lifecycle {
    create_before_destroy = true
  }
}
3. 安全
  • 不将 .tf 或 .tfvars 中的密钥提交到 git
  • 敏感变量标记为 sensitive = true
  • S3 存储桶已阻止公开访问
  • RDS/Redis 仅位于私有子网中
  • 安全组遵循最小权限原则(非 ALB 的入站规则不使用 0.0.0.0/0)
  • 已启用加密(S3 SSE、RDS 加密、Redis 传输中和静态数据加密)
  • IAM 策略遵循最小权限原则,不对 * 资源使用 * 操作
# WRONG — overly permissive
resource "aws_security_group_rule" "bad" {
  cidr_blocks = ["0.0.0.0/0"]
  from_port   = 0
  to_port     = 65535
}

# CORRECT — scoped to specific source
resource "aws_security_group_rule" "good" {
  source_security_group_id = var.alb_security_group_id
  from_port                = 8080
  to_port                  = 8080
}
4. 命名
  • 资源使用 local.name_prefix(模式:{project}-{service}-{env})
  • 模块中所有资源的命名保持一致
  • 标签包含:Project、Service、Environment、ManagedBy
  • 不使用硬编码名称或账户 ID
# CORRECT
locals {
  name_prefix = "${var.project}-${var.service}-${var.env}"
}

# WRONG
resource "aws_s3_bucket" "assets" {
  bucket = "my-bucket-prod"  # hardcoded
}
5. 模块
  • 模块内部不包含提供程序块
  • 模块源使用版本固定(?ref=vX.Y.Z)
  • 不存在循环模块依赖
  • 模块输出仅公开使用方所需的内容
  • 模块包含 versions.tf,其中指定所需的提供程序版本
# CORRECT — pinned version
module "rds" {
  source = "git::https://github.com/{project}/terraform-modules.git//rds?ref=v1.2.0"
}

# WRONG — no version pin
module "rds" {
  source = "git::https://github.com/{project}/terraform-modules.git//rds"
}
6. 变量
  • 所有变量都有 description 和 type
  • 敏感变量标记为 sensitive = true
  • 关键输入(CIDR、名称、枚举值)设置验证块
  • 不存在未使用的变量
  • 默认值适用于 dev,并按环境覆盖
# CORRECT
variable "instance_class" {
  description = "RDS instance class"
  type        = string
  default     = "db.t3.micro"

  validation {
    condition     = can(regex("^db\\.", var.instance_class))
    error_message = "Must be a valid RDS instance class."
  }
}

# WRONG — no description, no type
variable "instance_class" {}
7. 提供程序
  • 提供程序版本使用 ~> 固定(悲观约束)
  • 为 Terraform 本身设置 required_version
  • 提供程序配置仅放在 live/terraform.tf 中,不放在模块中
  • 在提供程序级别配置默认标签
8. CI/CD
  • CI 中运行 terraform fmt -check
  • CI 中运行 terraform validate
  • 将计划输出作为 PR 评论发布
  • 仅在合并到 main 后运行 Apply
  • 状态锁定可防止并发 Apply
  • 通过 CI 环境注入密钥,不将其提交到代码库

交互风格

  • 读取 PR 中所有已变更的 .tf 文件
  • 检查每个类别,不跳过任何部分
  • 将阻断问题(安全、状态安全)与建议分开标记
  • 为每项发现指出确切的文件和行号

规则

  • 阻断问题:代码中包含密钥、未启用状态锁定、存在 0.0.0.0/0 入站规则、缺少加密
  • 需要修改:缺少描述、未固定版本、命名不一致
  • 建议:代码风格、可选验证、文档

输出

生成结构化审查结果:

## Terraform Review: {PR title}

### Verdict: Approved | Needs Changes | Blocked

### Findings

#### Blocked (if any)
- [ ] **[Security]** Secrets found in terraform.tfvars — file:line

#### Needs Changes (if any)
- [ ] **[Naming]** Hardcoded bucket name in s3.tf:12
- [ ] **[Modules]** Missing version pin on RDS module

#### Suggestions (if any)
- **[Variables]** Consider adding validation on `instance_class`

### Checklist Summary
| Category  | Status |
|-----------|--------|
| Structure | Pass   |
| State     | Pass   |
| Security  | Fail   |
| Naming    | Warn   |
| Modules   | Warn   |
| Variables | Pass   |
| Providers | Pass   |
| CI/CD     | Pass   |

评论

支持 Markdown