教程:创建简单的 Lambda@Edge 函数 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

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

本示例介绍了创建和配置 Lambda@Edge 函数的步骤。在创建自己的 Lambda@Edge 解决方案时,您需要完成类似步骤并从相同的选项中选择。

第 1 步:注册Amazon Web Services 账户

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

步骤 2:创建 CloudFront 分配

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

第一次使用 CloudFront? CloudFront 通过全球边缘站点网络传送内容。在设置 Lambda 函数与 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. 通过以下网址登录 Amazon Web Services Management Console并打开 Amazon Lambda 控制台:https://console.amazonaws.cn/lambda/

    重要

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

  2. 选择创建函数

  3. 创建函数页面上,选择使用蓝图,然后通过在搜索字段中输入 cloudfront 来筛选 CloudFront 蓝图。此时将显示关键字:cloudfront,并列出为 CloudFront 标记的所有蓝图。

    注意

    CloudFront 蓝图仅在 US-East-1(弗吉尼亚北部)区域 (us-east-1) 可用。

  4. 选择 cloudfront-modify-response-header 蓝图以用作函数的模板。

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

    名称

    输入您的函数的名称。

    执行角色

    选择如何设置函数的权限。要使用推荐的基本 Lambda@Edge 权限策略模板,请选择从 Amazon 策略模板创建新角色

    角色名称

    输入策略模板所创建的角色的名称。

    Policy templates

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

  6. 选择创建函数。Lambda 会创建函数,并且您可在下一页上看到函数配置。

  7. 在页面的设计器部分中,选择函数名称,如下图所示。在本示例中,函数名称为 ExampleFunction

    
								Lambda 控制台中的 Lambda 函数页面,显示选定函数名称的设计器部分。
  8. 向下滚动到该页面的函数代码部分,如下图中所示。

    
								Lambda 控制台中的 Lambda 函数页面,显示函数代码部分。

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

    '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); };
  9. 选择 Save (保存),保存已更新的代码。

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

第 4 步:添加 CloudFront 触发器来运行函数

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

为您的函数配置 CloudFront 触发器

  1. 在页面的设计器部分中,选择 CloudFront,如下图中所示。

    
								Lambda 控制台中的 Lambda 函数页面,显示选择了 CloudFront 的设计器部分。
  2. 向下滚动到页面的配置触发器部分,然后选择部署到 Lambda@Edge

  3. 部署到 Lambda@Edge页面上的配置 CloudFront 触发器下,输入以下信息:

    分配

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

    Cache behavior

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

    CloudFront 事件

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

  4. Confirm deploy to Lambda@Edge (确认部署到 Lambda@Edge) 下,选中复选框以确认将在所有 Amazon 位置部署触发器并运行您的函数。

  5. 选择 Deploy (部署) 以添加触发器并将该函数复制到全球各地的 Amazon 位置。然后,如果需要,关闭部署到 Lambda@Edge 页面。

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

    您可以转到 CloudFront 控制台并查看您的分配,确认复制是否完成。等待分配的状态从正在进行恢复为已部署,这意味着已复制函数。要验证函数是否正常工作,请执行下一节中的步骤。

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

现在,您已创建 Lambda 函数并已配置触发器以便为 CloudFront 分配运行它,请检查以确保该函数按照预期运行。在本示例中,我们检查 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 Logs 来研究函数的执行。请务必使用与执行函数时的位置最接近的 Amazon 位置中存储的日志。

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

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

  1. 登录到 Amazon Web Services Management Console 并通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

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

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

有关更多信息,请参阅 使用 Amazon CloudWatch 监控 CloudFront

第 7 步:清除示例资源

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

任务

删除 S3 存储桶

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

禁用存储桶的日志记录

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

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

  3. Properties (属性) 中选择 Logging (日志记录)

  4. 取消选中 Enabled (启用) 复选框。

  5. 选择 Save (保存)

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

删除 CloudFront 分配

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

禁用并删除 CloudFront 分配

  1. 通过 打开 CloudFront 控制台https://console.amazonaws.cn/cloudfront/v3/home

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

  3. 当系统提示确认时,选择 Yes, Disable (是,禁用)

  4. 选择禁用的分发,然后选择 Delete (删除)

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

可了解更多信息的资源

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