如何在S3访问日志中识别CloudFront请求?
如何在S3存储桶访问日志中区分CloudFront与直接访问请求
要区分S3日志中来自CloudFront的请求和直接访问请求,主要有两种可靠方式,结合日志字段即可实现:
1. 检查x-amz-cf-id字段
当CloudFront向S3转发请求时,会自动在请求头中添加x-amz-cf-id(CloudFront请求ID)。在标准S3访问日志里,这个字段会出现在扩展头区域(具体位置随日志格式略有差异,但一定会被记录):
- 日志中存在
x-amz-cf-id字段的请求,可直接判定为来自CloudFront; - 无此字段的请求,即为直接通过S3 API、控制台或对象URL发起的访问。
2. 匹配CloudFront IP地址段
CloudFront的边缘节点IP范围是公开维护的,可通过匹配日志中的c-ip(客户端IP)字段判断:
- 若
c-ip属于CloudFront的IP段,则请求来自CloudFront; - 否则为直接访问。
这种方法适合因配置问题导致x-amz-cf-id未被记录的场景,但需定期更新IP范围列表,因为AWS会动态调整CloudFront的节点IP。
统计访问占比的实操方法
推荐使用AWS Athena直接查询S3日志存储桶来统计占比:
- 在Athena中创建对应S3日志的表结构(参考标准S3访问日志字段定义);
- 执行以下SQL查询:
WITH request_type AS ( SELECT CASE WHEN cs_headers LIKE '%x-amz-cf-id%' THEN 'CloudFront' ELSE 'Direct' END AS access_type FROM s3_access_logs_table ) SELECT access_type, COUNT(*) AS request_count, ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM request_type), 2) AS percentage FROM request_type GROUP BY access_type;
若采用IP段匹配,可将CASE条件替换为c_ip与CloudFront IP范围的匹配逻辑,比如通过JOIN预导入的IP范围表实现高效查询。
注意:若CloudFront配置了自定义源请求头,需确保未移除x-amz-cf-id,否则该字段不会出现在S3日志中;直接访问的请求通常来自AWS控制台、SDK调用或用户直接访问S3对象URL的场景。
内容的提问来源于stack exchange,提问作者benjimin
相关产品推荐
相关产品推荐

