边缘函数的限制
以下主题描述了适用于 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 函数 |
|||
查看器请求 |
查看器响应 |
||
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-Auth
-
X-Amzn-Cf-Billing
-
X-Amzn-Cf-Id
-
X-Amzn-Cf-Xff
-
X-Amzn-Errortype
-
X-Amzn-Fle-Profile
-
X-Amzn-Header-Count
-
X-Amzn-Header-Order
-
X-Amzn-Lambda-Integration-Tag
-
X-Amzn-RequestId
-
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 平滑流
您无法将用于流式传输媒体文件(已转码为 Microsoft 平滑流格式)的 CloudFront 分配与边缘函数一同使用。
Tagging
您无法将标签添加到边缘函数中。要了解有关在 CloudFront 中进行标记的更多信息,请参阅标记 Amazon CloudFront 分配。
对 CloudFront Functions 的限制
以下限制仅适用于 CloudFront Functions。
日志
CloudFront Functions 中的函数日志被截断为 10 KB。
请求正文
CloudFront Functions 无法访问 HTTP 请求的正文。
运行时
CloudFront Functions 运行时环境不支持动态代码评估,它限制了对网络、文件系统和计时器的访问。有关更多信息,请参阅 受限功能。
计算利用率
CloudFront Functions 对运行时间有限制,测量方式为计算利用率。计算利用率是介于 0 到 100 之间的数字,表示函数运行所花费的时间占最大允许时间的百分比。例如,计算利用率为 35 表示函数在最大允许时间的 35% 内完成。
当您测试函数时,您可以在测试事件的输出中看到计算利用率值。对于生产函数,您可以在 CloudFront 控制台中的监控页面
对 Lambda@Edge 的限制
以下限制仅适用于 Lambda@Edge。
Lambda 函数版本
您必须使用带编号的 Lambda 函数,而不是 $LATEST
或别名。
Lambda 区域
Lambda 函数必须位于美国东部(弗吉尼亚北部)区域。
Lambda 角色权限
与 Lambda 函数关联的 IAM 执行角色必须由服务委托人 lambda.amazonaws.com
和 edgelambda.amazonaws.com
担任。有关更多信息,请参阅设置 Lambda@Edge 的 IAM 权限和角色。
Lambda 功能
Lambda@Edge 不支持以下 Lambda 功能:
-
Auto(自动)(原定设置)以外的 Lambda 运行时管理配置。
-
将您的 Lambda 函数配置为访问 VPC 内的资源。
-
具有 Amazon Lambda 层的 Lambda 函数。
-
短暂存储超过 512 MB 的 Lambda 函数。
支持的运行时
Lambda@Edge 支持具有以下运行时的 Lambda 函数:
Node.js |
Python |
---|---|
|
|
¹此版本的 Node.js 使用寿命已结束,Amazon Lambda 已将其完全弃用。您无法使用此版本的 Node.js 创建或更新函数。如果您有使用此版本的现有函数,则可以将其与 CloudFront 分配相关联。使用与分发关联的此版本的函数将继续运行。但是,我们建议将您的函数转移到更新版本的 Node.js。有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的运行时弃用策略和 GitHub 上的 Node.js 发布计划
²此版本的 Node.js 使用寿命已结束,Amazon Lambda 很快会将其弃用。从 2023 年 3 月 31 日开始,您无法使用此版本的 Node.js 创建新函数。如果您有使用该日期后的版本的现有函数,则可以将其与 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
¹
请注意以下几点:
具有 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。
-
-