本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:创建简单的 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 分配
-
创建包含一个或两个文件的 Amazon S3 存储桶,此处的文件可以是图像文件等等,并将作为示例内容。要获得帮助,请按照将您的内容上传到 Amazon S3 中提供的步骤执行操作。确保设置相应权限,以授予对存储桶中对象的公共读取访问权限。
-
按照创建 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 函数
-
通过以下网址登录 Amazon Web Services Management Console并打开 Amazon Lambda 控制台:https://console.amazonaws.cn/lambda/
。 重要
确保您位于 US-East-1(弗吉尼亚北部)区域 (us-east-1)。您必须位于该区域,才能创建 Lambda@Edge 函数。
-
选择创建函数。
-
在创建函数页面上,选择使用蓝图,然后通过在搜索字段
cloudfront
中输入来筛选 CloudFront 蓝图。将显示关键字:cloudfron t,并列出所有标记 CloudFront 为的蓝图。注意
CloudFront 蓝图仅在美国东部 1(弗吉尼亚北部)区域(us-east-1)可用。
-
选择cloudfront-modify-response-header蓝图作为函数的模板。
-
输入有关函数的以下信息:
- 名称
-
输入您的函数的名称。
- 执行角色
-
选择如何设置函数的权限。要使用推荐的基本 Lambda@Edge 权限策略模板,请选择从 Amazon 策略模板创建新角色。
- 角色名称
-
输入策略模板所创建的角色的名称。
- 策略模板
-
Lambda 会自动添加策略模板基本 Edge Lambda 权限,因为您选择了 CloudFront蓝图作为函数的基础。此策略模板添加了执行角色权限, CloudFront 允许您在 CloudFront 世界各地为您运行 Lambda 函数。有关更多信息,请参阅设置 Lambda@Edge 的 IAM 权限和角色。
-
选择创建函数。Lambda 会创建函数,并且您可在下一页上看到函数配置。
-
在页面的设计器部分中,选择函数名称,如下图所示。在此示例中,函数名称为ExampleFunction。
-
向下滚动到该页面的函数代码部分,如下图中所示。
将模板代码替换为一个函数,该函数修改您的源返回的安全标头。例如,可以使用类似以下代码的代码:
'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); };
-
选择 Save (保存),保存已更新的代码。
继续下一节,添加 CloudFront 触发器来运行该函数。
步骤 4:添加 CloudFront 触发器以运行该函数
现在,您已经有了用于更新安全标头的 Lambda 函数,请将 CloudFront 触发器配置为运行您的函数,以便在从源 CloudFront 收到的用于分配的任何响应中添加标头。
为函数配置 CloudFront 触发器
-
在页面的设计器部分中,选择 CloudFront,如下图中所示。
-
向下滚动到页面的配置触发器部分,然后选择部署到 Lambda@Edge。
-
在 Deploy to Lambda@Edge (部署到 Lambda@Edge) 页面上的 Configure CloudFront trigger (配置 CloudFront 触发器) 下,输入以下信息:
- 发行版
-
要与您的函数关联的 CloudFront 分发 ID。从下拉列表中选择分配 ID。
- 缓存行为
-
要用于触发器的缓存行为。在本示例中,将该值设置为 *,这表示您的分配的默认缓存行为。有关更多信息,请参阅您创建或更新分配时指定的值主题中的 缓存行为设置。
- CloudFront 事件
-
指定何时运行您的函数的触发器。我们希望每当从源端 CloudFront 返回响应时,安全标头函数都会运行。因此,在下拉列表中选择源响应。有关更多信息,请参阅为 Lambda@Edge 函数添加触发器。
-
在 Confirm deploy to Lambda@Edge (确认部署到 Lambda@Edge) 下,选中复选框以确认将在所有 Amazon 位置部署触发器并运行您的函数。
-
选择 Deploy (部署) 以添加触发器并将该函数复制到全球各地的 Amazon 位置。然后,如果需要,关闭部署到 Lambda@Edge 页面。
-
请等待复制函数完成。这通常需要几分钟时间。
您可以通过进入 CloudFront 控制台并查看您的发行版来
查看复制是否已完成。等待分配的状态从正在进行恢复为已部署,这意味着已复制函数。要验证函数是否正常工作,请执行下一节中的步骤。
第 5 步:验证函数是否正常工作
现在,您已经创建了 Lambda 函数并配置了一个触发器来运行该函数以进行 CloudFront分发,请检查以确保该函数实现了您期望的效果。在此示例中,我们检查 CloudFront 返回的 HTTP 标头,以确保添加了安全标头。
验证您的 Lambda@Edge 函数是否添加安全标头
-
在浏览器中,键入 S3 存储桶中的文件的 URL。例如,您可以使用类似以下所示的 URL:
https://d111111abcdef8.cloudfront.net/image.jpg
。有关要在文件 URL 中使用的 CloudFront 域名的更多信息,请参阅自定义中文件的 URL 格式 CloudFront。
-
打开您的浏览器的 Web Developer(Web 开发人员)工具栏。例如,在 Chrome 浏览器窗口中,打开上下文(右键单击)菜单,然后选择检查。
-
选择网络选项卡。
-
重新加载页面以查看您的图像,然后在左侧窗格选择 HTTP 请求。您会看到在一个单独窗格中显示 HTTP 标头。
-
查看 HTTP 标头的列表,验证所需安全标头包含在列表中。例如,您可能会看到类似于以下屏幕截图中所示的标头。
如果安全标头已包含在标头列表中,很棒!您已成功创建第一个 Lambda@Edge 函数。如果 CloudFront 返回错误或存在其他问题,请继续执行下一步以解决问题。
第 6 步:问题排查
如果 CloudFront 返回错误或未按预期添加安全标头,则可以通过查看 CloudWatch 日志来调查函数的执行情况。请务必使用与执行函数时的位置最接近的 Amazon 位置中存储的日志。
例如,如果您从伦敦查看文件,请尝试将 CloudWatch 控制台中的区域更改为欧洲(伦敦)。
检查你的 Lambda @Edge 函数的 CloudWatch 日志
登录Amazon Web Services Management Console并打开 CloudWatch 控制台,网址为 https://console.aws.amazon.com/cloudwatch/
。 -
将区域更改为您在浏览器中查看文件时所显示的位置。这是执行函数的区域。
-
在左侧窗格中选择日志以查看您的分配的日志。
有关更多信息,请参阅使用 Amazon 监控 CloudFront 指标 CloudWatch。
第 7 步:清除示例资源
如果您仅为本教程创建了 Amazon S3 存储桶和 CloudFront 分配,请删除您分配的Amazon资源,这样您就不会再产生费用。删除 Amazon 资源后,您添加的任何内容将不再可用。
任务
删除 S3 存储桶
在删除您的 Amazon S3 存储桶之前,请确保已禁用该存储桶的日志记录。否则,在您删除存储桶时,Amazon 会继续将日志写入其中。
禁用存储桶的日志记录
通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
选择存储桶,然后选择 Properties。
-
从属性中选择日志记录。
-
取消选中启用复选框。
-
选择 Save (保存)。
现在您可以删除存储桶。有关更多信息,请参阅《Amazon Simple Storage Service 控制台用户指南》中的删除存储桶。
删除 CloudFront发行版
在删除 CloudFront 分配之前,必须将其禁用。已禁用的分发不再起作用,并且不会产生费用。您可以随时启用已禁用的分发。已禁用的分配在删除后将不再可用。
禁用和删除 CloudFront 分配
打开 CloudFront 控制台,网址为https://console.amazonaws.cn/cloudfront/v4/home
。 -
选择要禁用的分配,然后选择禁用。
-
当系统提示确认时,选择是,禁用。
-
选择禁用的分配,然后选择删除。
-
当系统提示进行确认时,选择 Yes, Delete。
可了解更多信息的资源
现在,您对 Lambda@Edge 函数的工作方式已经有了基本概念,如需了解更多信息,请阅读以下内容: