云存储成本失控?用Shell脚本构建自动化费用监控体系
📖 目录导读
- 为什么需要自动化监控云存储费用?
- 云存储费用构成与关键监控指标
- 基于Shell脚本的费用监控方案设计
- 核心脚本实现:从API调用到告警通知
- 实战案例:AWS S3与阿里云OSS费用监控脚本
- 常见问题与优化策略(含问答)
- 持续集成与扩展建议
为什么需要自动化监控云存储费用?
随着企业上云深入,云存储费用常成为“隐性增长黑洞”,人工查看账单不仅低效,还容易错过突发成本激增。Shell脚本监控方案的核心价值在于:

- 低成本:无需额外购买第三方监控工具,纯脚本即可实现
- 可定制:按需设置阈值、频率、通知渠道
- 审计友好:自动生成每日/每周费用报表,支持成本归因
根据Gartner报告,采用自动化费用监控的企业,云成本平均降低23%~30%,而Shell脚本正是入门级、最灵活的实现方式。
云存储费用构成与关键监控指标
要监控费用,首先理解云存储账单的常见组成部分:
| 费用类型 | 典型计算方式 | 监控重点 |
|---|---|---|
| 存储费 | 按GB/月计费(标准/低频/归档) | 总存储量变化趋势 |
| API请求费 | PUT/GET/LIST按次数计费 | 异常请求峰值 |
| 流量费 | 出站流量(特别是跨区域或公网) | 出站带宽突增 |
| 数据检索费 | 低频/归档层读取数据产生 | 检索频率异常 |
关键指标:日存储量(GB)、日API请求次数、日出站流量(GB)、预估日费用(USD)。
基于Shell脚本的费用监控方案设计
1 技术选型
- 云服务商API:AWS CLI / 阿里云CLI / 腾讯云API
- 脚本语言:Bash (兼容sh)
- 数据存储:本地CSV日志文件(轻量级)
- 通知方式:邮件(Sendmail)、钉钉/企业微信Webhook、Telegram Bot
2 监控流程
[定时任务(crontab)] -> [Shell脚本] -> [调用云API获取费用数据]
-> [与阈值比较] -> [超阈值则发送告警] -> [记录日志到CSV]
3 阈值策略建议
- 告警阈值:日费用超过过去7天平均值的150%
- 警告阈值:单日存储量增长超过10%
- 紧急阈值:出站流量超过每日配额80%
核心脚本实现:从API调用到告警通知
1 基础框架模板
#!/bin/bash
# 云存储费用监控脚本 v2.0
# 配置文件路径
CONFIG_FILE="~/.cloud_cost_monitor.conf"
LOG_FILE="/var/log/cloud_cost_monitor.csv"
source $CONFIG_FILE # 存放阈值、通知方式等参数
# 函数:调用云API获取当日费用
get_daily_cost() {
# 以AWS S3为例,需先配置aws-cli
aws ce get-cost-and-usage \
--time-period Start=$(date +%Y-%m-%d),End=$(date +%Y-%m-%d) \
--granularity DAILY \
--metrics "BlendedCost" \
--query "ResultsByTime[0].Total.BlendedCost.Amount" \
--output text 2>/dev/null || echo "0"
}
# 函数:发送钉钉通知
send_dingtalk_notification() {
local msg=$1
curl -s -X POST "$DINGTALK_WEBHOOK" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[云费用告警] $msg\"}}"
}
# 主逻辑
DAILY_COST=$(get_daily_cost)
if (( $(echo "$DAILY_COST > $COST_THRESHOLD" | bc -l) )); then
send_dingtalk_notification "当日费用_$DAILY_COST_元,超过阈值_$COST_THRESHOLD"
fi
echo "$(date +%F),$DAILY_COST" >> $LOG_FILE
2 配置参数示例(.conf文件)
# 阈值设置 COST_THRESHOLD=50.0 # 日费用超过50元告警 STORAGE_THRESHOLD=1000 # 存储量超过1000GB告警 # 通知配置 DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" # 云服务商区域 REGION="cn-northwest-1"
3 高级功能:数据趋势分析
# 计算过去7天平均费用(用于动态阈值)
get_avg_cost_7days() {
tail -7 $LOG_FILE | awk -F',' '{sum+=$2} END {printf "%.2f", sum/7}'
}
# 检查增长率
if (( $(echo "$DAILY_COST > $(get_avg_cost_7days) * 1.5" | bc -l) )); then
send_dingtalk_notification "费用增长异常!今日费用$DAILY_COST,是7日平均的$(get_avg_cost_7days)倍"
fi
实战案例:AWS S3与阿里云OSS费用监控脚本
1 AWS S3费用监控(需预装awscli并配置凭证)
#!/bin/bash
# AWS S3月度预估费用监控
aws ce get-cost-and-usage \
--time-period Start=$(date +%Y-%m-01),End=$(date +%Y-%m-%d) \
--granularity MONTHLY \
--metrics "BlendedCost" \
--group-by Type=DIMENSION,Key=SERVICE \
--filter '{"Dimensions": {"Key": "SERVICE", "Values": ["Amazon Simple Storage Service"]}}' \
--query "ResultsByTime[0].Groups[0].Metrics.BlendedCost.Amount" \
--output text
2 阿里云OSS费用监控(需安装aliyun-cli)
#!/bin/bash
# 阿里云OSS存储量监控
ALI_ACCESS_KEY="LTAI5t***"
ALI_SECRET_KEY="xxxxxxxxxx"
# 获取Bucket存储量
aliyun oss du oss://your-bucket --output json | jq -r '.size'
# 获取计费信息(需开通Billing API)
aliyun bss:DescribeInstanceBill \
--BillingCycle $(date +%Y-%m) \
--ProductCode "oss" \
--Region "cn-hangzhou" \
--query "Data.Items[].[DeductedByCashCoupons, DeductedByPrepaidCard]" \
--output text | awk '{sum+=$1+$2} END {printf "%.2f", sum}'
3 腾讯COS费用监控(使用COSCMD工具)
#!/bin/bash
# 腾讯云COS存储量及请求数
coscmd list -a | grep "Total size" | awk '{print $3}'
# 通过云监控API获取请求次数(需计算COS API调用)
常见问题与优化策略
Q&A 问答
Q1:Shell脚本如何获取不同云厂商的账单数据?
A:每个云服务商都提供CLI工具或REST API,统一思路:先安装对应CLI工具,配置AK/SK,然后通过--query参数过滤出存储相关费用,建议将不同厂商的调用封装成独立函数,便于复用。
Q2:脚本运行频率如何设置?
A:建议:
- 日费用告警:每天定时运行一次(如上午10点)
- 存储量监控:每6小时一次
- 流量监控:每1小时一次(特别是业务高峰期)
使用crontab实现:0 10 * * * /path/to/cost_monitor.sh # 每天10点执行 */60 * * * * /path/to/traffic_monitor.sh # 每小时执行
Q3:如何避免因API调用产生的额外费用?
A:大多数云服务商的成本管理API是免费调用的,但请注意:
- AWS Cost Explorer API每月前部分请求免费,超出后0.01美元/1000次——对监控脚本来说成本极低
- 建议缓存上次获取的数据,仅在必要时重新查询
Q4:脚本输出结果如何可视化?
A:推荐方案:
- 将日志写入Grafana的Prometheus指标(通过
curl发送pushgateway) - 本地用
gnuplot生成趋势图(适合内网环境) - 输出为Markdown格式,通过邮件发送包含表格的报告
Q5:如果云服务API返回格式变化怎么办?
A:采用“先验证后执行”策略:
# 在脚本中添加API响应格式检查
response=$(aws ce get-cost-and-usage ...)
if ! echo "$response" | jq -e '.ResultsByTime[0]' > /dev/null 2>&1; then
send_dingtalk_notification "API响应格式异常,请检查配置"
exit 1
fi
持续集成与扩展建议
1 企业级扩展方向
- 集成Prometheus + Alertmanager:将Shell脚本作为指标导出器,实现全天候告警
- 多账号聚合监控:使用
assume_role(AWS)或RAM角色(阿里云)统一采集 - 成本预测模型:基于历史数据,用
ml库(如Python SciPy)预测下月费用
2 运维注意事项
- 密钥安全:使用环境变量或密钥管理服务(如AWS Secrets Manager)存储AK/SK
- 错误重试:添加
retry机制,网络波动时自动重试3次 - 日志轮转:设置
logrotate,防止日志文件无限增长
3 开源生态参考
- Cloud-Cost-Monitor(GitHub相关项目)
cost-optimization-hub(AWS解决方案)finops-toolkit(微软Azure)
延伸阅读:若需可视化界面,可结合
Grafana与InfluxDB,将Shell脚本采集的数据压入时序数据库,企业级用户可参考《FinOps云成本优化实战》中的自动化成本治理框架。