关于 terraform-review
面向审查基础设施变更或审计现有代码的工程师的 Terraform 审查技能。它按八类清单检查,并给出 Approved、Needs Changes 或 Blocked 结论,附带文件和行号定位的问题。
主要功能
- 01八类审查清单
- 02安全与状态安全检查
- 03区分阻断项与建议
- 04定位到文件和行的问题
- 05结构化结论与报告
适用场景
- 01审查 Terraform 拉取请求
- 02合并前验证基础设施变更
- 03提交 PR 前自查
- 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 importCLI)
# 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