readtheplan/readtheplan
GitHub: readtheplan/readtheplan
Terraform plan 风险分析工具,将基础设施变更按操作和资源类型分类为安全、需审查、危险、不可逆四个风险等级并生成可读摘要。
Stars: 0 | Forks: 0
# readtheplan
`readtheplan` 是一个 Terraform plan 风险解释工具。它读取 `terraform plan` 的输出,根据操作 × 资源类型 × 所触及的合规上下文,将每项变更分类为 **safe(安全) / review(需审查) / dangerous(危险) / irreversible(不可逆)**,并发布一个 Markdown 格式的摘要,您的发布经理(或审计员,或 AI agent)可以在 30 秒内阅读完毕。
## 状态
🧪 **Alpha — v0.0.2。** 在 PyPI 上的首个可用版本。MVP-1 CLI 发布了基于操作的风险分类器(参见 [ADR 0003](docs/adr/0003-risk-classification-taxonomy.md)),并且 MVP-4 复合 GitHub Action 对其进行了封装。接下来将推出感知资源的规则库(MVP-2)。
## 为什么会有这个项目
Terraform 的 plan/apply 分离机制本意是让变更在进入生产环境之前能经过人工审查。但在实际操作中:
- 代码层面的 diff ≠ plan 层面的 diff(重命名显示为销毁+创建,provider 版本升级会改动未触及的资源,`apply_immediately` 的切换具有隐藏的时机影响)
- 如今 AI agent 会编写 Terraform PR —— 但大多数并不会批判性地阅读 plan,它们执行应用仅仅是因为“测试通过了”
- 合规审查人员(金融、医疗、政府机构)需要的是结构化的风险分类,而不是一个 4000 行的文本块
- 现有的工具要么只是让 plan 显示得更美观(如 Spacelift、env0),要么只是扫描代码以排查策略违规(如 tflint、tfsec、checkov)。没有工具会结合影响范围上下文来对 **plan diff** 给出明确的定性。
## 理念
基于这篇实地观察记录:**[terraform-apply-is-roulette](https://github.com/texasich/sre-field-notes/blob/main/notes/terraform-apply-is-roulette.md)**。如果您曾因轻信 `terraform validate` 而引发过紧急修复的恐慌,或者眼睁睁看着一次前向修复演变成更长时间的停机,那么这个工具就是为您量身打造的。
## 计划中的 MVP 范围
1. CLI:`readtheplan analyze plan.json` → 输出带有风险等级的 Markdown 变更表格
2. 针对每种资源类型的纯英文解释(开箱即用即覆盖约 30 种高风险模式:KMS、IAM、RDS 替换、S3 存储桶销毁、EKS 节点组替换、route53 区域删除、网络 ACL 剥离)
3. AI agent 认证标头 —— 标记某个 agent 是否声明已阅读过该 plan
4. GitHub Action 封装:以 `uses: readtheplan/action@v1` 的方式安装,并发布一条 Markdown 格式的 PR 评论
5. YAML 规则自定义:定义组织特定的规则(例如“账号 1234 中的任何内容均标记为 `review`”)
## *不*在范围内(且不会纳入)的内容
- 超越 AWS 的多云支持(初期专注点)
- SaaS 仪表板(推迟至收益能证明其合理性时再做)
- 策略即代码引擎(OPA / Sentinel 已经存在)
- 在重叠功能上与 Spacelift / env0 / Snyk IaC 竞争
## 许可证
MIT — 详见 [LICENSE](./LICENSE)。
## CLI JSON 输出
MVP-1 为自动化暴露了一个稳定的机器可读契约:
```
readtheplan analyze --format json plan.json
```
该 JSON 对象包括:
- `resource_change_count`:Terraform `resource_changes` 条目的总数。
- `actions`:以 Terraform 操作集(例如 `create` 或 `delete/create`)为键的计数。
- `risks`:以 readtheplan 风险等级为键的计数。
- `changes`:每个资源变更对应一个对象,包含 `address`、`type`、`actions` 和 `risk`。
无效输入将在标准错误(stderr)中报告并以非零状态退出。
## GitHub Action
本仓库在根目录下包含一个复合 GitHub Action。默认情况下,它会安装通过 action 检出的本地 Python 包,运行 JSON CLI 契约,并将解析后的值作为输出公开。
```
- name: Analyze Terraform plan
id: readtheplan
uses: readtheplan/readtheplan@v1
with:
plan-file: plan.json
fail-on-changes: "false"
- name: Use readtheplan output
run: |
echo "${{ steps.readtheplan.outputs['summary-json'] }}"
echo "${{ steps.readtheplan.outputs['resource-change-count'] }}"
```
Action 输出:
- `summary-json`:由 `readtheplan analyze --format json` 输出的完整 JSON。
- `resource-change-count`:资源变更总数。
- `action-counts`:操作计数的紧凑 JSON 对象。
- `risk-counts`:风险计数的紧凑 JSON 对象。
## 联系方式
欢迎开源贡献。作者:[@texasich](https://github.com/texasich)。
标签:AI代理, DevSecOps, EC2, ECS, GitHub Action, IaC, PyPI, Python, SRE, Terraform, terraform-plan, 上游代理, 云安全监控, 云计算, 偏差过滤, 发布管理, 变更审查, 基础设施变更, 安全合规, 审计, 平台工程, 开源框架, 持续集成, 提示词模板, 文档结构分析, 无后门, 漏洞利用检测, 网络代理, 规则引擎, 逆向工具, 静态分析