

# 对 Lambda@Edge 的限制
<a name="lambda-at-edge-function-restrictions"></a>

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

**Contents**
+ [DNS 解析](#lambda-at-edge-restrictions-dns)
+ [HTTP 状态代码](#lambda-at-edge-restrictions-status-codes)
+ [Lambda 函数版本](#lambda-at-edge-restrictions-version)
+ [Lambda 区域](#lambda-at-edge-restrictions-region)
+ [Lambda 角色权限](#lambda-at-edge-restrictions-role-permissions)
+ [Lambda 功能](#lambda-at-edge-restrictions-features)
+ [支持的运行时](#lambda-at-edge-restrictions-runtime)
+ [CloudFront 标头](#lambda-at-edge-restrictions-cloudfront-headers)
+ [具有 Include Body（包含正文）选项的请求正文的限制](#lambda-at-edge-restrictions-request-body)
+ [响应超时和保持连接超时（仅自定义源）](#timeout-for-lambda-edge-functions)

有关 配额的信息，请参阅 [有关 Lambda@Edge 的配额](cloudfront-limits.md#limits-lambda-at-edge)。

## DNS 解析
<a name="lambda-at-edge-restrictions-dns"></a>

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

如果您的函数逻辑修改了源域名，则在函数执行完毕后，CloudFront 将对已更新的域名执行另一次 DNS 解析。

有关管理 DNS 故障转移的更多信息，请参阅《Amazon Route 53 开发人员指南》**中的[配置 DNS 故障转移](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-configuring.html)。

## HTTP 状态代码
<a name="lambda-at-edge-restrictions-status-codes"></a>

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

## Lambda 函数版本
<a name="lambda-at-edge-restrictions-version"></a>

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

## Lambda 区域
<a name="lambda-at-edge-restrictions-region"></a>

Lambda 函数必须位于美国东部（弗吉尼亚州北部）区域。

## Lambda 角色权限
<a name="lambda-at-edge-restrictions-role-permissions"></a>

与 Lambda 函数关联的 IAM 执行角色必须由服务委托人 `lambda.amazonaws.com` 和 `edgelambda.amazonaws.com` 担任。有关更多信息，请参阅 [设置 Lambda@Edge 的 IAM 权限和角色](lambda-edge-permissions.md)。

## Lambda 功能
<a name="lambda-at-edge-restrictions-features"></a>

Lambda@Edge 不支持以下 Lambda 功能：
+ **自动**（默认设置）以外的 [Lambda 运行时管理配置](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html#runtime-management-controls)。
+ 将您的 Lambda 函数配置为访问 VPC 内的资源
+ [Lambda 函数死信队列](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#dlq)
+ [Lambda 环境变量](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html)（自动支持的预留环境变量除外）
+ Lambda 函数与[管理具有层级的 AWS Lambda 依赖关系](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html)
+ [使用 AWS X-Ray](https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html)
+ Lambda 预配置并发
**注意**  
Lambda@Edge 函数与所有 Lambda 函数共享相同的[区域并发](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html)功能。有关更多信息，请参阅 [有关 Lambda@Edge 的配额](cloudfront-limits.md#limits-lambda-at-edge)。
+ [使用容器映像创建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html)
+ [使用 arm64 架构的 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html)
+ 短暂存储超过 512 MB 的 Lambda 函数。
+ 使用[客户自主管理型密钥来加密 .zip 部署包](https://docs.aws.amazon.com/lambda/latest/dg/encrypt-zip-package.html)

## 支持的运行时
<a name="lambda-at-edge-restrictions-runtime"></a>

Lambda@Edge 支持最新版本的 Node.js 和 Python 运行时。有关支持的版本及其未来弃用日期的列表，请参阅《AWS Lambda 开发人员指南》**中的[支持的运行时](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported)。

**提示**  
作为最佳实践，请使用所提供的运行时的最新版本来改进性能和新增功能。
您无法使用已弃用的 Node.js 版本创建或更新函数。您只能将现有函数与这些版本及 CloudFront 分配相关联。使用与分配关联的这些版本的函数将继续运行。但是，建议将您的函数转移到更新版本的 Node.js。有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[运行时弃用策略](https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html)和 GitHub 上的 [Node.js 发布计划](https://github.com/nodejs/Release#release-schedule)。

## CloudFront 标头
<a name="lambda-at-edge-restrictions-cloudfront-headers"></a>

Lambda@Edge 函数可以读取、编辑、删除或添加 [添加 CloudFront 请求标头](adding-cloudfront-headers.md) 中列出的任何 CloudFront 标头。

**备注**  
如果您希望 CloudFront 添加这些标头，则必须将 CloudFront 配置为使用[缓存策略](controlling-the-cache-key.md)或[源请求策略](controlling-origin-requests.md)来添加它们。
CloudFront 在查看器请求事件*之后* 添加标题，这意味着这些标头在查看器请求函数中不可用于 Lambda@Edge 函数。这些标头仅适用于源请求和源响应中的 Lambda@Edge 函数。
如果查看器请求包含具有这些名称的标头，并且您将 CloudFront 配置为使用[缓存策略](controlling-the-cache-key.md)或者[源请求策略](controlling-origin-requests.md)添加这些标头，则 CloudFront 会覆盖查看器请求中的标头值。面向查看器的函数可以看到查看器请求中的标头值，而面向源的函数则看到 CloudFront 添加的标头值。
如果查看器请求函数添加 `CloudFront-Viewer-Country` 标头，它将无法通过验证，并且 CloudFront 会将 HTTP 状态代码 502（无效网关）返回到查看器。

## 具有 Include Body（包含正文）选项的请求正文的限制
<a name="lambda-at-edge-restrictions-request-body"></a>

在选择**包含正文**选项以向您的 Lambda@Edge 函数公开请求正文时，以下信息和大小限制适用于公开或替换的正文部分。
+ CloudFront 总是对请求正文进行 base64 编码，然后再将其公开给 Lambda@Edge。
+ 如果请求正文很大，则 CloudFront 在将正文公开给 Lambda@Edge 之前将其截断，如下所示：
  + 对于查看器请求事件，正文将截断为 40 KB。
  + 对于源请求事件，正文将截断为 1 MB。
+ 如果以只读方式访问请求正文，则 CloudFront 将完整的原始请求正文发送到源。
+ 如果您的 Lambda@Edge 函数替换请求正文，则以下大小限制适用于该函数返回的正文：
  + 如果 Lambda@Edge 函数以纯文本形式返回正文：
    + 对于查看器请求事件，正文限制为 40KB。
    + 对于源请求事件，正文限制为 1MB。
  + 如果 Lambda@Edge 函数以 base64 编码文本形式返回正文：
    + 对于查看器请求事件，正文限制为 53.2KB。
    + 对于源请求事件，正文限制为 1.33MB。

**注意**  
如果 Lambda @Edge 函数返回的正文超出了这些限制，请求将失败，系统将显示 HTTP 502 状态代码 ([Lambda 验证错误](http-502-bad-gateway.md#http-502-lambda-validation-error))。建议您更新 Lambda @Edge 函数，使正文不超出这些限制。

## 响应超时和保持连接超时（仅自定义源）
<a name="timeout-for-lambda-edge-functions"></a>

如果您使用 Lambda@Edge 函数为分配源设置响应超时或保持连接超时，请确认您指定了您的源可以支持的值。有关更多信息，请参阅 [响应和保持连接超时限额](DownloadDistValuesOrigin.md#response-keep-alive-timeout-quota)。