月度账单里 GET 请求 2100 万次,费用比上月多 800 元。业务量没变,对象总数只有四十万。乍看像缓存或者权限的锅,追下去往往不是。
aws s3api get-bucket-logging --bucket b aws s3api list-objects-v2 --bucket b --prefix a/ --max-keys 10 # 统计日志里的 REST.GET.BUCKET 次数
追下去是这么回事:有些代码在每个请求里都调 ListObjects 判断文件是否存在,一次列一千个 key。列表请求按次计费,量一大就体现在账单上。结果没做缓存,重复请求全落到服务端。
「对象存储费用异常」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,打开访问日志 按操作类型和来源统计请求数;把存在性判断换成 head-object 单 key 请求;列表结果加本地缓存 设置合理过期时间;分页拉全量改成按前缀精确取。
验收就看一点,下一周 GET 请求数下降一个数量级,账单回到正常区间。
