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

教程:创建简单的 Lambda@Edge 函数

本教程帮助您创建并添加一个在 CloudFront 中运行的 Node.js 函数示例,向您演示如何开始使用 Lambda@Edge。我们演练的示例将 HTTP 安全标头添加到响应中,从而提高网站的安全性和隐私性。(这就是说,完成此演练不需要网站;只需将安全标头添加到 CloudFront 检索文件时的响应中。)

此示例逐步演示如何创建和配置 Lambda@Edge 函数。在创建您自己的 Lambda@Edge 解决方案时,您将完成相似步骤并选择相同的选项。

步骤 1:注册 AWS 账户

如果您尚未注册,请在 https://aws.amazon.com/ 上注册 Amazon Web Services。选择立即注册,然后输入所需信息。

步骤 2:创建 CloudFront 分配

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

第一次使用 CloudFront? CloudFront 通过全球边缘站点网络传送内容。在设置 Lambda 函数以与 CloudFront 一起使用时,该函数可以将内容自定义为更靠近查看器,从而提高性能。如果您不熟悉 CloudFront,在完成本教程以前,花几分钟的时间阅读简短的概述了解有关 CloudFront 如何缓存和提供内容的基本知识

在本示例中,您创建一个 CloudFront 分配,并将其设置为使用 Amazon S3 存储桶以作为 CloudFront 分配的源。如果您已有要使用的环境,则可跳过本步骤。

创建具有 Amazon S3 源的 CloudFront 分配

  1. 创建包含一个或两个文件的 Amazon S3 存储桶,此处的文件可以是图像文件等等,并将作为示例内容。您可以按照将您的内容上传到 Amazon S3 中提供的步骤进行操作。确保设置相应权限,以授予对存储桶中对象的公共读取访问权限。

  2. 按照创建 CloudFront Web 分配中提供的步骤,创建 CloudFront 分配并添加您的 S3 存储桶以作为源。如果您已有一个分配,可以添加该存储桶作为该分配的源。

    提示

    请记下您的分配 ID。在本教程后面,在为函数添加 CloudFront 触发器时,必须从下拉列表中为您的分配选择该 ID,例如,E653W22221KDDL。—

步骤 3:创建您的函数

在此步骤中,您从在 Lambda 控制台中提供的蓝图模板开始创建一个 Lambda 函数。该函数会添加代码以更新 CloudFront 分配中的安全标头。

第一次使用 Lambda 或 Lambda@Edge? 通过使用 Lambda@Edge,您可以使用 CloudFront 触发器调用 Lambda 函数。在将 CloudFront 分配与 Lambda 函数相关联时,CloudFront 在 CloudFront 边缘站点中截获请求和响应并运行该函数。Lambda 函数可以提高安全性,或者将信息自定义为靠近查看器以提高性能。在本教程中,我们创建的函数将更新 CloudFront 响应中的安全标头。

创建 Lambda 函数时需要执行几个步骤。在本教程中,使用蓝图模板为基础来创建函数,然后使用设置安全标头的代码更新函数。最后,添加并部署一个 CloudFront 触发器来运行该函数。

创建 Lambda 函数

  1. 通过以下网址登录 AWS 管理控制台并打开 AWS Lambda 控制台 (https://console.aws.amazon.com/lambda/)。

    重要

    确保您位于 US-East-1(弗吉尼亚北部)区域。您必须位于该区域,才能创建 Lambda@Edge 函数。

  2. 选择 Create function

  3. 创建函数页面上,选择Blueprints,然后筛选 CloudFront 蓝图。在搜索字段中键入 cloudfront,然后按 Return。将显示关键字 cloudfront,并列出为 CloudFront 标记的所有蓝图。

    注意

    CloudFront 蓝图仅在 US-East-1 (弗吉尼亚北部)区域提供。

    
								在 Lambda 控制台中筛选 CloudFront 蓝图。
  4. 选择 cloudfront-modify-response-header 蓝图,以用作函数的模板。

  5. 输入有关您的函数的信息:

    名称

    为函数键入一个名称。

    角色

    选择如何设置函数的权限。从使用 Lambda@Edge 权限策略基本模板入手是最简便的方法,所以为该选项选择从模板创建新角色

    角色名称

    策略模板下,为要使用策略模板创建的角色键入一个名称,随后选择策略模板。

    Policy templates

    将自动为您添加策略模板 Basic Edge Lambda permissions (基本 Edge Lambda 权限),因为您选择 CloudFront 蓝图作为您的函数基础。此策略模板添加执行角色权限,以允许 CloudFront 在全球各地的 CloudFront 位置运行您的 Lambda 函数。有关更多信息,请参阅设置 Lambda@Edge 的 IAM 权限和角色

  6. 选择Create function。Lambda 创建函数,您将在下一页上看到“祝贺您!”成功消息框。

    
								在 Lambda 控制台中为函数编辑代码和进行配置的页面。

    Configuration (配置) 选项卡上有三个主要区域:按名称(在我们的示例中是 UpdateSecurityHeaders)显示函数框的图表、函数的任何触发器和日志信息。底部还有一个部分,此部分根据您在主区域中选择的框发生更改以允许其他选项 — 例如,函数名称、触发器或 Amazon CloudWatch Logs。

    此外,左侧还有一个可供您从中选择触发器类型的列表。由于您在创建函数时已选择 CloudFront 蓝图,因此已自动为函数添加 CloudFront 触发器。

    现在,您可以更新函数代码以修改安全标头,然后在下一步中,配置并部署 CloudFront 触发器以运行代码。

    
								Lambda 控制台页面,其中可为函数添加代码或触发器。
  7. 选择包含函数名称的框,然后在 Function code (函数代码) 部分中,将模板代码替换为修改从来源返回的安全标头的函数。例如,可以使用类似以下代码的代码:

    'use strict'; exports.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); };
  8. 选择Save以保存更新的代码。

步骤 4:添加 CloudFront 触发器以运行函数

现已具有用于更新安全标头的 Lambda 函数,请配置 CloudFront 触发器以运行您的函数,从而在 CloudFront 从分配来源收到的任何响应中添加标头。

为函数配置 CloudFront 触发器

  1. 选择 CloudFront 框以使其突出显示。

  2. 在下面的 Configure triggers (配置触发器) 部分中,选择 Deploy to Lambda@Edge 以打开可在其中定义并部署触发器的页面。

    
								Lambda 控制台页面,其中可以配置和部署 CloudFront 触发器。
  3. Deploy to Lambda@Edge (部署到 Lambda@Edge) 页面上的 Configure CloudFront trigger (配置 CloudFront 触发器) 下,输入以下信息:

    分配

    要与函数关联的 CloudFront 分配 ID。从下拉列表中选择分配 ID。

    Cache behavior

    要用于触发器的缓存行为。在此示例中,将该值设置为 *,即对所有请求应用您的分配的默认缓存行为。有关更多信息,请参阅您创建或更新分配时指定的值主题中的 缓存行为设置

    CloudFront event

    指定何时运行您的函数的触发器。我们希望在 CloudFront 返回来自源的响应时运行安全标头函数。因此,在下拉列表中选择源响应。有关更多信息,请参阅为 Lambda@Edge 函数添加触发器

    (可选)包括正文

    如果要访问函数中的针对查看器请求或来源请求事件的请求正文,请选中此复选框。有关更多信息,请参阅 选择“包含正文”选项以访问请求正文

    
								Lambda 控制台页面,其中可为函数添加代码或触发器。
  4. Confirm deploy to Lambda@Edge (确认部署到 Lambda@Edge) 下,选中复选框以确认将在所有 AWS 位置部署触发器并运行您的函数。

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

  6. 请等待复制函数完成。这通常需要几分钟,但最长需要 15 分钟。

    您可以转到 CloudFront 控制台并查看您的分配,以确认复制是否完成:

    • 转到 CloudFront 控制台 (https://console.aws.amazon.com/cloudfront/)。

    查看分配的状态是否已从正在进行恢复为已部署,这意味着已复制函数。然后,按照下一节中的步骤验证函数是否正常工作。

步骤 5:验证函数是否正常工作

现在,您已创建 Lambda 函数并已配置触发器以便为 CloudFront 分配运行它,请检查以确保该函数会按照预期运行。在此示例中,我们检查从源返回的 HTTP 标头,确保已添加安全标头。

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

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

    有关要在文件 URL 中使用的 CloudFront 域名的更多信息,请参阅在 CloudFront 中自定义文件的 URL 格式

  2. 打开您的浏览器的 Web Developer (Web 开发人员) 工具栏。例如,在 Chrome 浏览器窗口中,打开上下文(右键单击)菜单,然后选择Inspect

  3. 选择网络选项卡。

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

  5. 查看 HTTP 标头的列表,验证所需安全标头包含在列表中。例如,您可能会看到类似于以下屏幕截图所示的标头:

    
								HTTP 标头列表,并突出显示预期的安全标头。

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

步骤 6:解决问题

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

例如,如果您查看来自伦敦的文件,请尝试在 CloudWatch 控制台中将“Region (区域)”更改为“EU (London) (欧洲 (伦敦))”。

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

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

  2. Region (区域) 更改为执行函数的区域;也就是说,在浏览器中查看该文件时显示的位置。

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

有关更多信息,请参阅 监控 CloudFront 和设置警报

步骤 7:清除示例资源

如果您出于练习目的创建 S3 存储桶和 CloudFront 分配以仅用于本教程,请务必删除您分配的 AWS 资源,以使其不再产生费用。删除 AWS 资源后,您添加的任何内容将不再可用。

任务

删除 S3 存储桶

在删除您的 S3 存储桶之前,请确保已禁用该存储桶的日志记录。否则,在您删除存储桶时,AWS 会继续将日志写入其中。

禁用存储桶的日志记录

  1. 通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 选择存储桶,然后选择Properties

  3. 属性中,选择Logging

  4. 清除Enabled复选框。

  5. 选择 Save

现在您可以删除存储桶。有关更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何删除 S3 存储桶?

删除 CloudFront 分配

删除 CloudFront 分配之前,须先将其禁用。已禁用的分配不再起作用,并且不会产生费用。您可以随时启用已禁用的分配。已禁用的分配在删除后将不再可用。

禁用和删除 CloudFront 分配

  1. 通过以下网址打开 CloudFront 控制台:https://console.aws.amazon.com/cloudfront/

  2. 选择要禁用的分配,然后选择Disable

  3. 当系统提示进行确认时,选择 Yes, Disable

  4. 选择禁用的分配,然后选择Delete

  5. 当系统提示进行确认时,选择 Yes, Delete

用于了解更多信息的资源

现在,您对 Lambda@Edge 函数的工作方式已经有了基本概念,如需了解更多信息,请阅读以下内容: