将AWS Lambda @ Edge与CloudFront配合使用

Lambda @ Edge是AWS Lambda计算服务的补充,用于自定义cloudfront提供的内容.

显示AWS Lambda与cloudfront的工作的框图AWS显示在下面 :

Block Diagram Cloudfront

有四个AWS Lambda可以使用和减去的方式;

  • 查看者请求&减去; 最终用户制作名为Viewer Request to CloudFront的请求

  • Origin Request :   CloudFront将请求转发给原始

  • Origin Response :   CloudFront收到来自原点的回复

  • Viewer Response :   CloudFront将响应发送给查看器

我们可以将Lambda @ Edge用于以下目的 :

  • 更改标题请求和响应时间.

  • 向标题添加Cookie详细信息.根据请求和响应进行AB测试.

  • 根据标题详细信息将URL重定向到另一个站点.

  • 我们可以从标题中获取用户代理,并找出浏览器,操作系统等的详细信息.

必需品

要开始使用CloudFront和Lambda @ Edge,我们需要以下 :

  • 创建包含文件详细信息的S3存储桶

  • 创建角色,允许使用CloudFront和Lambda @ Edge的权限

  • 创建CloudFront分配

  • 创建lambda函数

  • 将lambda功能详细信息添加到Cloudfront

  • 检查浏览器中的云端网址

我们将使用CloudFront和Lambda @ Egde进行示例,其中我们将托管页面并在检测到桌面和设备时更改响应.

创建S3 Storag e带有文件详细信息的存储桶

登录AWS控制台并在S3中创建存储桶并添加.你要显示的html 文件.

存储桶

单击 S3 创建存储桶,如下所示 :

Amazon S3

现在,单击创建存储桶按钮并添加存储桶的详细信息,如下所示 :

创建水桶按钮

点击创建按钮并上传.html它.

上传Html

创建角色

转到AWS控制台并单击 IAM .

安全

现在,点击角色 - >创建角色按钮如图所示 :

创建角色仪表板

选择 S3,Lambda Cloudfront 的权限.最好通过使用ARN详细信息创建仅授予所需功能,存储权限的策略.

在下面讨论的示例中,我们显示完整访问权限许可.如上所示,添加了角色名称角色的前沿的策略.点击创建角色.

完全访问权限


Role Cloudfront

lambda @ edge和cloudfront所需的所有策略如上所示.这里还有一个额外的步骤要做,因为云端网站可以跨区域使用,并且它需要我们正在使用的服务之间的信任关系.

现在,对于创建的角色,点击信任关系标签显示和减去;

关系

点击编辑信任关系,如下所示 :

编辑信任关系

它显示一个政策文件.我们需要在 Principal  - >中添加其他服务.我们计划使用的服务.最终信任关系政策文件如下所示 :

最终信任关系

单击更新信任策略按钮以保存更改.

创建CloudFront分配

转到CloudFront服务如下所示 :

创建Cloudfront

单击CloudFront服务并单击on 创建发行 :

创建发行版

原点设置,行为设置和分配设置

让我们逐个查看这些设置 :

原点设置

Origin Settings

Origin设置的各种参数解释为低于和低于;

Origin Domain Name :  这是我们存储html文件的S3存储桶的名称.我们还可以通过创建我们选择的文件夹在S3存储桶中存储图像(如果有).

Origin Path :  在这里您需要输入名称存储文件的文件夹.目前,我们没有此文件夹,因此我们暂时将其保留为空白.

原点ID :  当原始域名为选择.您可以根据自己的选择更改ID.

限制Bucket Access :  在此,我们将选择选项.在这里,我们需要S3存储桶的安全性,以便没有人可以访问S3存储桶.对于此选项,还有一些选项填充,如原点访问标识,存储区上的注释和授权读取权限.

原点访问标识 :  我们使用了创建新的身份选项.您也可以选择现有身份.这将创建一个新标识,CloudFront将使用该标识从S3存储桶中读取详细信息.

Bucket上的Grand Read Permission :  为此,请选择.

Origin自定义标题&减号; 我们会在此处将标题留空,因为我们现在不需要详细信息.

接下来,让我们讨论并填写行为设置 for Cloudront distribution :

行为设置

现在,选择协议 -  https或http,以及缓存选项.请注意,默认缓存为86400或24小时.您可以根据要求更改此值.

单击对象缓存(自定义选项)以更改缓存.如果您的网页上有任何视频,您可以使用畅畅的流媒体.在这里,我们保持默认选项.创建lambda函数后,将添加其详细信息.

分发设置的详细信息如下所示 :

对象缓存

分配设置的各种参数在下面和下面解释;

价格等级 :  它包含用户流量来源等详细信息.请注意,我们在此处选择了默认值 -  使用所有边缘位置.

AWS WAF Web ACL :  这是针对Web的应用防火墙选择.在这里,它有选项.首先,我们需要在AWS中创建防火墙.它为网站提供安全保障.

替代域名&减号; 如果您有域名,可以在此指定域名.

SSL证书 :  这包含为SSL证书选择的所有详细信息.我们将保留默认值.

默认Root对象 :  这里我们将指定我们在S3中上传的文件名.为此,我们需要默认显示.html中的内容.

对于其余部分,我们将保留默认设置.

点击创建发布按钮添加发布.

Cloudfront Distribution

请注意,分发将花费一些时间来显示已部署的状态.

创建AWS Lambda函数

转到AWS控制台并创建Lambda函数.

Cloudfront Function

在AWS Lambda代码中,我们将获取请求标头并检查用户代理.如果用户代理来自桌面,我们将更改响应显示消息为"DESKTOP:欢迎使用带有Cloudfront的AWS Lambda!"如果设备消息将是"移动设备:来自Lambda @ Edge的您好!"

相应的AWS Lambda代码如下所示 :

let content = `
<\!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>Simple Lambda@Edge Static Content Response</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
   </head>
   
   <body>
      <h1>MOBILE DEVICES : Hello from Lambda@Edge!</h1>
   </body>
</html>
`;
let content1 = `
<\!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>Simple Lambda@Edge Static Content Response</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
   </head>
   
   <body>
      <h1>DESKTOP : Welcome to AWS Lambda with Cloudfront!</h1>
   </body>
</html>
`;
exports.handler = (event, context, callback) => {
   let request = event.Records[0].cf.request;
   let finalrequest = JSON.stringify(request);
   let headers = request.headers;
   let useragent = JSON.stringify(headers["user-agent"][0].value);
   let str = "";
   if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i.test(useragent)) {
      str = content;
   } else {
      str = content1;
   }
   const response = {
      status: '200',
      statusDescription: 'OK',        
      body: str+useragent,
   };
   callback(null, response);
};

现在,保存Lambda函数.请注意,我们需要发布Lambda函数,以便它可以与所有区域一起使用.要发布,我们需要执行以下操作;

从"操作"下拉菜单中选择发布新版本,如下所示 :

发布新版本

如果您,请单击发布新版本,它会显示以下屏幕 :

发布最新版本

现在,输入版本说明,然后单击发布. ARN将显示创建的AWS Lambda函数的版本,如下所示 :

Version Description

将CloudFront触发器添加到如下所示创建的新版本 :

Cloudfront Trigger

现在,添加CloudFront的配置详细信息. CloudFront事件具有查看者请求,原始请求,原始响应查看者响应的选项.

接下来,选择CloudFront分配之前创建的.从活动,我们将选择查看者请求.根据查看者请求,将决定用户代理的桌面/设备,并更改响应.接下来,添加触发器详细信息.

查看者请求

一旦触发添加后,我们需要等待部署CloudFront的分发.

Cloudfront Deploy

状态更改为已部署后,我们可以测试CloudFront网址并在浏览器中检查域名.

桌面显示浏览器如下图所示.这里我们从viewer-request事件中打印了用户代理.

桌面浏览器

这是移动设备中的显示.

移动设备

因此,在上面的示例中,我们使用Lambda @ Edge更改桌面和移动设备上的响应.