Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)

Lambda 函数的要求和限制

请参阅以下几节以了解将 Lambda 函数与 CloudFront 一起使用的要求和限制。

CloudFront 分配和关联

  • 您不能将 Lambda 函数与其他 AWS 账户拥有的 CloudFront 分配相关联。

Lambda 函数的 CloudFront 触发器

  • 您可仅对带编号的版本 (而不对 $LATEST 或别名) 添加触发器。

  • 您可仅对 美国东部(弗吉尼亚北部) 区域中的函数添加触发器。

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

CloudWatch Logs

有关 Amazon CloudWatch Logs 限制的信息,请参阅 Amazon CloudWatch 用户指南 中的 CloudWatch Logs 限制

标头

请注意有关将标头与 Lambda@Edge 结合使用的以下要求和限制。

列入黑名单的标头

列入黑名单的标头未公开,无法由 Lambda@Edge 函数添加。如果您的 Lambda 函数添加列入黑名单的标头,请求将无法通过 CloudFront 验证。CloudFront 将 HTTP 状态代码 502 (Bad Gateway) 返回到查看器。

  • 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 缓存逻辑输入,并且您的 Lambda 函数可以读取标头值,但无法更改这些值。如果您的 Lambda 函数添加或编辑一个只读标头,请求将无法通过 CloudFront 验证。CloudFront 将 HTTP 状态代码 502 (Bad Gateway) 返回到查看器。

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

  • Content-Length

  • Host

  • Transfer-Encoding

  • Via

CloudFront 源请求事件的只读标头

  • Accept-Encoding

  • Content-Length

  • If-Modified-Since

  • If-None-Match

  • If-Range

  • If-Unmodified-Since

  • Transfer-Encoding

  • Via

CloudFront 源响应事件的只读标头

  • Transfer-Encoding

  • Via

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

  • Content-Encoding

  • Content-Length

  • Transfer-Encoding

  • Warning

  • Via

CloudFront-* 标头

Lambda 函数可以读取、编辑、删除或添加以下任何标头。

  • 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 配置为根据指定的标头进行缓存的信息,请参阅您创建或更新分配时指定的值主题中的基于选择的请求标头进行缓存

  • CloudFront 在查看器请求事件之后添加标头。

  • 如果查看器添加具有这些名称的标头,CloudFront 会覆盖标头值。

  • 对于查看器事件,CloudFront-Viewer-Country 已列入黑名单。列入黑名单的标头未公开,无法由 Lambda@Edge 函数添加。如果您的 Lambda 函数添加列入黑名单的标头,请求将无法通过 CloudFront 验证,并且 CloudFront 将 HTTP 状态代码 502 (Bad Gateway) 返回到查看器。

有关更多信息,请参阅以下示例:

HTTP 状态代码

如果源返回 400 或更高的 HTTP 状态代码,则 CloudFront 不会对查看器响应事件执行 Lambda 函数。您也无法修改成功请求的查看方响应事件的 HTTP 状态代码。

但是,您可以对 响应错误执行 Lambda 函数,包括 HTTP 状态代码 4xx 和 5xx。有关更多信息,请参阅更新源响应触发器中的 HTTP 响应

Lambda 函数配置和执行环境

  • 您必须使用 nodejs8.10nodejs10.xpython3.7 运行时属性创建函数。

    注意

    如果您有一个函数具有 nodejs6.10 属性,您仍然可以编辑函数并将其与 CloudFront 分配关联。有关更多信息,请参阅 AWS Lambda Developer Guide 中的 运行时支持政策

  • 不能将您的 Lambda 函数配置为访问您的 VPC 内的资源。

  • 您无法将 Lambda 函数与其他 AWS 账户拥有的 CloudFront 分配相关联。

  • 不支持死信队列 (DLQ)。

  • 不支持环境变量。

  • 不支持包含层的函数。

  • 不支持 AWS X-Ray。

限制

有关限制的信息,请参阅以下文档:

Microsoft 平滑流

您无法为用于按需流媒体文件(已转码为 Microsoft 平滑流格式)的 CloudFront 分配创建触发器。

网络访问

由来源请求和响应事件触发的函数以及由查看器请求和响应事件触发的函数,可对 Internet 上的资源和 AWS 服务(如 Amazon S3 存储桶、DynamoDB 表或 Amazon EC2 实例)进行网络调用。

查询字符串参数

  • 要在 Lambda 函数中访问查询字符串,请使用 event.Records[0].cf.request.querystring

  • 函数可以更新查看器和源请求事件的查询字符串。更新后的查询字符串不能包含空格、控制字符或片段标识符 (#)。

  • 函数只能读取源和查看器响应事件的查询字符串。

  • 将 CloudFront 配置为根据查询字符串参数进行缓存会影响函数是否可以访问查询字符串:

    • 查看器请求和响应事件 – 无论 查询字符串转发和缓存 具有何种设置,函数都可以访问查询字符串。

    • 源请求和响应事件 – 只有在 查询字符串转发和缓存 设置为全部转发,基于白名单缓存全部转发,基于所有缓存时,函数才能访问查询字符串。

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

  • URI (event.Records[0].cf.request.uri) 和查询字符串 (event.Records[0].cf.request.querystring) 的总大小必须小于 8192 个字符。

有关更多信息,请参阅根据查询字符串参数缓存内容

具有“包含正文”选项的正文的大小限制

在选择包含正文选项以向您的 Lambda 函数公开请求正文时,请注意公开或替换的正文部分的以下大小限制。

请注意以下几点:

  • 在公开之前,Lambda@Edge 始终对正文进行 Base64 编码。

  • 如果请求正文很大,则 Lambda@Edge 在公开正文之前将其截断。

向 Lambda 函数公开正文时的限制

Lambda@Edge 截断它向 Lambda 函数公开的正文,如下所示:

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

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

从 Lambda 函数返回请求正文时的限制

如果以只读方式访问请求正文,则将完整原始请求正文返回到源。

但是,如果您选择替换请求正文,在从 Lambda 函数返回正文时,以下正文大小限制适用:

正文编码类型 允许的正文大小:查看器请求 允许的正文大小:源请求

text

40KB

1MB

base64

53.2KB

1.33MB

标记

某些 AWS 服务(包括 Amazon CloudFront 和 AWS Lambda)支持将标签添加到服务中的资源。但目前,您不能将标签应用于 Lambda@Edge 资源。要了解在 CloudFront 中添加标签的更多信息,请参阅为 Amazon CloudFront 分配添加标签

URI

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

URI 和查询字符串编码

Lambda 函数要求 URI 和查询字符串是 UTF-8 编码。(百分号编码与 UTF-8 编码兼容。) CloudFront 和 Lambda 的行为取决于以下因素:

  • CloudFront 在查看器的请求中收到的 URI 和查询字符串的编码

  • URI 或查询字符串是否已由查看器请求或源请求事件所触发的函数更改

值是 UTF-8 编码

CloudFront 将值转发到您的 Lambda 函数,而不更改它们。

值是 ISO 8859-1 编码

CloudFront 先将 ISO 8859-1 字符编码转换为 UTF-8 编码,然后再将值转发到您的 Lambda 函数。

值使用某种其他字符编码进行编码

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

重要

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

CloudFront 转发到源服务器的值取决于由查看器请求或源请求事件触发的函数是否更改了 URI 或查询字符串:

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

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

在这两种情况下,行为均不会受到来自查看器的请求的字符编码方式的影响。