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技术, 云资源审计, 成本优化, 无后门, 运维工具, 逆向工具