CloudFront Functions和Lambda@Edge区别:限制、成本与选型
Create Time:2026-08-18 15:24:46
浏览量
1048

1.png


CloudFront Functions 和 Lambda@Edge 都能在 Amazon CloudFront 的内容交付路径中运行代码,但它们并不是一大一小两个完全相同的产品。CloudFront Functions 面向极高频、极短时间、无需访问网络的轻量操作;Lambda@Edge 能处理更复杂的逻辑,并支持源站事件、网络访问和请求正文。

选型的关键不是“哪个功能更多”,而是代码需要在哪个事件阶段执行、是否要访问外部服务、是否读取请求正文,以及每次执行需要多少时间和内存。简单的 URL 重写如果放进 Lambda@Edge,通常会增加成本和运维复杂度;必须查询外部身份服务的逻辑如果放进 CloudFront Functions,则无法完成。

核心区别一览

比较项目CloudFront FunctionsLambda@Edge
可用事件Viewer Request、Viewer ResponseViewer Request、Viewer Response、Origin Request、Origin Response
运行位置CloudFront 边缘站点,适合亚毫秒级处理更接近访问者的 AWS 区域,能力更完整
运行时CloudFront JavaScript Runtime受支持的 Node.js 或 Python
最长执行时间1 毫秒Viewer 事件 5 秒;Origin 事件 30 秒
内存2 MBViewer 事件 128 MB;Origin 事件最高可配置 10,240 MB
代码或部署包10 KBViewer 事件 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不必为简单配置引入远程调用
调用身份服务或第三方 APILambda@Edge需要网络访问
读取或修改小型请求正文Lambda@EdgeCloudFront Functions 无法访问正文
回源前动态选择源站Lambda@Edge Origin RequestCloudFront Functions 没有 Origin 事件
复杂计算或较大依赖包Lambda@Edge,或放回源站需要更多时间、内存和代码空间

上线前检查清单

  1. 确认事件阶段:代码必须在缓存查找前、回源前、源站响应后,还是返回访问者前执行?

  2. 确认外部依赖:是否需要网络、请求正文、文件系统、环境变量或 Layer?

  3. 估算调用量:Viewer 事件可能对几乎每个请求执行,Origin 事件通常只在回源时执行。

  4. 测试缓存影响:URI、Header、Cookie 和查询字符串的修改都可能改变缓存命中或内容隔离。

  5. 设计失败策略:函数异常、超时或外部 API 不可用时,是拒绝、跳过还是回退?

  6. 准备多区域排障:使用 Lambda@Edge 时明确日志区域、告警和版本回滚流程。

  7. 保护敏感信息:不要把令牌、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 或重新评估是否应放在源站。上线前应以真实请求量估算费用,并测试缓存、安全、失败回退和日志流程。

参考资料

  1. AWS:选择 CloudFront Functions 或 Lambda@Edge,核查日期:2026-08-18

  2. AWS:CloudFront Functions 限制,核查日期:2026-08-18

  3. AWS:Lambda@Edge 限制,核查日期:2026-08-18

  4. AWS:Lambda@Edge 配额,核查日期:2026-08-18

  5. AWS:Amazon CloudFront 定价,核查日期:2026-08-18

  6. AWS:Lambda@Edge 产品与定价说明,核查日期:2026-08-18