使用 CloudFront Functions 将自定义数据写入 CloudFront 访问日志

使用 CloudFront Functions 将自定义数据写入 CloudFront 访问日志

💡 原文中文,约3300字,阅读约需8分钟。
📝

内容提要

CloudFront Functions新增cf.logCustomData()方法,可将自定义数据写入访问日志。示例展示如何记录查询字符串中的流量来源(如utm_source),需配置日志字段并验证结果。该方法无额外费用,数据自动URL编码,每字段最多800字节,多次调用仅保留最后值,且不支持嵌入式接入点。适用于A/B测试、鉴权分类等场景,但需避免记录敏感信息。

🔎

延伸解读

与 console.log() 的定位差异

cf.logCustomData() 与 console.log() 用途不同:前者将数据写入访问日志,便于与请求结果关联分析;后者仍用于开发和故障排查。选择时需根据场景判断,若需结合 URI、状态码等分析函数决策,应使用前者。

配置要点与常见误区

启用自定义日志字段是关键步骤,若未在标准日志记录(v2)的 Field selection 中选择 viewer-request-log-data,即使函数调用也不会输出。实时日志需单独配置且采样率低于 100% 时可能丢失请求。验证时需核对 x-amz-cf-id 与 x-edge-request-id 的一致性。

数据限制与安全提醒

每个字段最多 800 字节,超出截断;多次调用仅保留最后值,需合并写入。数据自动 URL 编码,注意解码。严禁记录密码、Authorization 头、会话 Cookie、JWT、API 密钥等敏感信息,避免安全风险。

Q&A

CloudFront Functions 新增的 cf.logCustomData() 方法有什么作用?

cf.logCustomData() 是 CloudFront Functions 新增的辅助方法,可以将函数产生的自定义数据(如业务决策或提取的字段)写入当前请求的 CloudFront 访问日志,与 URI、状态码和缓存结果保存在同一条记录中,便于后续分析。

如何使用 CloudFront Functions 记录查询字符串中的 utm_source 参数?

创建一个使用 JavaScript 运行时 2.0 的 CloudFront Function,在查看器请求事件中调用 cf.logCustomData(),将提取的 utm_source 和 gclid 值以 JSON 字符串形式传入。发布函数并关联到目标缓存行为的查看器请求事件,然后在标准日志记录(v2)的字段选择中加入 viewer-request-log-data,并配置日志目的地。

cf.logCustomData() 写入的数据会出现在 CloudFront 访问日志的哪个字段?

对于查看器请求函数,数据写入 viewer-request-log-data 字段;对于查看器响应函数,写入 viewer-response-log-data 字段。标准日志记录(v2)和实时日志均支持这两个字段。

使用 cf.logCustomData() 有哪些限制和注意事项?

注意事项包括:方法只接受一个字符串,对象需先 JSON.stringify();数据自动 URL 编码,每字段最多 800 字节,超出截断;单次执行多次调用只保留最后一个值;未调用或未选择日志字段时值为 '-' 或不出现在输出中;嵌入式接入点不支持;不要记录敏感信息如密码、Authorization 请求头、会话 Cookie、JWT、API 密钥或个人身份信息。

cf.logCustomData() 会产生额外费用吗?

不会。调用 cf.logCustomData() 不产生额外费用,CloudFront Functions、访问日志和投递服务仍按各自方式计费。

cf.logCustomData() 与 console.log() 有什么区别?

cf.logCustomData() 将数据写入 CloudFront 访问日志,与请求记录关联,适合生产环境分析;console.log() 写入 CloudWatch Logs,适合开发和故障排查。两者用途不同。

cf.logCustomData() 可以用于哪些场景?

可以用于记录流量来源(如 utm_source)、A/B 测试的实验名称和分组、鉴权结果分类(不记录凭证)、URL 重写或源站路由策略、机器人分类、缓存键维度或业务跟踪 ID,以及查看器响应函数产生的内容版本等。

🏷️

标签

➡️

继续阅读