AWS Patrol
自动化AWS基础设施监控、安全审计和成本分析,生成可视化报告。
前置条件
Python 3.8+,配置boto3 AWS凭据(配置文件或环境变量)
Node.js + Puppeteer(用于截图生成)
所需AWS权限:
ReadOnlyAccess(EC2、RDS、ELB、CloudWatch、IAM、S3、Cost Explorer、Savings Plans、Health、Pinpoint SMS)
配置(环境变量)
变量 默认值 描述
AWS_PATROL_PROFILE AWS_PROFILE 或默认AWS配置文件名
AWS_PATROL_REGIONS us-west-2,eu-west-2,ap-southeast-1 逗号分隔的区域
AWS_PATROL_OUTPUT 当前目录 JSON/HTML/PNG输出目录
工作流程
python3 scripts/patrol.py
输出aws-patrol-detail.json,包含:
EC2:CPU、网络、状态检查(如果CPU>80%或状态检查失败则触发警报)
RDS:CPU、内存、连接、存储、IOPS(如果CPU>80%、内存不足、存储不足则触发警报)
ELB:目标组健康、不健康目标
CloudWatch报警(ALARM状态)
AWS Health事件(最近7天)
SMS/Pinpoint发送者注册状态
python3 scripts/patrol-security-cost.py
输出aws-security-cost.json,包含:
安全:IAM用户没有MFA、旧访问密钥(>90天)、开放安全组(0.0.0.0/0在敏感端口)、未加密EBS、公共S3存储桶
成本:30天总计和每日趋势、SP利用率和覆盖率(7天每日)、RDS/ElastiCache RI覆盖率、活动SP和RI、浪费检测(停止实例、未附加卷、未使用EIP、旧快照、低CPU实例)
python3 scripts/gen-report.py ''
接受一个JSON参数,包含字段:
date、weekday、ec2Count、rdsCount、elbCount
costTotal、costDaily、unattachedVol、unusedEip、lowCpu、oldSnap
spUtilPct、spCovPct、rdsRiPct、ecRiPct
noMfa、unencEbs、openSg、oldKeys、s3Risk
highCpu(数组:{name、cpu、type、level})
spRiDetails(字符串摘要)
health(数组:{type、title、desc})
sms(数组:{name、status、level})
actions(数组:{date、level、title、desc、daysLeft、daysLevel})
输出daily-report.html。
# 启动HTTP服务器
python3 -m http.server 18923 &
# 截图
node -e "const p=require('puppeteer');(async()=>{const b=await p.launch({headless:'new',args:['--no-sandbox']});const pg=await b.newPage();await pg.setViewport({width:520,height:800,deviceScaleFactor:2});await pg.goto('http://localhost:18923/daily-report.html',{waitUntil:'networkidle0'});await pg.screenshot({path:'daily-report.png',fullPage:true});await b.close()})()"
# 停止服务器
kill %1
通过消息发送daily-report.png,附带简要摘要。
调度(Cron示例)
设置每天9:00的巡检任务,通过OpenClaw cron(系统事件→主会话):
每天 9:00 运行aws-patrol巡检流程,采集数据 → 生成报告 → 截图推送
异常调查
当检测到高CPU、Health报警或SMS问题时,不仅要报告数字,还要调查根本原因(检查CloudWatch趋势、最近部署、进程级指标),并将分析结果包含在报告中。