对 Lambda@Edge 的限制 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对 Lambda@Edge 的限制

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

有关配额的信息,请参阅有关 Lambda@Edge 的配额

DNS 解析

CloudFront 会先对源域名执行 DNS 解析,然后 再执行源请求 Lambda@Edge 函数。如果您的域的 DNS 服务出现问题,并且 CloudFront 无法解析域名以获取 IP 地址,将不会调用您的 Lambda@Edge 函数。CloudFront 会将 HTTP 状态代码 502(无效网关)返回到客户端。有关更多信息,请参阅HTTP 502 状态代码(DNS 错误)

有关管理 DNS 故障转移的更多信息,请参阅《Amazon Route 53 开发人员指南》中的配置 DNS 故障转移

HTTP 状态代码

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

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 20

  • Node.js 18

  • Node.js 16¹

  • Node.js 14²

  • Node.js 12²

  • Node.js 10²

  • Node.js 8²

  • Node.js 6²

  • Python 3.12

  • Python 3.11

  • Python 3.10

  • Python 3.9

  • Python 3.8

  • Python 3.7

¹此版本的 Node.js 使用寿命已结束,Amazon Lambda 很快会将其弃用。

²此版本的 Node.js 使用寿命已结束,Amazon Lambda 已将其完全弃用。

您无法使用已弃用的 Node.js 版本创建或更新函数。您只能将现有函数与这些版本及 CloudFront 分配相关联。使用与分配关联的这些版本的函数将继续运行。但是,建议将您的函数转移到更新版本的 Node.js。有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的运行时弃用策略和 GitHub 上的 Node.js 发布计划

提示

作为最佳实践,请使用所提供的运行时的最新版本来改进性能和新增功能。

CloudFront 标头

Lambda@Edge 函数可以读取、编辑、删除或添加 添加 CloudFront 请求标头 中列出的任何 CloudFront 标头。

注意
  • 如果您希望 CloudFront 添加这些标头,则必须将 CloudFront 配置为使用缓存策略源请求策略来添加它们。

  • CloudFront 在查看器请求事件之后 添加标题,这意味着这些标头在查看器请求函数中不可用于 Lambda@Edge 函数。这些标头仅适用于源请求和源响应中的 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 编码文本形式返回正文:

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

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