Shell脚本如何监控云存储费用支出

wen 实用脚本 1

云存储成本失控?用Shell脚本构建自动化费用监控体系

📖 目录导读

  • 为什么需要自动化监控云存储费用?
  • 云存储费用构成与关键监控指标
  • 基于Shell脚本的费用监控方案设计
  • 核心脚本实现:从API调用到告警通知
  • 实战案例:AWS S3与阿里云OSS费用监控脚本
  • 常见问题与优化策略(含问答)
  • 持续集成与扩展建议

为什么需要自动化监控云存储费用?

随着企业上云深入,云存储费用常成为“隐性增长黑洞”,人工查看账单不仅低效,还容易错过突发成本激增。Shell脚本监控方案的核心价值在于:

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:推荐方案:

  1. 将日志写入Grafana的Prometheus指标(通过curl发送pushgateway)
  2. 本地用gnuplot生成趋势图(适合内网环境)
  3. 输出为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)

延伸阅读:若需可视化界面,可结合GrafanaInfluxDB,将Shell脚本采集的数据压入时序数据库,企业级用户可参考《FinOps云成本优化实战》中的自动化成本治理框架。

抱歉,评论功能暂时关闭!