

# 为 Lambda@Edge 函数添加触发器
<a name="lambda-edge-add-triggers"></a>

Lambda@Edge 触发器是指 CloudFront 分配、缓存行为与使函数开始执行的事件的组合。例如，您可以创建一个触发器，在 CloudFront 收到来自为分配所设置的特定缓存行为查看器的请求时执行函数。您可以指定一个或多个 CloudFront 触发器。

**提示**  
在创建 CloudFront 分配时，您可以指定一些设置来告诉 CloudFront 在收到不同的请求时如何响应。默认设置称为分配的*默认缓存行为*。您可以设置其他缓存行为来定义 CloudFront 在特定情况下（例如，在收到特定文件类型的请求时）如何响应。有关更多信息，请参阅 [缓存行为设置](DownloadDistValuesCacheBehavior.md)。

首次创建 Lambda 函数时，可以仅指定*一个*触发器。您可以通过使用 Lambda 控制台或在 CloudFront 控制台中编辑分配，在稍后向同一函数中添加更多触发器。
+ 如果您要将更多触发器添加到同一 CloudFront 分配的函数中，那么使用 Lambda 控制台非常有效。
+ 如果要为多个分配添加触发器，那么使用 CloudFront 控制台非常有效，因为这样更方便查找您要更新的分配。您同时还可以更新其他 CloudFront 设置。

**Topics**
+ [可以触发 Lambda@Edge 函数的 CloudFront 事件](lambda-cloudfront-trigger-events.md)
+ [选择要触发函数的事件](lambda-how-to-choose-event.md)
+ [将触发器添加到 Lambda@Edge 函数中](lambda-edge-add-triggers-console.md)

# 可以触发 Lambda@Edge 函数的 CloudFront 事件
<a name="lambda-cloudfront-trigger-events"></a>

对于 Amazon CloudFront 分配中的每个缓存行为，您最多可添加四个触发器（关联），以便在发生特定 CloudFront 事件时触发 Lambda 函数执行。CloudFront 触发器可以基于四个 CloudFront 事件之一，如下图所示。

![\[显示 Lambda 函数的 CloudFront 触发器事件如何与 CloudFront 集成的概念图。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/cloudfront-events-that-trigger-lambda-functions.png)


可用于触发 Lambda@Edge 函数的 CloudFront 事件如下所示：

**查看器请求**  
当 CloudFront 收到查看器的请求时及它检查请求的对象是否在 CloudFront 缓存中之前，该函数会执行。  
在以下情况下该函数不会执行：  
+ 当获取自定义错误页面时。
+ 当 CloudFront 自动将 HTTP 请求重定向到 HTTPS 时（当 [查看器协议策略](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy) 的值为**将 HTTP 重定向到 HTTPS** 时）。

**源请求**  
*仅*当 CloudFront 将请求转发给您的源时，该函数才会执行。当请求的对象位于 CloudFront 缓存中时，该函数不会执行。

**源响应**  
在 CloudFront 收到来自源的响应之后及它将对象缓存在响应中之前，该函数会执行。请注意，即使从源返回了错误，该函数仍会执行。  
在以下情况下该函数不会执行：  
+ 当请求的文件位于 CloudFront 缓存中并且未过期时。
+ 当从由源请求事件触发的函数中生成响应时。

**查看器响应**  
在将请求的文件返回到查看器之前，该函数会执行。请注意，无论文件是否已在 CloudFront 缓存中，该函数都会执行。  
在以下情况下该函数不会执行：  
+ 当源返回 400 或更高的 HTTP 状态代码时。
+ 当返回自定义错误页面时。
+ 当从由查看器请求事件触发的函数中生成响应时。
+ 当 CloudFront 自动将 HTTP 请求重定向到 HTTPS 时（当 [查看器协议策略](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy) 的值为**将 HTTP 重定向到 HTTPS** 时）。

当对同一个缓存行为添加多个触发器时，您可以使用它们运行同一个函数或对每个触发器运行不同的函数。也可以将同一个函数与多个分配关联。

**注意**  
当 CloudFront 事件触发 Lambda 函数的执行时，该函数必须完成，*然后* CloudFront 才能继续。  
例如，如果 Lambda 函数被某个 CloudFront 查看器请求事件触发，则在 Lambda 函数完成运行之前，CloudFront 不会将响应返回给查看器或将请求转发到源。  
这意味着触发 Lambda 函数的每个请求均会增加请求的延迟，因此您可能希望该函数尽快执行。

# 选择要触发函数的事件
<a name="lambda-how-to-choose-event"></a>

当您决定使用哪个 CloudFront 事件来触发 Lambda 函数时，请考虑以下因素：

**我希望 CloudFront 缓存由 Lambda 函数更改的对象**  
要缓存由 Lambda 函数修改的对象，以便下次请求该对象时 CloudFront 可以从边缘站点提供该对象，请使用*源请求*或*源响应*事件。  
这样可减少源上的负载、减少后续请求的延迟，并降低对后续请求调用 Lambda@Edge 的成本。  
例如，如果要添加、删除或更改由源返回的对象的标头，并且希望 CloudFront 缓存结果，请使用源响应事件。

**我希望该函数针对每个请求执行**  
要针对 CloudFront 为分配接收的每个请求执行该函数，请使用*查看器请求*或*查看器响应*事件。  
只有在未将请求的对象缓存在边缘站点中且 CloudFront 将请求转发到源时，才会发生源请求和源响应事件。

**我希望函数更改缓存键**  
要更改您要用作缓存基础的值，请使用*查看器请求*事件。  
例如，如果某个函数将 URL 更改为在路径中包含语言缩写 (例如，由于用户从下拉列表中选择了其语言)，请使用查看器请求事件：  
+ **查看器请求中的 URL** – https://example.com/en/index.html
+ **在请求来自德国的一个 IP 地址时的 URL** – https://example.com/de/index.html
如果您要根据 Cookie 或请求标头缓存，则也使用查看器请求事件。  
如果该函数更改 Cookie 或标头，则将 CloudFront 配置为将请求的适用部分转发到源。有关更多信息，请参阅以下主题：  
+ [根据 Cookie 缓存内容](Cookies.md)
+ [根据请求标头缓存内容](header-caching.md)

**函数影响来自源的响应**  
要以影响源响应的方式更改请求，请使用*源请求*事件。  
通常，大多数查看器请求事件都不会被转发到源。CloudFront 使用已在边缘缓存中的对象来响应请求。如果该函数基于源请求事件更改请求，则 CloudFront 会缓存对更改的源请求的响应。

# 将触发器添加到 Lambda@Edge 函数中
<a name="lambda-edge-add-triggers-console"></a>

您可以使用 AWS Lambda 控制台或 Amazon CloudFront 控制台向 Lambda@Edge 函数中添加触发器。

**重要**  
您只能为函数的编号版本（不能为 **\$1LATEST**）创建触发器。

------
#### [ Lambda console ]<a name="lambda-edge-add-triggers-procedure"></a>

**将 CloudFront 事件的触发器添加到 Lambda@Edge 函数**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 AWS Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 在页面顶部的“区域”列表中，选择**美国东部（弗吉尼亚州北部）**。

1. 在**函数**页面上，选择您要为其添加触发器的函数的名称。

1. 在**函数概述**页面上，选择**版本**选项卡。

1. 选择您要为其添加触发器的版本。

   选择某个版本后，相应按钮的名称会更改为 **Version: \$1LATEST** 或 **Version:** *版本号*。

1. 选择**触发器**选项卡。

1. 选择**添加触发器**。

1. 在**触发器配置**中，选择**选择源**，输入 **cloudfront**，然后选择 **CloudFront**。
**注意**  
如果您已创建一个或多个触发器，则 CloudFront 为默认服务。

1. 指定以下值，以指示您希望 Lambda 函数何时执行。

   1. **分配** – 选择要向其中添加触发器的分配。

   1. **缓存行为** – 选择缓存行为，该行为将指定您要对其执行函数的对象。
**注意**  
如果您对缓存行为指定 `*`，则 Lambda 函数会部署到默认缓存行为。

   1. **CloudFront 事件** – 选择促使函数执行的 CloudFront 事件。

   1. **包括正文** – 如果要在函数中访问请求正文，请选中该复选框。

   1. **确认部署到 Lambda@Edge** – 选中该复选框，以便 AWS Lambda 将函数复制到全球各地的 AWS 区域。

1. 选择**添加**。

   在更新的 CloudFront 分配部署后，函数开始处理指定 CloudFront 事件的请求。要确定是否已部署分配，请在导航窗格中选择**分配**。在部署分配后，分配的**状态**列的值将从**正在部署**更改为部署日期和时间。

------
#### [ CloudFront console ]<a name="lambda-create-functions-add-triggers-cloudfront-console-procedure"></a>

**将 CloudFront 事件的触发器添加到 Lambda@Edge 函数**

1. 获取您要为其添加触发器的 Lambda 函数的 ARN：

   1. 登录到 AWS 管理控制台，然后通过以下网址打开 AWS Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

   1. 在页面顶部的区域列表中，选择**美国东部（弗吉尼亚州北部）**。

   1. 在函数列表中，选择您要为其添加触发器的函数的名称。

   1. 在**函数概述**页面上，选择**版本**选项卡，然后再选择要为其添加触发器的带编号的版本。

   1. 选择**复制 ARN** 按钮，将 ARN 复制到剪贴板。Lambda 函数的 ARN 如下所示：

      `arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2`

      末尾的号码（在本示例中为 **2**）是函数的版本号。

1. 通过 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) 打开 CloudFront 控制台

1. 在分配列表中，选择要为其添加触发器的分配的 ID。

1. 选择**行为**选项卡。

1. 选择要为其添加触发器的缓存行为，然后选择**编辑**。

1. 对于**函数关联**，请在**函数类型**列表中，选择 **Lambda@Edge**，以确定您希望何时执行函数：针对查看器请求、查看器响应、源请求或源响应。

   有关更多信息，请参阅 [选择要触发函数的事件](lambda-how-to-choose-event.md)。

1. 在**函数 ARN/名称**文本框中，粘贴当所选事件发生时您要执行的 Lambda 函数的 ARN。这是您从 Lambda 控制台复制的值。

1. 如果要在函数中访问请求正文，请选择**包含正文**。

   如果您仅希望替换请求正文，则不需要选择该选项。

1. 要对更多事件类型执行同一函数，请重复步骤 6 和 7。

1. 选择**保存更改**。

1. 要针对该分配为更多缓存行为添加触发器，请重复步骤 5 到 10。

   在更新的 CloudFront 分配部署后，函数开始处理指定 CloudFront 事件的请求。要确定是否已部署分配，请在导航窗格中选择**分配**。在部署分配后，分配的**状态**列的值将从**正在部署**更改为部署时间和日期。

------