You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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日志存储桶来统计占比:

  1. 在Athena中创建对应S3日志的表结构(参考标准S3访问日志字段定义);
  2. 执行以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:13:15