
CloudFront Functions 和 Lambda@Edge 都能在 Amazon CloudFront 的内容交付路径中运行代码,但它们并不是一大一小两个完全相同的产品。CloudFront Functions 面向极高频、极短时间、无需访问网络的轻量操作;Lambda@Edge 能处理更复杂的逻辑,并支持源站事件、网络访问和请求正文。
选型的关键不是“哪个功能更多”,而是代码需要在哪个事件阶段执行、是否要访问外部服务、是否读取请求正文,以及每次执行需要多少时间和内存。简单的 URL 重写如果放进 Lambda@Edge,通常会增加成本和运维复杂度;必须查询外部身份服务的逻辑如果放进 CloudFront Functions,则无法完成。
核心区别一览
| 比较项目 | CloudFront Functions | Lambda@Edge |
|---|---|---|
| 可用事件 | Viewer Request、Viewer Response | Viewer Request、Viewer Response、Origin Request、Origin Response |
| 运行位置 | CloudFront 边缘站点,适合亚毫秒级处理 | 更接近访问者的 AWS 区域,能力更完整 |
| 运行时 | CloudFront JavaScript Runtime | 受支持的 Node.js 或 Python |
| 最长执行时间 | 1 毫秒 | Viewer 事件 5 秒;Origin 事件 30 秒 |
| 内存 | 2 MB | Viewer 事件 128 MB;Origin 事件最高可配置 10,240 MB |
| 代码或部署包 | 10 KB | Viewer 事件 1 MB;Origin 事件 50 MB |
| 网络访问 | 不支持 | 支持 |
| 请求正文 | 不能访问 | 可访问;Viewer Request 截断至 40 KB,Origin Request 截断至 1 MB |
| 典型用途 | 重定向、Header 处理、缓存键规范化、轻量鉴权 | 源站选择、网络调用、正文处理、复杂鉴权 |
简化判断:能够在 1 毫秒内,仅根据请求、响应和少量键值数据完成的逻辑,优先评估 CloudFront Functions;需要网络、请求正文、源站事件或更多计算资源时,再评估 Lambda@Edge。
CloudFront Functions 适合什么场景?
CloudFront Functions 位于访问者请求进入或离开 CloudFront 的阶段。它可以在缓存查找前修改 URI、查询字符串、Cookie 和 Header,也可以在响应返回访问者前调整响应 Header。由于执行点靠近访问者、启动快且单次调用成本低,它适合在大规模请求上运行确定性强的小段逻辑。
URL 重定向与重写
常见任务包括把旧路径重定向到新路径、统一大小写、补充或删除尾部斜杠,以及把不同语言入口映射到相应目录。若规则可以直接根据当前请求判断,不需要查询数据库或调用 API,通常无需使用 Lambda@Edge。
请求规范化与缓存优化
同一内容可能因为无关查询参数、Cookie 或 Header 形成多个缓存键。CloudFront Functions 可以先移除跟踪参数、统一参数顺序或规范化 Header,再让 CloudFront 查找缓存。这里必须谨慎:不能删除真正决定响应内容的参数,否则可能把错误版本提供给用户。
轻量访问控制
对于能够在本地完成的简单令牌检查、签名验证、国家或设备类型分流,可以评估 CloudFront Functions。需要少量动态配置时,可配合 CloudFront KeyValueStore。若鉴权必须实时访问身份提供商、数据库或其他 API,则应使用 Lambda@Edge、源站服务或其他架构。
Lambda@Edge 适合什么场景?
Lambda@Edge 除了 Viewer 事件,还能在 CloudFront 准备向源站请求以及收到源站响应时执行。它拥有更长执行时间、更大内存,并允许网络访问,因此适合 CloudFront Functions 无法承载的任务。不过,能力增加也意味着部署、日志排查和成本模型更复杂。
动态选择或修改源站
在 Origin Request 阶段,Lambda@Edge 可以根据路径、Header、Cookie 或业务规则修改源站请求。例如,将不同内容类型路由到不同源站,或实施自定义多源站路由。此类代码应考虑失败处理、超时和权限,避免让边缘逻辑成为新的故障点。
需要外部网络调用的鉴权
如果每次请求必须查询外部授权服务、获取远程配置或调用 API,CloudFront Functions 因没有网络访问能力而不适用。Lambda@Edge 可以执行网络请求,但外部依赖的延迟会直接影响访问者体验,也可能增加执行时长费用。应尽量缓存可缓存的验证结果,并为超时和服务不可用设计明确策略。
读取请求正文
Lambda@Edge 可以包含请求正文,但有大小限制:Viewer Request 的正文截断至 40 KB,Origin Request 截断至 1 MB。因此,它适合检查小型表单或有限的请求负载,不适合处理大文件上传。使用正文时还要测试 Base64 编码、内容长度以及修改后的源站行为。
部署与日志有什么不同?
CloudFront Functions 可在 CloudFront 中开发、测试并发布到 LIVE 阶段。函数日志集中写入 us-east-1 的 CloudWatch Logs。日志容量有限且交付可能受到限制,因此不应把大量业务数据写入每次调用的日志。
Lambda@Edge 函数必须在 us-east-1 创建,发布为带编号的版本后再关联到 CloudFront;不能使用 $LATEST 或别名。代码随后由 AWS 复制到执行区域。它的日志位于函数实际执行的 AWS 区域,全球业务排障时可能需要检查多个区域。
Lambda@Edge 还不支持自定义环境变量、Lambda Layers、VPC、容器镜像、预置并发和 arm64 架构。现有普通 Lambda 函数不能未经调整就直接假定可用于 Lambda@Edge。
两者如何计费?
按 AWS 当前公开价格,CloudFront Functions 的调用价格为每 100 万次 0.10 美元。Lambda@Edge 的请求价格为每 100 万次 0.60 美元,并另外按照分配内存和执行时间收取计算费用。实际账单还可能受免费额度、CloudFront 固定月费方案、折扣、税费和账号结构影响。
假设一个月执行 1 亿次,暂不考虑免费额度和折扣:
CloudFront Functions:100 × 0.10 美元,调用费约 10 美元。
Lambda@Edge:100 × 0.60 美元,请求费约 60 美元,另加执行时间与内存对应的计算费。
以上仅用于解释计费结构,不构成 AWS 或 CloudFlew 报价。实际费用以购买页面、AWS 账单规则和适用服务协议为准。
成本差异不能脱离需求讨论。如果函数必须联网,CloudFront Functions 即使价格更低也无法替代 Lambda@Edge;如果任务只是删除无关查询参数,用 Lambda@Edge 支付更高调用和计算费用通常没有必要。还应把日志、外部服务、源站请求和维护成本一起计入。
能否同时使用?
可以在同一个 CloudFront 分配中组合使用,但必须关联到兼容的不同事件阶段。AWS 不允许在同一缓存行为的同一 Viewer 事件上同时关联 CloudFront Function 和 Lambda@Edge。例如,可以让 CloudFront Function 在 Viewer Request 阶段规范化 URL,再让 Lambda@Edge 在 Origin Request 阶段选择源站。
组合时应保持职责单一:规范化规则只保留一份,鉴权结果使用明确的 Header 传递,并记录每个阶段允许修改的字段。否则同一 URI 可能经过多次重写,产生难以复现的缓存和路由问题。
实用选型表
| 需求 | 优先选择 | 原因 |
|---|---|---|
| URL 重定向、路径重写、Header 规范化 | CloudFront Functions | 逻辑轻量、请求频率高且不需要网络 |
| 清理查询参数、调整缓存键输入 | CloudFront Functions | 可在缓存查找前快速处理 |
| 基于少量键值配置分流 | CloudFront Functions + KeyValueStore | 不必为简单配置引入远程调用 |
| 调用身份服务或第三方 API | Lambda@Edge | 需要网络访问 |
| 读取或修改小型请求正文 | Lambda@Edge | CloudFront Functions 无法访问正文 |
| 回源前动态选择源站 | Lambda@Edge Origin Request | CloudFront Functions 没有 Origin 事件 |
| 复杂计算或较大依赖包 | Lambda@Edge,或放回源站 | 需要更多时间、内存和代码空间 |
上线前检查清单
确认事件阶段:代码必须在缓存查找前、回源前、源站响应后,还是返回访问者前执行?
确认外部依赖:是否需要网络、请求正文、文件系统、环境变量或 Layer?
估算调用量:Viewer 事件可能对几乎每个请求执行,Origin 事件通常只在回源时执行。
测试缓存影响:URI、Header、Cookie 和查询字符串的修改都可能改变缓存命中或内容隔离。
设计失败策略:函数异常、超时或外部 API 不可用时,是拒绝、跳过还是回退?
准备多区域排障:使用 Lambda@Edge 时明确日志区域、告警和版本回滚流程。
保护敏感信息:不要把令牌、Cookie、个人信息或密钥完整写入日志。
常见问题
CloudFront Functions 能调用 API 吗?
不能。它不支持网络访问。必须实时调用外部 API 时,应评估 Lambda@Edge、源站应用或其他服务;少量高频读取的配置可以评估 CloudFront KeyValueStore。
Lambda@Edge 可以使用环境变量和 Lambda Layer 吗?
不支持自定义环境变量,也不支持 Lambda Layers。部署前需要按 Lambda@Edge 的限制重新组织配置与依赖,敏感数据不应直接硬编码。
简单 JWT 验证应该选哪一个?
如果验证所需密钥可在函数或 KeyValueStore 中安全取得,且计算能在严格限制内完成,可以评估 CloudFront Functions。如果需要实时查询身份提供商、撤销列表或用户权限,则更适合 Lambda@Edge 或专门的鉴权服务。
谁的延迟更低?
对适配的轻量任务,CloudFront Functions 在边缘站点以亚毫秒级方式运行,通常处理开销更低。Lambda@Edge 提供更多能力,但网络调用、复杂逻辑和较长执行时间都会增加延迟。最终应使用接近真实流量的测试结果判断。
结论
CloudFront Functions 的优势是轻量、快速、低调用成本,适合在 Viewer 阶段处理 URL、Header、Cookie、查询参数和简单访问控制。Lambda@Edge 拥有 Origin 事件、网络访问、请求正文、更长执行时间和更多内存,适合源站路由、外部服务调用和复杂业务逻辑。
合理的顺序是先把需求缩小到最简单的实现:若 CloudFront Functions 的限制足够,就不必增加 Lambda@Edge 的部署与排障负担;若需求明确涉及网络、正文或源站阶段,则采用 Lambda@Edge 或重新评估是否应放在源站。上线前应以真实请求量估算费用,并测试缓存、安全、失败回退和日志流程。
参考资料
AWS:选择 CloudFront Functions 或 Lambda@Edge,核查日期:2026-08-18
AWS:CloudFront Functions 限制,核查日期:2026-08-18
AWS:Lambda@Edge 限制,核查日期:2026-08-18
AWS:Lambda@Edge 配额,核查日期:2026-08-18
AWS:Amazon CloudFront 定价,核查日期:2026-08-18
AWS:Lambda@Edge 产品与定价说明,核查日期:2026-08-18