使用函数在边缘进行自定义 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用函数在边缘进行自定义

借助 Amazon CloudFront,您可以编写自己的代码来自定义 CloudFront 分配如何处理 HTTP 请求和响应。该代码靠近查看器(用户)运行,以最大限度地减少延迟,而且您无需管理服务器或其他基础设施。您可以编写代码以操作通过 CloudFront 的请求和响应、执行基本身份验证和授权、在边缘生成 HTTP 响应等。

您编写并附加到 CloudFront 分配的代码称为边缘函数。CloudFront 提供了两种编写和管理边缘函数的方法:

  • CloudFront Functions – 借助 CloudFront Functions,您可以在 JavaScript 中编写轻量级函数,以实现大规模、延迟敏感的 CDN 自定义。CloudFront Functions 运行时环境提供亚毫秒的启动时间,可立即扩展,从而每秒处理数百万个请求,并且非常安全。CloudFront Functions 是 CloudFront 的原生功能,这意味着您可以完全在 CloudFront 中构建、测试和部署代码。

  • Lambda@Edge – Lambda@Edge 是 Amazon Lambda 的扩展,可为复杂的函数提供强大而灵活的计算,并带来更接近您的查看器的完整应用程序逻辑,并且具有高度安全性。Lambda@Edge 函数在 Node.js 或 Python 运行时环境中运行。您将函数发布到单个 Amazon 区域,当您关联该函数与 CloudFront 分配时,Lambda@Edge 可自动将您的代码复制到世界上任何地点。

在 CloudFront Functions 和 Lambda@Edge 之间进行选择

CloudFront Functions 和 Lambda@Edge 都提供了一种运行代码以响应 CloudFront 事件的方法。但是,它们之间有重要的区别。这些差异可以帮助您选择适合您自己的使用案例的服务。下表列出了 CloudFront Functions 与 Lambda@Edge 之间的一些重要区别。

CloudFront Functions Lambda@Edge
编程语言 JavaScript(兼容 ECMAScript 5.1) Node.js 和 Python
事件来源
  • 查看器请求

  • 查看器响应

  • 查看器请求

  • 查看器响应

  • 源请求

  • 源响应

Scale 每秒 10000000 个请求或更多 每个区域每秒最多 10000 个请求
函数持续时间 亚毫秒

最长 5 秒(查看器请求和查看器响应)

最长 30 秒(源请求和源响应)

最大内存 2MB 128 – 3008MB
函数代码和包含的库的最大大小 10 KB

1MB(查看器请求和查看器响应)

50MB(源请求和源响应)

网络访问
文件系统访问
访问请求正文
访问地理位置和设备数据

否(查看器请求)

是(源请求、源响应和查看器响应)

可以完全在 CloudFront 内构建和测试
函数日志记录和指标
定价 提供免费套餐;按请求收费 没有免费套餐;按请求和函数持续时间收费

CloudFront Functions 极其适合轻量级短期运行的函数,以用于以下使用案例等:

  • 缓存键归一化 – 您可以转变 HTTP 请求属性(标头、查询字符串、cookies,甚至是 URL 路径)以创建最佳缓存键,它可以提高您的缓存命中率。

  • 标头操作 – 您可以在请求或响应中插入、修改或删除 HTTP 标头。例如,您可以为每个请求添加 True-Client-IP 标头。

  • URL 重定向或重写 – 您可以根据请求中的信息将查看器重定向到其他页面,或者将所有请求从一个路径重写到另一个路径。

  • 请求授权 – 您可以通过检查授权标头或其他请求元数据来验证哈希授权令牌,例如 JSON Web 令牌 (JWT)。

要开始使用 CloudFront Functions,请参阅使用 CloudFront Functions 在边缘进行自定义

Lambda@Edge 非常适合以下场景:

  • 需要几毫秒或更长时间才能完成的函数。

  • 需要可调节 CPU 或内存的函数。

  • 依赖于第三方库(包括 Amazon 开发工具包,用于与其他 Amazon 服务集成)的函数。

  • 需要网络访问才能使用外部服务进行处理的函数。

  • 需要文件系统访问或访问 HTTP 请求正文的函数。

要开始使用 Lambda@Edge,请参阅使用 Lambda@Edge 在边缘进行自定义