边缘函数的限制 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

边缘函数的限制

以下主题描述了适用于 CloudFront Functions 和 Lambda@Edge 的限制。一些限制适用于所有边缘函数,而另一些限制仅适用于 CloudFront Functions 或 Lambda@Edge。

有关配额(以前被称为限制)的更多信息,请参阅 CloudFront Functions 的配额有关 Lambda@Edge 的配额

所有边缘函数的限制

以下限制适用于所有边缘函数,包括 CloudFront Functions 和 Lambda@Edge。

Amazon Web Services 账户 所有权

要将边缘函数与 CloudFront 分配相关联,该函数和分配必须属于相同的 Amazon Web Services 账户 。

组合 CloudFront Functions 与 Lambda@Edge

对于给定缓存行为,将适用以下限制将适用:

  • 每个事件类型(查看器请求、源请求、源响应和查看器响应)只能有一个边缘函数关联。

  • 您不能在查看器事件(查看器请求和查看器响应)中组合 CloudFront Functions 和 Lambda@Edge。

允许使用边缘函数的所有其他组合。下表介绍了允许的组合。

CloudFront Functions

查看器请求

查看器响应

Lambda@Edge

查看器请求

不允许

不允许

源请求

已允许

已允许

源响应

已允许

已允许

查看器响应

不允许

不允许

HTTP 状态代码

如果源返回 400 或更高的 HTTP 状态代码,则 CloudFront 不会对查看器响应事件调用边缘函数。

查看器响应事件的边缘函数无法修改响应的 HTTP 状态代码,无论响应是来自源还是 CloudFront 缓存。

用于源响应事件的 Lambda@Edge 函数被调用于全部源响应,包括源返回 400 或更高的 HTTP 状态代码。有关更多信息,请参阅 更新源响应触发器中的 HTTP 响应

HTTP 标头

不允许使用某些 HTTP 标头,这意味着这些标头不会向边缘函数公开,并且函数无法添加它们。其他标头是只读的,这意味着函数可以读取它们,但不能添加或修改它们。

不允许使用的标头

以下 HTTP 标头会对边缘函数公开,并且函数无法添加它们。如果您的函数添加这些标头的其中之一,则请求将无法通过 CloudFront 验证,并且 CloudFront 会将 HTTP 状态代码 502(无效网关)返回给查看器。

  • Connection

  • Expect

  • Keep-Alive

  • Proxy-Authenticate

  • Proxy-Authorization

  • Proxy-Connection

  • Trailer

  • Upgrade

  • X-Accel-Buffering

  • X-Accel-Charset

  • X-Accel-Limit-Rate

  • X-Accel-Redirect

  • X-Amz-Cf-*

  • X-Amzn-*

  • X-Cache

  • X-Edge-*

  • X-Forwarded-Proto

  • X-Real-IP

只读标头

以下标头是只读的。您的函数可以读取这些标头,并并将其用作函数逻辑输入,但无法更改这些值。如果您的函数添加或编辑一个只读标头,请求将无法通过 CloudFront 验证,并且 CloudFront 将 HTTP 状态代码 502(无效网关)返回到查看器。

查看器请求事件中的只读标头

以下标头在查看器请求事件中为只读标头。

  • Content-Length

  • Host

  • Transfer-Encoding

  • Via

源请求事件中的只读标头(仅限 Lambda@Edge)

以下标头在源请求事件中是只读的,它们仅存在于 Lambda@Edge 中。

  • Accept-Encoding

  • Content-Length

  • If-Modified-Since

  • If-None-Match

  • If-Range

  • If-Unmodified-Since

  • Transfer-Encoding

  • Via

源响应事件中的只读标头(仅限 Lambda@Edge)

以下标头在源响应事件中是只读的,它们仅存在于 Lambda@Edge 中。

  • Transfer-Encoding

  • Via

查看器响应事件中的只读标头

以下标头在查看器响应事件中为只读标头。

  • Content-Encoding

  • Content-Length

  • Transfer-Encoding

  • Warning

  • Via

查询字符串

以下限制适用于在请求 URI 中读取、更新或创建查询字符串的函数。

  • (仅限 Lambda@Edge)要访问源请求或源响应函数中的查询字符串,您的缓存策略或源请求策略必须针对查询字符串设置为 All

  • 函数可以为查看器请求和源请求事件创建或更新查询字符串(源请求事件仅在 Lambda@Edge 中存在)。

  • 函数可以为源响应和查看器响应事件读取查询字符串,但不能创建或更新查询字符串(源响应事件仅在 Lambda@Edge 中存在)。

  • 如果函数创建或更新查询字符串,则具有以下限制:

    • 查询字符串不能包含空格、控制字符或片段标识符 (#)。

    • URI(包括查询字符串)的总大小必须小于 8192 个字符。

    • 我们建议您对 URI 和查询字符串使用百分号编码。有关更多信息,请参阅 URI 和查询字符串编码

URI

如果某个函数更改请求的 URI,则这样不会更改该请求或该请求转发到的源的缓存行为。

URI(包括查询字符串)的总大小必须小于 8192 个字符。

URI 和查询字符串编码

传递给边缘函数的 URI 和查询字符串值是 UTF-8 编码。您的函数应该对其返回的 URI 和查询字符串值使用 UTF-8 编码。百分号编码与 UTF-8 编码兼容。

下面的列表说明了 CloudFront 如何处理 URI 和查询字符串值编码:

  • 如果请求中的值是 UTF-8 编码,则 CloudFront 会将值转发给您的函数,而不会更改它们。

  • 如果请求中的值为 ISO-8859-1 编码,CloudFront 会将值转换为 UTF-8 编码,然后再将值转发给您的函数。

  • 如果请求中的值使用任何其他字符编码进行编码,则 CloudFront 会假定它们是 ISO-8859-1 编码,并尝试从 ISO-8859-1 编码转换为 UTF-8 编码。

    重要

    转换后字符可能是原始请求中的值的不准确解释。这可能会导致您的函数或源生成意外结果。

CloudFront 转发到源的 URI 和查询字符串值取决于函数是否更改了值:

  • 如果函数没有更改 URI 或查询字符串,CloudFront 将其在请求中收到的值转发到源。

  • 如果函数更改了 URI 或查询字符串,CloudFront 转发 UTF-8 编码的值。

Microsoft 平滑流

您无法将用于点播视频 (VOD) 流式传输媒体文件(已转码为 Microsoft 平滑流格式)的 CloudFront 分配与边缘函数一同使用。

Tagging

您无法将标签添加到边缘函数中。要了解有关在 CloudFront 中进行标记的更多信息,请参阅标记 Amazon CloudFront 分配

对 CloudFront Functions 的限制

以下限制仅适用于 CloudFront Functions。

Logs

CloudFront Functions 中的函数日志被截断为 10 KB。

请求正文

CloudFront Functions 无法访问 HTTP 请求的正文。

Runtime

CloudFront Functions 运行时环境不支持动态代码评估,它限制了对网络、文件系统和计时器的访问。有关更多信息,请参阅 受限功能

计算利用率

CloudFront Functions 对运行时间有限制,测量方式为计算利用率。计算利用率是介于 0 到 100 之间的数字,表示函数运行所花费的时间占最大允许时间的百分比。例如,计算利用率为 35 表示函数在最大允许时间的 35% 内完成。

当您测试函数时,您可以在测试事件的输出中看到计算利用率值。对于生产函数,您可以在 CloudFront 控制台中的监控页面或在 CloudWatch 中查看计算利用率指标

对 Lambda@Edge 的限制

以下限制仅适用于 Lambda@Edge。

Lambda 函数版本

您必须使用带编号的 Lambda 函数,而不是 $LATEST 或别名。

Lambda 区域

Lambda 函数必须位于美国东部(弗吉尼亚北部)区域。

Lambda 角色权限

与 Lambda 函数关联的 IAM 执行角色必须由服务委托人 lambda.amazonaws.comedgelambda.amazonaws.com 担任。有关更多信息,请参阅 设置 Lambda@Edge 的 IAM 权限和角色

Lambda 功能和支持的运行时

Lambda@Edge 不支持以下 Lambda 功能:

Lambda@Edge 支持具有以下运行时的 Lambda 函数:

Node.js

Python

  • Node.js 14

  • Node.js 12

  • Node.js 10²

  • Node.js 8¹

  • Node.js 6¹

  • Python 3.8

  • Python 3.7

¹此版本的 Node.js 使用寿命已结束。您无法使用此版本创建或更新函数。如果您有使用此版本的现有函数,则可以将其与 CloudFront 分配相关联。已与分配关联的此版本的函数将继续运行。但是,我们建议将您的函数转移到更新版本的 Node.js。有关更多信息,请参阅 Amazon Lambda 开发人员指南中的运行时支持策略GitHub 上的 Node.js 发布计划

²这个版本的 Node.js 使用寿命已结束,并于 2021 年 8 月 30 日在 Lambda 中结束第 2 阶段的支持。从 2021 年 8 月 30 日开始,您无法使用此版本创建或更新函数。如果您有使用此版本的现有函数,则可以将其与 CloudFront 分配相关联。已与分配关联的此版本的函数将继续运行。但是,我们建议将您的函数转移到更新版本的 Node.js。有关更多信息,请参阅 Amazon Lambda 开发人员指南中的运行时支持策略GitHub 上的 Node.js 发布计划

CloudFront 标头

Lambda@Edge 函数可以读取、编辑、删除或添加以下 CloudFront 标头。

  • CloudFront-Forwarded-Proto

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

  • CloudFront-Viewer-Country¹

请注意以下几点:

  • 如果您希望 CloudFront 添加这些标头,则必须将 CloudFront 配置为使用缓存策略或者源请求策略

  • CloudFront 在查看器请求事件后添加标题,这意味着它们在查看器请求函数中不可用于 Lambda@Edge。

  • 如果查看器请求包含具有这些名称的标头,并且您将 CloudFront 配置为使用缓存策略或者源请求策略添加这些标头,则 CloudFront 会覆盖查看器请求中的标头值。面向查看器的函数可以看到查看器请求中的标头值,而面向源的函数则看到 CloudFront 添加的标头值。

  • ¹CloudFront-Viewer-Country 标头 – 如果查看器请求函数添加此标头,请求将无法通过验证,并且 CloudFront 将 HTTP 状态代码 502(无效网关)返回到查看器。

具有 Include Body(包含正文)选项的请求正文的限制

在选择 Include Body (包含正文) 选项以向您的 Lambda@Edge 函数公开请求正文时,以下信息和大小配额适用于公开或替换的正文部分。

  • CloudFront 总是对请求正文进行 base64 编码,然后再将其公开给 Lambda@Edge。

  • 如果请求正文很大,则 CloudFront 在将正文公开给 Lambda@Edge 之前将其截断,如下所示:

    • 对于查看器请求事件,正文将截断为 40 KB。

    • 对于源请求事件,正文将截断为 1 MB。

  • 如果以只读方式访问请求正文,则 CloudFront 将完整的原始请求正文发送到源。

  • 如果您的 Lambda@Edge 函数替换请求正文,则以下大小配额适用于该函数返回的正文:

    • 如果 Lambda@Edge 函数以纯文本形式返回正文:

      • 对于查看器请求事件,正文将截断为 40 KB。

      • 对于源请求事件,正文将截断为 1 MB。

    • 如果 Lambda@Edge 函数以 base64 编码文本形式返回正文:

      • 对于查看器响应事件,正文将截断为 40 KB。

      • 对于源响应事件,正文将截断为 1 MB。