Hotdry.
cloud-infrastructure

AWS Doctor CLI:基于Go的AWS资源健康检查与成本优化终端工具

深入分析aws-doctor CLI工具的Go实现架构,探讨其如何通过Cobra框架构建专业命令行界面,集成AWS Cost Explorer API实现成本分析与闲置资源检测,并提供可落地的部署配置与权限管理方案。

在云成本管理日益复杂的今天,AWS 用户面临着资源浪费检测难、成本分析不直观的挑战。虽然 AWS Trusted Advisor 提供了专业的优化建议,但其需要 Business 或 Enterprise 支持计划,对于中小团队来说成本较高。开源工具 aws-doctor 应运而生,它作为一个基于 Go 语言的终端 CLI 工具,为开发者提供了免费的 AWS 资源健康检查与成本优化解决方案。

工具定位与核心价值

aws-doctor 将自己定位为 "终端中的 AWS 健康检查工具",其核心价值在于将复杂的云资源监控和成本分析简化为几个简单的命令行指令。工具作者 elC0mpa 作为云架构师,在日常工作中发现 AWS 控制台虽然提供了原始数据,但缺乏对 "我们是否在高效支出?" 这一核心问题的直接回答。因此,他开发了 aws-doctor 来填补这一空白。

该工具不仅仅是展示账单,更是一个诊断工具,帮助用户理解资金流向以及可以清理的资源。它自动化了原本需要手动执行的例行检查,成为付费 AWS Trusted Advisor 建议的免费开源替代方案。根据 GitHub 仓库显示,该项目已获得 90 个星标,表明其在开发者社区中的认可度。

Go CLI 架构设计与 Cobra 框架应用

aws-doctor 采用 Go 语言实现,这为其带来了跨平台兼容性、高性能和易于分发的优势。在 CLI 框架选择上,项目采用了业界标准的 Cobra 库,这是 Kubernetes、Hugo、GitHub CLI 等知名项目使用的框架。

Cobra 框架的优势整合

Cobra 为 aws-doctor 提供了完整的命令行应用架构:

  1. 子命令系统:支持--trend(趋势分析)、--waste(浪费检测)等子命令,每个命令有独立的逻辑处理
  2. POSIX 兼容标志:支持短标志(如-v)和长标志(如--verbose),符合 Linux/Unix 用户习惯
  3. 全局与局部配置:通过--profile指定 AWS 配置档,--region指定区域,这些配置可以在命令间共享
  4. 自动帮助生成:内置帮助系统,用户可以通过aws-doctor --help获取完整使用说明

项目结构遵循标准的 Go 项目布局,主要包含以下几个核心目录:

  • cmd/:命令行入口和子命令实现
  • internal/:内部业务逻辑,包括成本计算、资源检测算法
  • pkg/:可复用的包,如 AWS API 封装
  • main.go:程序入口点

这种结构分离了关注点,使得代码库易于维护和扩展。例如,当需要添加新的资源检测类型时,只需在相应的检测模块中添加逻辑,而不需要修改核心框架。

AWS API 集成与成本优化算法

aws-doctor 的核心功能建立在 AWS SDK for Go v2 的基础上,通过多个 AWS 服务的 API 集成实现全面的资源监控。

Cost Explorer API 深度集成

成本分析功能主要依赖 AWS Cost Explorer API。该 API 允许程序化查询成本和用量数据,aws-doctor 利用其实现了以下关键功能:

  1. 同期成本比较:通过GetCostAndUsageAPI 获取当前月和上个月同期的成本数据,进行公平的支出速度评估。例如,比较 1 月 1-15 日与 2 月 1-15 日的成本,避免了月份天数不同带来的偏差。

  2. 六个月趋势分析:使用GetCostAndUsageWithResourcesAPI 获取历史数据,生成可视化趋势图,帮助识别长期异常模式。

  3. 粒度数据分析:支持按服务、区域、标签等多个维度分析成本分布,帮助定位高支出区域。

资源浪费检测算法

浪费检测是 aws-doctor 的另一个核心功能,它通过扫描多种 AWS 资源类型,识别 "僵尸资源" 和低效配置:

EBS 卷检测逻辑

  • 未附加到任何 EC2 实例的 EBS 卷
  • 附加到已停止 EC2 实例的 EBS 卷(超过 30 天)
  • 算法通过DescribeVolumesDescribeInstancesAPI 交叉验证状态

EC2 实例优化

  • 停止超过 30 天的实例(通过DescribeInstancesState字段和LaunchTime判断)
  • 即将过期(30 天内)或已过期(30 天内)的预留实例
  • 使用DescribeReservedInstancesAPI 获取预留实例状态

网络资源清理

  • 未关联的弹性 IP 地址(通过DescribeAddresses检测AssociationId为空)
  • 无目标组的负载均衡器(通过DescribeLoadBalancersDescribeTargetGroups验证)
  • 不活动的 VPC 接口端点和 NAT 网关(基于流量监控数据)

数据库优化

  • 空闲 RDS 实例检测,基于 CPU 利用率低于阈值(如 5%)持续一定时间
  • 通过 CloudWatch API 获取性能指标,结合DescribeDBInstances状态信息

这些检测算法都基于可配置的阈值参数,用户可以根据自身业务特点调整检测灵敏度。例如,对于开发环境,可能将 "空闲" 阈值设置为 7 天,而生产环境可能设置为 30 天。

部署配置与权限管理实践

IAM 权限最小化原则

aws-doctor 需要特定的 AWS IAM 权限才能正常运行。遵循最小权限原则,建议创建专门的 IAM 策略:

{
  "Version": "2012-10-25",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ce:GetCostAndUsage",
        "ce:GetCostAndUsageWithResources",
        "ce:GetDimensionValues"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeVolumes",
        "ec2:DescribeAddresses",
        "ec2:DescribeReservedInstances",
        "ec2:DescribeNatGateways",
        "ec2:DescribeVpcEndpoints"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "elasticloadbalancing:DescribeLoadBalancers",
        "elasticloadbalancing:DescribeTargetGroups"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "rds:DescribeDBInstances"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:GetMetricStatistics"
      ],
      "Resource": "*"
    }
  ]
}

这个策略只授予必要的只读权限,避免了安全风险。对于多账户环境,可以通过 AWS Organizations 和跨账户 IAM 角色实现集中管理。

安装与配置指南

aws-doctor 提供多种安装方式:

Go 直接安装

go install github.com/elC0mpa/aws-doctor@latest

二进制发布版: 工具作者计划在未来提供 Fedora、Ubuntu 和 macOS 的软件包仓库分发。目前用户可以从 GitHub Releases 页面下载预编译的二进制文件。

Docker 容器化: 对于希望隔离运行环境的用户,可以构建 Docker 镜像:

FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o aws-doctor .

FROM alpine:latest
COPY --from=builder /app/aws-doctor /usr/local/bin/
ENTRYPOINT ["aws-doctor"]

运行模式与调度策略

aws-doctor 支持多种运行模式:

  1. 交互式单次运行:直接执行aws-doctor --waste进行一次性浪费检测
  2. 定期调度任务:结合 cron 或 systemd timer 实现自动化检查
    # 每周一上午9点运行成本分析
    0 9 * * 1 /usr/local/bin/aws-doctor --trend
    
  3. CI/CD 集成:在部署流水线中加入成本检查步骤,确保新资源符合成本优化标准
  4. 多账户批量处理:通过脚本循环处理多个 AWS 账户,生成汇总报告

性能优化与扩展性考虑

API 调用成本控制

大规模 AWS 账户的扫描可能产生显著的 API 调用成本。aws-doctor 通过以下策略优化:

  1. 批量查询:尽可能使用批量 API,如DescribeInstances一次获取所有实例信息
  2. 缓存机制:对不频繁变化的数据(如预留实例信息)实施本地缓存
  3. 并行处理:对独立资源类型的检测使用 goroutine 并行执行
  4. 增量扫描:记录上次扫描时间,只检查发生变化或新增的资源

可扩展架构设计

aws-doctor 的模块化设计支持功能扩展:

  1. 插件系统:可以通过实现ResourceChecker接口添加新的资源检测类型
  2. 输出格式扩展:当前支持终端输出,计划添加 CSV 和 PDF 导出功能
  3. 通知集成:可以扩展支持 Slack、Teams、Email 等通知渠道
  4. 自定义规则引擎:允许用户定义特定的成本优化规则

实际应用场景与最佳实践

开发环境成本控制

在开发环境中,资源经常被创建后遗忘。通过 aws-doctor 的定期扫描,可以:

  • 自动识别超过 7 天未使用的开发实例
  • 检测未关联的测试负载均衡器
  • 发现闲置的 RDS 测试实例

建议配置:每天运行一次浪费检测,阈值设置为 7 天。

生产环境优化审计

对于生产环境,重点在于性能与成本的平衡:

  • 每月执行一次全面的成本趋势分析
  • 季度性进行深度浪费检测(阈值 30 天)
  • 预留实例利用率监控,避免资源浪费

多团队账户治理

在大型组织中,aws-doctor 可以作为成本治理工具:

  • 为每个团队设置独立的检测配置
  • 生成团队级别的成本报告
  • 建立成本超支预警机制

局限性与未来发展方向

当前局限性

  1. 权限依赖:需要适当的 IAM 权限配置,过度授权可能带来安全风险
  2. API 速率限制:大规模账户可能遇到 AWS API 速率限制
  3. 区域性限制:某些检测可能不适用于所有 AWS 区域
  4. 资源覆盖范围:目前主要覆盖 EC2、EBS、ELB、RDS 等核心服务,其他服务支持有限

路线图展望

根据项目 README,aws-doctor 的未来发展包括:

  1. 报告导出功能:支持 CSV 和 PDF 格式的 "医疗记录" 导出
  2. 操作系统分发:计划在 Fedora、Ubuntu 和 macOS 软件仓库中分发
  3. 更多服务支持:扩展对 Lambda、S3、DynamoDB 等服务的优化建议
  4. 预测性分析:基于历史数据的成本预测和容量规划建议

结语

aws-doctor 作为一个开源工具,展示了如何通过简洁的 CLI 界面解决复杂的云成本管理问题。其基于 Go 的实现确保了高性能和易部署性,Cobra 框架提供了专业的命令行体验,而深入的 AWS API 集成则实现了真正有价值的成本优化建议。

对于 AWS 用户来说,无论是个人开发者还是企业团队,aws-doctor 都提供了一个低门槛的入口,开始系统化的云成本管理。通过定期运行和适当的配置,它可以显著降低云支出,同时提高资源利用率。

随着云计算的持续发展,这类自动化成本优化工具的重要性将日益凸显。aws-doctor 的开源模式也为社区贡献和功能扩展提供了良好基础,有望成为 AWS 生态中不可或缺的成本管理工具之一。

资料来源

  1. GitHub 仓库:https://github.com/elc0mpa/aws-doctor
  2. AWS Cost Explorer API 文档:https://docs.aws.amazon.com/ce/latest/APIReference/Welcome.html
查看归档