

# Lambda@Edge 函数入门（控制台）
<a name="lambda-edge-how-it-works"></a>

借助 Lambda@Edge，您可以使用 CloudFront 触发器调用 Lambda 函数。在将 CloudFront 分配与 Lambda 函数相关联时，CloudFront 在 CloudFront 边缘站点中[截获请求和响应](https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html)并运行函数。Lambda 函数可以提高安全性，或者自定义靠近查看器的信息以提高性能。

下表概述了如何创建 Lambda 函数并将其用于 CloudFront。

**概览：借助 CloudFront 创建和使用 Lambda 函数**

1. 在美国东部（弗吉尼亚州北部）区域创建 Lambda 函数。

1. 保存和发布带编号的函数版本。

   如果要对函数进行更改，则必须在美国东部（弗吉尼亚州北部）区域中编辑函数的 \$1LATEST 版本。然后，在将其设置为与 CloudFront 结合使用之前，发布一个带编号的新版本。

1. 将函数与 CloudFront 分配和缓存行为进行关联。指定触发函数执行的一个或多个 CloudFront 事件（称作*触发器*）。例如，您可以创建一个在 CloudFront 收到查看器的请求时促使函数执行的触发器。

1. 创建触发器时，Lambda 会在全球各个 AWS 位置创建该函数的副本。

**提示**  
有关更多信息，请参阅[创建和更新函数](lambda-edge-create-function.md)、[事件结构](lambda-event-structure.md)和[添加 CloudFront 触发器](lambda-edge-add-triggers.md)。另外，您可以在 [Lambda@Edge 函数示例](lambda-examples.md) 中找到更多创意并获得代码示例。

有关分步教程，请参阅以下主题：

**Topics**
+ [教程：创建基本 Lambda@Edge 函数（控制台）](lambda-edge-how-it-works-tutorial.md)

# 教程：创建基本 Lambda@Edge 函数（控制台）
<a name="lambda-edge-how-it-works-tutorial"></a>

本教程演示如何通过创建和配置一个在 CloudFront 中运行的示例 Node.js 函数，来开始使用 Lambda@Edge。在该示例中，我们在 CloudFront 检索文件时将 HTTP 安全标头添加到响应中。（这可以提高网站的安全性和隐私性。）

学习本教程不需要您自己的网站。但在选择创建自己的 Lambda@Edge 解决方案时，您需要完成类似步骤并从相同的选项中进行选择。

**Topics**
+ [第 1 步：注册 AWS 账户](#lambda-edge-how-it-works-tutorial-AWS)
+ [步骤 2：创建 CloudFront 分配](#lambda-edge-how-it-works-tutorial-cloudfront)
+ [第 3 步：创建函数](#lambda-edge-how-it-works-tutorial-create-function)
+ [第 4 步：添加 CloudFront 触发器来运行函数](#lambda-edge-how-it-works-tutorial-add-trigger)
+ [第 5 步：验证函数是否正常工作](#lambda-edge-how-it-works-tutorial-verify)
+ [第 6 步：问题排查](#lambda-edge-how-it-works-tutorial-troubleshoot)
+ [第 7 步：清除示例资源](#lambda-edge-how-it-works-tutorial-cleanup-resources)
+ [相关信息](#lambda-edge-how-it-works-tutorial-resources)

## 第 1 步：注册 AWS 账户
<a name="lambda-edge-how-it-works-tutorial-AWS"></a>

如果您尚未完成此操作，请注册一个 AWS 账户。有关更多信息，请参阅 [注册 AWS 账户](setting-up-cloudfront.md#sign-up-for-aws)。

## 步骤 2：创建 CloudFront 分配
<a name="lambda-edge-how-it-works-tutorial-cloudfront"></a>

创建 Lambda@Edge 函数示例之前，您必须有一个可使用的、包含提供内容的源的 CloudFront 环境。

在本示例中，您将创建一个使用 Amazon S3 存储桶作为分配源的 CloudFront 分配。如果您已有要使用的环境，则可跳过本步骤。<a name="lambda-edge-how-it-works-tutorial-cf-proc"></a>

**创建具有 Amazon S3 源的 CloudFront 分配**

1. 创建包含一个或两个文件的 Amazon S3 存储桶，此处的文件可以是图像文件等等，并将作为示例内容。要获得帮助，请按照[将您的内容上传到 Amazon S3](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/GettingStarted.html#GettingStartedUploadContent) 中提供的步骤执行操作。确保设置相应权限，以授予对存储桶中对象的公共读取访问权限。

1. 按照[创建 CloudFront Web 分配](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/GettingStarted.html#GettingStartedCreateDistribution)中提供的步骤操作，创建 CloudFront 分配并添加您的 S3 存储桶作为源。如果您已有一个分配，可以添加该存储桶作为该分配的源。
**提示**  
请记下您的分配 ID。在本教程的后面，为函数添加 CloudFront 触发器时必须从下拉列表中为您的分配选择该 ID，例如 `E653W22221KDDL`。

## 第 3 步：创建函数
<a name="lambda-edge-how-it-works-tutorial-create-function"></a>

在此步骤中，您将从 Lambda 控制台中的蓝图模板创建一个 Lambda 函数。该函数会添加代码以更新 CloudFront 分配中的安全标头。<a name="lambda-edge-how-it-works-tutorial-create-function-blueprint-proc"></a>

**创建 Lambda 函数**

1. 通过以下网址登录 AWS 管理控制台并打开 AWS Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。
**重要**  
确保您位于 **US-East-1（弗吉尼亚州北部）**AWS 区域（**us-east-1**）。您必须位于该区域，才能创建 Lambda@Edge 函数。

1. 选择**创建函数**。

1. 在**创建函数**页面上，选择**使用蓝图**，然后通过在搜索字段中输入 **cloudfront** 来筛选 CloudFront 蓝图。
**注意**  
CloudFront 蓝图仅在 **US-East-1（弗吉尼亚州北部）**区域（**us-east-1**）可用。

1. 选择**修改 HTTP 响应标头**蓝图以用作函数的模板。

1. 输入有关函数的以下信息：
   + **函数名称** – 输入您的函数的名称。
   + **执行角色** – 选择如何设置函数的权限。要使用推荐的基本 Lambda@Edge 权限策略模板，请选择**从 AWS 策略模板创建新角色**。
   + **角色名称** – 输入策略模板所创建的角色的名称。
   + **策略模板** – Lambda 将自动添加策略模板**基本 Lambda@Edge 权限**，因为您选择了 CloudFront 蓝图作为函数的基础。此策略模板添加执行角色权限，以允许 CloudFront 在全球各地的 CloudFront 位置运行您的 Lambda 函数。有关更多信息，请参阅 [设置 Lambda@Edge 的 IAM 权限和角色](lambda-edge-permissions.md)。

1. 在页面底部，选择**创建函数**。

1. 在出现的**部署到 Lambda@Edge** 窗格中，选择**取消**。（对于本教程，在将函数部署到 Lambda@Edge 之前，您必须修改函数代码。）

1. 向下滚动到页面的**代码源**部分。

1. 将模板代码替换为一个函数，该函数修改您的源返回的安全标头。例如，可以使用如下代码：

   ```
   'use strict';
   export const handler = (event, context, callback) => {
   
       //Get contents of response
       const response = event.Records[0].cf.response;
       const headers = response.headers;
   
       //Set new headers
       headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000; includeSubdomains; preload'}];
       headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}];
       headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}];
       headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}];
       headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}];
       headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}];
   
       //Return modified response
       callback(null, response);
   };
   ```

1. 选择**文件**、**保存**，保存已更新的代码。

1. 选择**部署**。

继续执行下一部分，添加 CloudFront 触发器以运行函数。

## 第 4 步：添加 CloudFront 触发器来运行函数
<a name="lambda-edge-how-it-works-tutorial-add-trigger"></a>

现已具有用于更新安全标头的 Lambda 函数，请配置 CloudFront 触发器以运行您的函数，从而在 CloudFront 从分配来源收到的任何响应中添加标头。<a name="lambda-edge-how-it-works-tutorial-add-trigger-proc"></a>

**为您的函数配置 CloudFront 触发器**

1. 在 Lambda 控制台中，在函数的**函数概述**页面上，选择**添加触发器**。

1. 对于**触发器配置**，请选择 **CloudFront**。

1. 选择**部署到 Lambda@Edge**。

1. 在**部署到 Lambda@Edge**窗格上的**配置 CloudFront 触发器**下，输入以下信息：
   + **分配** – 要与函数关联的 CloudFront 分配 ID。从下拉列表中选择分配 ID。
   + **缓存行为** – 要用于触发器的缓存行为。在本示例中，将该值设置为 **\$1**，这表示您的分配的默认缓存行为。有关更多信息，请参阅[所有分配设置参考](distribution-web-values-specify.md)主题中的 [缓存行为设置](DownloadDistValuesCacheBehavior.md)。
   + **CloudFront 事件** – 指定何时运行您的函数的触发器。我们希望在 CloudFront 返回来自源的响应时运行安全标头函数。在下拉列表中，选择**源响应**。有关更多信息，请参阅 [为 Lambda@Edge 函数添加触发器](lambda-edge-add-triggers.md)。

1. 选中**确认部署到 Lambda@Edge**复选框。

1. 选择**部署**以添加触发器并将该函数复制到全球各地的 AWS 位置。

1. 请等待复制函数完成。这通常需要几分钟时间。

    您可以[转到 CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)并查看您的分配，确认复制是否完成。等待分配状态从**正在部署**更改为部署日期和时间，这意味着已复制函数。要验证函数是否正常工作，请执行下一节中的步骤。

## 第 5 步：验证函数是否正常工作
<a name="lambda-edge-how-it-works-tutorial-verify"></a>

现在，您已创建 Lambda 函数并已配置触发器以便为 CloudFront 分配运行它，请检查以确保该函数按照预期运行。在本示例中，我们检查 CloudFront 返回的 HTTP 标头，确保已添加了安全标头。<a name="lambda-edge-how-it-works-tutorial-verify-proc"></a>

**验证您的 Lambda@Edge 函数是否添加安全标头**

1. 在浏览器中，键入 S3 存储桶中的文件的 URL。例如，您可以使用类似以下所示的 URL：`https://d111111abcdef8.cloudfront.net/image.jpg`。

   有关要在文件 URL 中使用的 CloudFront 域名的更多信息，请参阅[在 CloudFront 中自定义文件的 URL 格式](LinkFormat.md)。

1. 打开您的浏览器的 Web Developer（Web 开发人员）工具栏。例如，在 Chrome 浏览器窗口中，打开上下文（右键单击）菜单，然后选择**检查**。

1. 选择**网络**选项卡。

1. 重新加载页面以查看您的图像，然后在左侧窗格选择 HTTP 请求。您会看到在一个单独窗格中显示 HTTP 标头。

1. 查看 HTTP 标头的列表，验证所需安全标头包含在列表中。例如，您可能会看到类似于以下屏幕截图中所示的标头。  
![\[HTTP 标头列表，并突出显示预期的安全标头。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/lambda-at-edge-security-headers-list.png)

如果安全标头已包含在标头列表中，很棒！您已成功创建第一个 Lambda@Edge 函数。如果 CloudFront 返回错误或有其他问题，请继续执行下一步骤来解决相应问题。

## 第 6 步：问题排查
<a name="lambda-edge-how-it-works-tutorial-troubleshoot"></a>

如果 CloudFront 返回错误或没有按预期添加安全标头，您可以查看 CloudWatch Logs 来研究函数的执行。请务必使用与执行函数时的位置最接近的 AWS 位置中存储的日志。

例如，如果您查看来自伦敦的文件，请尝试在 CloudWatch 控制台中将“区域”更改为“欧洲地区（伦敦）”。<a name="lambda-edge-how-it-works-tutorial-cloudwatch-proc"></a>

**检查您的 Lambda@Edge 函数的 CloudWatch 日志**

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

1. 将**区域**更改为您在浏览器中查看文件时所显示的位置。这是执行函数的区域。

1. 在左侧窗格中选择**日志**以查看您的分配的日志。

有关更多信息，请参阅 [使用 Amazon CloudWatch 监控 CloudFront 指标](monitoring-using-cloudwatch.md)。

## 第 7 步：清除示例资源
<a name="lambda-edge-how-it-works-tutorial-cleanup-resources"></a>

如果您仅为本教程创建了 Amazon S3 存储桶和 CloudFront 分配，请删除您分配的 AWS 资源，以免继续产生费用。删除 AWS 资源后，您添加的任何内容将不再可用。

**任务**：
+ [删除 S3 存储桶](#lambda-edge-how-it-works-tutorial-delete-bucket) 
+ [删除 Lambda 函数](#lambda-edge-how-it-works-tutorial-delete-function)
+ [删除 CloudFront 分配](#lambda-edge-how-it-works-tutorial-delete-distribution)

### 删除 S3 存储桶
<a name="lambda-edge-how-it-works-tutorial-delete-bucket"></a>

在删除您的 Amazon S3 存储桶之前，请确保已禁用该存储桶的日志记录。否则，在您删除存储桶时，AWS 会继续将日志写入其中。<a name="lambda-edge-how-it-works-tutorial-delete-bucket-proc"></a>

**禁用存储桶的日志记录**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 选择存储桶，然后选择 **Properties**。

1. 从**属性**中选择**日志记录**。

1. 取消选中**启用**复选框。

1. 选择**保存**。

现在您可以删除存储桶。有关更多信息，请参阅《Amazon Simple Storage Service 控制台用户指南》**中的[删除存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。

### 删除 Lambda 函数
<a name="lambda-edge-how-it-works-tutorial-delete-function"></a>

有关如何取消 Lambda 函数关联以及选择删除函数本身的说明，请参阅[删除 Lambda@Edge 函数和副本](lambda-edge-delete-replicas.md)。

### 删除 CloudFront 分配
<a name="lambda-edge-how-it-works-tutorial-delete-distribution"></a>

删除 CloudFront 分配之前，须先将其禁用。已禁用的分发不再起作用，并且不会产生费用。您可以随时启用已禁用的分发。已禁用的分配在删除后将不再可用。<a name="lambda-edge-how-it-works-tutorial-delete-distribution-proc"></a>

**禁用并删除 CloudFront 分配**

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

1. 选择要禁用的分配，然后选择**禁用**。

1. 当系统提示确认时，选择**是，禁用**。

1. 选择禁用的分配，然后选择**删除**。

1. 当系统提示进行确认时，选择 **Yes, Delete**。

## 相关信息
<a name="lambda-edge-how-it-works-tutorial-resources"></a>

现在，您对 Lambda@Edge 函数的工作方式已经有了基本概念，如需了解更多信息，请阅读以下内容：
+ [Lambda@Edge 函数示例](lambda-examples.md)
+ [Lambda@Edge 设计最佳实践](https://aws.amazon.com/blogs/networking-and-content-delivery/lambdaedge-design-best-practices/)
+ [使用 Lambda@Edge 减少延迟并将计算转移到边缘站点](https://aws.amazon.com/blogs/networking-and-content-delivery/reducing-latency-and-shifting-compute-to-the-edge-with-lambdaedge/)