如何获取S3或CloudFront单文件成本及高下载量文件统计?
解决S3+CloudFront静态站成本优化的两个关键问题
嘿,我来帮你搞定这两个成本优化相关的问题,正好我之前给几个静态站点做过类似的成本分析和优化,分享下实操方法:
一、找出下载量最高的文件
因为你的站点是通过CloudFront分发的,优先看CloudFront的访问日志(大部分请求会走CDN,S3日志只会记录回源请求,数据不全),具体步骤如下:
- 开启CloudFront标准访问日志:在CloudFront分发的「日志」设置里,指定一个S3桶来存储日志(可以是现有站点桶的子目录,或者单独的日志桶),确保日志格式包含
cs-uri-stem(请求的文件路径)字段。 - 用Athena分析日志:
- 到Athena控制台,创建一个指向CloudFront日志存储路径的表(可以用AWS提供的CloudFront日志表模板快速生成)。
- 执行查询SQL来统计每个文件的请求量,示例:
SELECT cs_uri_stem, COUNT(*) AS request_count FROM your_cloudfront_log_table WHERE date >= '2024-01-01' AND date <= '2024-01-31' -- 替换成你要统计的时间范围 GROUP BY cs_uri_stem ORDER BY request_count DESC LIMIT 20;
如果想补充看S3的回源请求情况(比如哪些文件缓存命中率低、频繁回源),可以开启S3访问日志,同样用Athena分析cs-object-key字段的请求数。
二、计算单文件的成本
单文件的成本由CloudFront成本和S3关联成本两部分组成,得拆分来算:
1. CloudFront部分成本
CloudFront的收费项主要是:
- 请求数费用:按HTTP/HTTPS请求的数量计费,不同区域单价不同(比如美国东部区域的HTTPS请求单价约$0.000012/次)。
- 数据输出费用:分为「边缘到用户的流量」和「回源到S3的流量」(回源到同区域S3的流量免费,跨区域会收费)。
你可以从CloudFront日志里提取该文件的总请求数、总边缘输出流量(sc-bytes字段)、总回源流量(若日志开启回源字段),再乘以对应区域的单价。
2. S3部分成本
S3的关联成本主要是:
- 存储成本:该文件占用的存储空间乘以对应存储类的单价(比如标准存储约$0.023/GB/月)。
- 回源请求成本:CloudFront回源到S3的请求数(比如GET请求单价约$0.0004/1000次)。
举个计算例子
假设你的某个文件/main.js:
- 当月CloudFront请求数10万次,边缘输出流量5GB,回源请求1000次(缓存命中率99%)
- S3存储占用1MB,用标准存储
那么成本大概是: - CloudFront请求费:100000 * $0.000012 = $1.2
- CloudFront边缘流量费:5GB * $0.085(美国东部区域单价)= $0.425
- S3回源请求费:1000 * ($0.0004/1000) = $0.0004
- S3存储费:(1/1024)GB * $0.023 ≈ $0.000022
总成本≈$1.625
额外的成本优化小建议
- 给高下载量的文件开启Gzip/Brotli压缩,减少流量输出成本。
- 调整CloudFront缓存策略,给静态文件设置更长的TTL(比如图片、JS/CSS设为30天),提高缓存命中率,减少回源请求。
- 把访问量低的文件移到S3低频存储(Infrequent Access)或冰川存储,降低存储成本。
内容的提问来源于stack exchange,提问作者casolorz
相关产品推荐
相关产品推荐

