现在新加坡云服务器提供Lambda @ Edge支持

 国外服务器     |      2019-09-28 10:15:46

 

  AWS Lambda等功能即服务(FaaS)产品是现代新加坡云服务器应用程序堆栈中的关键组件,因为它们可以接收和处理由其他云服务(例如存储桶或数据库)生成的事件数据。

  AWS早在2014年末就宣布了其FaaS服务AWS Lambda以及S3集成,从而可以对S3存储桶中发生的更改做出反应。当时,AWS Lambda的主要用例是简化许多公司用来处理存储在此类存储桶中的数据的数据处理管道。

  最终宣布了对AWS Lambda的AWS API Gateway支持,从而使构建100%新加坡云服务器Web应用程序成为可能,从而无需运行和维护用于处理传入请求和响应的专用Web服务器。从那时起,Web应用程序成为新加坡云服务器应用程序的顶级用例。

  由于对新加坡云服务器Web应用程序的兴趣日益浓厚,AWS引入了另一种Lambda函数,称为Lambda @ Edge。借助Serverless Framework v1.52.0,我们添加了对Lambda @ Edge函数的本机支持。

  在本文中,我们将更深入地研究新加坡云服务器Web应用程序,以了解它们如何从Lambda @ Edge函数中受益。在开始讨论Lambda @ Edge之前,我们先回顾一下典型的新加坡云服务器Web应用程序的组成。

  构建新加坡云服务器的Web应用程序

  粗略地说,Web应用程序可以分为两部分:前端和后端。尽管新加坡云服务器Web应用程序由几种不同的云服务组成,但仍然可以将它们分为这两部分。

  让我们看一下组成现代新加坡云服务器Web应用程序的不同部分。

  前端

  前端的主要目的是将.html,.css和.js文件与其他静态资产(例如图像)一起提供给消费者(通常是网络浏览器),以显示用户可以与之交互的UI。

  当我们的浏览器呈现静态内容时,它还将使用我们的前端JavaScript代码与我们的新加坡云服务器后端进行交互(请稍后详细介绍)。

  在使用AWS为用户提供前端服务时,我们可以使用AWS S3(这是一种存储解决方案来托管我们的静态资产)和AWS CloudFront(一种CDN服务)来在全球数据中心中自动分配此类资产。

  有人可能会问,为什么在此设置中需要CloudFront。将所有文件上传到S3存储桶并每天称呼还不够吗?

  通常,当用户将访问我们的网站,他的请求将被发送到我们的S3存储而这又成为我们的公共资产(比如.html,.css和.js文件)。虽然此初始设置可以正常工作,但缓存不经常更改的内容通常是一个更好的主意。这就是AWS CloudFront出现的地方。借助CloudFront,我们可以在S3存储桶的前面设置一个缓存层。此缓存分布在全球各地。用户不会从S3下载我们的资产,而是从附近的CloudFront位置提取它们,这比仅S3的解决方案要快得多。

  后端

  前端已启动并正在运行,是时候快速看一下潜在的新加坡云服务器Web应用程序后端了。根据使用情况,我们通常需要API网关,数据处理功能和数据存储解决方案。

  为了满足这样的要求,新加坡云服务器的web应用程序通常具有内置AWS API网关用作API网关,AWS LAMBDA来处理进入的事件数据和AWS DynamoDB其用作持久层(其他DB解决方案也是可用的)。

  例如,当用户与我们的Web应用程序前端交互并想要更新其密码时,请求将从前端发送到API网关,这是我们后端的入口点。API网关将此请求转换为触发我们的Lambda函数的事件。然后,此类Lambda函数将处理事件数据并将更新的密码存储在DynamoDB表中。完成后,将生成响应并将其通过API网关发送回用户。

  如前所述,此设置对于新加坡云服务器Web应用程序是非常典型的设置。

  查看由前端和后端组成的完整堆栈,可能会询问是否确实有必要针对每个单个用户请求执行从前端到后端然后再返回的完整往返。

  假设您正在运营一个社交网站,并且想要将移动用户重定向到您网站的专用“精简”版本,该版本提供较少的内容,因此加载速度更快。让请求一直传送到您的后端,检测到您的用户正在使用移动设备并发出重定向到优化的移动Web应用程序,这不会浪费时间和资源。在根本不触及后端的情况下“在边缘”处理该请求是否更好?

  那就是Lambda @ Edge出现的地方!

  LAMBDA @边缘

  Lambda @ Edge是AWS的计算产品,可将AWS Lambda函数部署到CloudFront服务的边缘位置。Lambda @ Edge函数由CloudFront事件触发,例如传入请求或传出响应,并且可以使用此事件信息来重写此类请求和响应(在我们的案例中,检查设备类型以在移动设备上发出重定向)。

  Lambda @ Edge函数与常规AWS Lambda函数非常相似。实际上,它们是常规的AWS Lambda函数,需要遵守一些限制:只有版本化的Lambda函数才能变成Lambda @ Edge函数Lambda @ Edge函数的最大内存大小为128 MB Lambda @ Edge函数的最大内存大小5秒超时Lambda @ Edge处理程序响应与正常Lambda函数相比有所不同

  话虽如此,为了利用Lambda @ Edge函数,没有什么新知识需要学习。实际上,新加坡云服务器框架v1.52.0会为您处理繁重的工作。您唯一需要做的就是提供功能代码并cloudFront在serverless.yml文件中设置相应的事件。

  好奇这看起来如何?让我们看一个例子。

  

  让我们实现一个示例,该示例将移动用户重定向到“轻型” Web应用程序URL,而无需进行从前端到后端的完整往返操作。

  让我们从serverless.yml文件开始,将常规Lambda函数转换为Lambda @ Edge函数。这样做就像将cloudFront事件添加到events定义并设置正确的配置参数一样简单:

  service: cloudfront-service

  provider:

  name: aws

  runtime: nodejs10.x

  functions:

  cfLambda:

  handler: functions/handler.cloudfront

  events:

  - cloudFront:

  eventType: origin-request

  origin: https://app.acme.com

  在这里,你可以看到,我们添加了cloudFront事件具有eventType的配置origin-request和origin配置https://app.acme.com。此配置告诉新加坡云服务器框架,我们希望cfLambda每次将请求发送到https://app.acme.com源时都调用我们的函数。

  接下来,我们需要编写函数逻辑以将移动用户重定向到Web应用程序的“精简版”。

  'use strict';

  exports.handler = (event, context, callback) => {

  const request = event.Records[0].cf.request;

  const headers = request.headers;

  if (headers['cloudfront-is-mobile-viewer'] && headers['cloudfront-is-mobile-viewer'][0].value === 'true') {

  request.uri = '/lite + request.uri;

  9 }

  10

  11 callback(null, request);

  12};

  每次通过CloudFront分发路由请求时都会触发此功能。一旦发生这种情况,我们将查看请求标头以查看它是否是移动用户。如果是这种情况,我们会将/lite字符串放在uri 前面并返回请求。

  而已。现在,我们准备部署Lambda @ Edge函数。通常,部署此服务就像运行一样简单serverless deploy。

  请注意,由于AWS会在后台为您设置CloudFront分布并在全球范围内复制Lambda函数,因此部署可能需要一段时间。

  完成后,您应该在部署摘要中看到CloudFront端点。如果您使用移动设备访问此端点,您将被重定向到Web应用程序的“精简版”!

  关于移除的注意事项

  完成测试后,您可能希望通过删除服务serverless remove。请注意,删除操作还会花费一些时间,并且不会自动删除Lambda @ Edge函数。原因是AWS必须清理您的函数副本,这可能需要几个小时。过早删除Lambda函数将导致错误。

  现在,此问题的解决方案是几个小时后通过AWS控制台手动删除Lambda @ Edge函数。您可能希望使用脚本自动执行此过程,该脚本发出AWS SDK调用以简化此清理过程。

  结论

  AWS Lambda @ Edge是在用户附近的边缘位置运行功能代码的好方法,因此通常提供较低的延迟。

  Lambda @ Edge函数是常规的“精简” Lambda函数,可以读取和修改请求和响应数据。这样就可以例如拦截传入的请求并立即返回响应,而无需将数据传递到后端服务。典型的Lambda @ Edge使用案例包括根据设备类型或IP地址重写响应URL,识别爬网程序并提供静态,预渲染的资产,即时内容压缩或身份验证标头操作。

  使用Serverless Framework v1.52.0,我们通过cloudFront事件添加了对Lambda @ Edge函数的本机支持。每个Lambda函数都可以轻松转换为Lambda @ Edge函数,并通过熟悉的serverless deploy命令进行部署。您可以cloudFront在我们的cloudFront事件文档中阅读有关事件类型的更多信息。

  我们希望您喜欢这项新功能。您如何看待Lambda @ Edge?您打算如何使用它?在Twitter上通过@goserverless让我们知道,或者在下面发表评论!