julliuzsam/aws-cost-cutter
GitHub: julliuzsam/aws-cost-cutter
一款只读的 AWS 成本优化审计 CLI,安全扫描账户中的资源浪费并生成按节省金额排序的报告。
Stars: 0 | Forks: 0
# aws-cost-cutter:只读的 AWS 成本优化与 FinOps 审计 CLI
**查找未使用的 AWS 资源并削减您的 AWS 账单,且无需触及生产环境。**
`aws-cost-cutter` 是一个只读的 Python (boto3) 命令行工具,用于审计
AWS 账户的成本浪费,并生成一份按优先级排序的节省报告。它会扫描
闲置的 EC2、未挂载的 EBS 卷、从 gp2 到 gp3 的升级、闲置的 RDS、孤立的
快照、未关联的 Elastic IP、S3 生命周期缺口、Savings Plan 覆盖率
和利用率,以及未标记的支出,然后按估算的
每月节省金额对每项发现进行排名。
它绝不会创建、更改或删除任何内容。每次 AWS 调用都是 `Describe`、
`List` 或 `Get`,并且有测试强制执行这一点。因此,首次
在生产环境或客户账户上运行它也是安全的。
```
$ aws-cost-cutter demo
AWS Cost Audit account 123456789012 2 region(s) lookback 14d
Estimated waste: $726.59/month (~$8,719.08/year) across 15 findings
```
行业调查显示,浪费的云支出大约占账单的 25% 到 35%,
并且最严重的浪费往往很寻常:迁移后遗留的卷、
没人连接的数据库、永远没人删除的快照。该工具可以一次性
发现它们,这样耗时的部分——即决定实际要更改什么——
正是需要人工投入精力的地方。
## 目录
- [问题所在](#the-problem)
- [工作原理](#how-it-works)
- [发现内容](#what-it-finds)
- [设计安全:只读](#safe-by-design-read-only)
- [输出示例](#sample-output)
- [安装与运行](#install-and-run)
- [IAM 权限](#iam-permissions)
- [常见问题解答](#faq)
- [项目结构](#what-is-in-here)
- [设计原则](#design-principles)
## 问题所在
云账单是日积月累增长的。工程师启动一个数据库来测试
某些东西,某个卷在迁移过程中被分离,Savings Plan 的规模是
针对后来发生转移的工作负载设定的。每一项都很小。但加起来它们就占了
账单的五分之一到三分之一,而且没人负责寻找它们,
因为这不仅枯燥乏味,而且控制台迫使您
一次只能点击查看一个服务,一个区域。
成本审计主要是对整个账户进行模式匹配。这正是
该工具安全地自动执行的操作,这样您就可以将时间花在判断上,
而不是无休止的点击。
## 工作原理
一次运行将按顺序执行五件事:
1. **建立会话。** 它使用您的默认凭证、指定的 `--profile`,
或者通过 `--role-arn` 在另一个账户中代入一个只读角色。这种
代入角色路径让您无需客户交出长期
密钥即可审计其账户。
2. **发现区域。** 如果没有 `--regions` 标志,它将枚举该账户
已启用的每个区域,并跳过在
`Describe` 调用时会报错的选择加入区域。您可以将其固定到一个或多个区域以加快速度。
3. **运行每项检查。** 每项检查都会对目标区域内相关的 `Describe` 或
`List` 调用进行分页处理。如果检查遇到权限缺口或
意外响应,会被捕获并报告为警告,因此一个受限的
服务永远不会导致整个运行瘫痪。
4. **根据指标而非猜测来判断闲置状态。** 闲置的 EC2 和 RDS 是根据
CloudWatch(平均 CPU、数据库连接数)在过去回溯窗口内(默认
14 天)的数据来判断的。当没有指标数据时,工具会如实说明,并且不会标记该
资源,从而避免在面向客户的报告中出现误报。
5. **定价和排名。** 每项发现都会获得一个按目录价格计算的每月估算值,并且
报告会按金额排序,以便您首先解决最大的浪费。输出格式可以是终端
表格、Markdown 报告或 JSON。
```
flowchart LR
A["Session or assumed role"] --> B["Enabled regions"]
B --> C["Resource checks (EC2, EBS, RDS, S3)"]
B --> D["Cost Explorer checks (opt-in)"]
C --> E["CloudWatch metrics for idle detection"]
E --> F["Findings priced and ranked by monthly saving"]
D --> F
F --> G["Report: terminal, markdown, JSON"]
```
完整的检查目录、每项检查执行的精确 AWS 调用,以及
每项检查可能出错的地方,都记录在 [docs/checks.md](docs/checks.md) 中。估算方法及其
注意事项位于 [docs/methodology.md](docs/methodology.md) 中。
## 发现内容
每个扫描器都映射到一个特定的、众所周知的 AWS 浪费源。
### 查找未使用和未挂载的 EBS 卷
处于 `available` 状态的卷没有连接到任何实例,但每个月
仍会产生费用。一个中等规模的账户通常会携带几个这样的卷。该工具会
高置信度地标记它们,并将完整的存储成本作为节省额进行定价。
### gp2 到 gp3 的 EBS 升级
正在使用的 gp2 卷会被标记以便迁移到 gp3,后者每 GB 价格更便宜,并且
包含免费的 3,000 IOPS / 125 MB/s 基准。该更改可以直接进行,无需
停机,也不需要快照。
### 闲置的 EC2 实例及资源规模调整
在过去回溯窗口内平均 CPU 低于 3% 的正在运行的实例会被
标记为闲置状态,而不是轻负载状态。已停止的实例会被单独
标记,因为即使计算不再计费,它们挂载的 EBS 仍会
继续产生费用。
### 闲置的 RDS 实例
在过去回溯窗口内几乎没有连接的数据库会被呈现出来。
连接数是比 CPU 更清晰的闲置信号,因为在健康但
空闲的数据库上,CPU 会保持在低水平。Multi-AZ 成本也会被计算在内。
### 孤立和陈旧的 EBS 快照
源卷已不存在的自有快照会被标记。支持
AMI 的快照会被排除在外,因为删除它们会破坏镜像,并且
由另一个账户拥有的快照会被忽略。
### 未使用和未关联的 Elastic IP
自 2024 年 2 月起,AWS 会对每个公网 IPv4 地址计费,无论是否关联,因此
已分配但未关联的 Elastic IP 是纯粹的浪费(每个每月约 3.65 美元
)。该工具会将它们全部列出。
### S3 生命周期缺口和不完整的多部分上传
包含大量 Standard 存储但没有生命周期策略的存储桶会被标记
为 Standard-IA 或 Intelligent-Tiering 的候选对象。不完整的多部分
上传(会永远作为存储产生费用,并且在控制台对象
列表中不可见)也会被呈现出来。
### Savings Plan 覆盖率和利用率
使用 `--with-cost-explorer` 时,该工具会报告低承诺覆盖率(稳定的
按需支出,Savings Plan 可以对其进行折扣)和低利用率(已承诺但
未使用的支出)。目标覆盖率通常为 70% 到 80%。
### 未标记的支出
同样通过 Cost Explorer,它会报告缺少所选成本
分配标签的支出份额。这是一项治理发现,而不是快速见效的方法,因此它
被特意标记为零美元节省,并且永远不会夸大标题数字。
## 设计安全:只读
- **只读,且强制执行。** 每次调用都是 `Describe`、`List` 或 `Get`。
代码中没有任何 apply、fix 或 delete 路径。位于
[tests/test_readonly_guard.py](tests/test_readonly_guard.py) 的测试记录了全面扫描期间的每一次 AWS
调用,如果其中任何一个改变了状态,CI 就会失败。
- **最小权限。** 提供位于
[iam/cost-audit-readonly.json](iam/cost-audit-readonly.json) 的范围内的只读策略,而不是管理员权限。
- **以干净的方式进行跨账户操作。** 账户所有者创建一个信任您的只读
角色,然后您传入 `--role-arn`。您的东西不会被暴露,他们的
任何内容在会话结束后也不会保留。
- **没有任何数据离开本地机器。** 向 AWS 发起调用,在本地输出报告。没有遥测,
没有第三方服务。
更多细节请参见 [docs/safety.md](docs/safety.md)。
## 输出示例
一份完整、可重现的报告位于
[samples/sample-report.md](samples/sample-report.md)(以及 `.json`)。它是通过 `make demo` 针对
一个合成账户生成的,因此它不是模型。其
执行摘要如下:
| 类别 | 发现数量 | 预估每月费用 |
|---|---:|---:|
| Savings Plans | 2 | $474.00 |
| RDS | 1 | $124.83 |
| EC2 | 3 | $65.19 |
| EBS | 6 | $46.82 |
| S3 | 2 | $15.75 |
| Tagging | 1 | $0.00 |
在摘要下方,每项发现都有自己独立的区块:包含检查、严重程度和
置信度、估算节省额、被标记的原因以及确切的修复方法。
## 安装与运行
要求 Python 3.9 或更高版本。
```
git clone https://github.com/julliuzsam/aws-cost-cutter.git
cd aws-cost-cutter
make install # editable install with dev tools
make demo # synthetic account, no credentials, no AWS bill
```
针对真实账户(只读):
```
# 默认 profile,所有启用的区域,terminal 输出
aws-cost-cutter scan
# 保存 markdown 报告
aws-cost-cutter scan --format markdown -o report.md
# 指定的 profile 和区域,速度更快
aws-cost-cutter scan --profile prod --regions eu-west-1,us-east-1
# 添加 Cost Explorer 检查(需要启用 CE,每次调用费用约为 0.01 USD)
aws-cost-cutter scan --with-cost-explorer
# 通过 assumed read-only role 审计 client account
aws-cost-cutter scan --role-arn arn:aws:iam::111122223333:role/cost-audit
```
输出格式:`console`(默认)、`markdown`、`json`。闲置回溯窗口通过
`--lookback-days` 设置。
## IAM 权限
该工具只需要读取权限。请使用位于
[iam/cost-audit-readonly.json](iam/cost-audit-readonly.json) 的范围受限的策略,该策略授予了
检查所调用的特定 `Describe`、`List` 和 `Get` 操作,以及可选的
用于 Cost Explorer 检查的 `ce:Get*`。优先使用它,而不是宽泛的 AWS 托管策略
`ReadOnlyAccess`。如果您跳过 `--with-cost-explorer`,则可以完全去掉 Cost
Explorer 语句。
## 常见问题解答
### 给成本工具访问我的 AWS 账户的权限安全吗?
安全。该工具在构建上就是只读的,不持有任何写入或删除
权限,并且仓库中的测试强制要求每次调用都是读取操作。可以使用提供的最小权限
策略进一步限制其范围。
### 我可以在生产环境或客户账户上运行此工具吗?
可以,这正是其设计目标。它永远不会改变任何内容,会以适当的频率进行分页和重试,
并隔离每个检查的故障。对于客户,请使用代入角色流程,
这样他们就可以授予临时的只读访问权限。
### 它需要什么 IAM 权限?
仅需要 [iam/cost-audit-readonly.json](iam/cost-audit-readonly.json) 中的读取操作。
Cost Explorer 访问权限是可选的,并且是可以分离的。
### 我可以节省多少 AWS 账单费用?
这完全取决于账户情况。行业调查显示,典型的浪费占支出的 25% 到
35%,但唯一诚实的答案是运行它并阅读报告。
这些估算值是目录价格的起点,需要根据您实际的 Cost
and Usage Report 进行确认。
### 这与 AWS Cost Explorer 或 Trusted Advisor 有何不同?
那些是仪表板。而这是一个单一命令,它可以跨
每个区域执行资源级别的浪费检测,并为您提供一份按优先级排序的、可操作的报告,
包括内置工具无法清晰呈现的发现(孤立的
快照、不完整的多部分上传)。它是对它们的补充,但并不能
替代 Cost and Usage Report。
### 它会删除任何内容吗?
不会。它只读取和报告。您来决定要更改什么。
### 我应该从 gp2 迁移到 gp3 吗?
几乎总是应该迁移。gp3 每 GB 更便宜,并提供了免费的性能基准。该
工具会标记出每个正在使用的 gp2 卷及其预计的节省金额。
### 为什么我会为我不使用的 Elastic IP 被收费?
自 2024 年 2 月起,AWS 会对所有公网 IPv4 地址计费,因此一个未关联的
Elastic IP 每月花费约 3.65 美元。该工具会列出每一个。
## 项目结构
| 路径 | 说明 |
|---|---|
| `src/aws_cost_cutter/checks/` | 每个检查对应一个模块,外加注册表 |
| `src/aws_cost_cutter/session.py` | 会话、代入角色、区域发现、重试 |
| `src/aws_cost_cutter/pricing.py` | 静态价格映射和节省估算器 |
| `src/aws_cost_cutter/report.py` | Markdown、JSON 和终端渲染器 |
| `src/aws_cost_cutter/demo.py` | 位于 `make demo` 背后的合成账户 |
| `iam/cost-audit-readonly.json` | 最小权限策略 |
| `samples/` | 已提交的演示报告 |
| `docs/` | 方法论、检查目录、安全性、限制 |
| `tests/` | moto 和 Stubber 测试,包括只读保护 |
## 设计原则
1. **只读即产品。** 信任是全部的卖点。一个您必须
在沙箱中运行的审计工具不是审计工具。
2. **按金额排序,而不是按数量。** 一百个低价值的发现不如一个
闲置的 Multi-AZ 数据库重要。该报告按估算的节省金额排序。
3. **对估算保持诚实。** 清楚标明的目录价格近似值
胜过虚假的精确度。置信度和方法论伴随着每一项发现。
4. **闲置状态零误报。** 根据决定闲置状态,当没有
数据时,宁可什么都不说也不要猜测。
5. **在陌生人的账户上安全运行。** 分页、自适应重试、每个检查的错误
隔离、代入角色。
### 关于
由 Jelle Samaey 构建。提供自由职业服务:AWS 成本优化和 FinOps
咨询。采用 [MIT](LICENSE) 许可。
标签:AWS, CLI, DPI, FinOps, Python, WiFi技术, 云资源审计, 成本优化, 无后门, 运维工具, 逆向工具