发布的汤姆不能2022年3月1日

使用CloudFront函数处理重定向

在过去的几年里,我们已经看到了无数在web应用程序中处理重定向的方法。从Apache重写规则到AWS alb、Lambda@Edge,甚至使用S3对象元数据。在这篇文章中,我将分享另一种我们最近在MyBuilder中开始使用的方法:CloudFront Functions。

我们最近将我们的整个网络栈转移到AWS Lambda,使用流行的Bref项目。用无服务器的方法取代传统的LAMP堆栈感觉像是向前迈出了一大步,但没有Apache,我们需要一种新的方式来确保mybuilder.com上的所有流量都从我们的规范域得到重定向和服务,www.lyogen.com

去年AWS发布了CloudFront Functions,这是一个轻量级计算平台,运行在CloudFront边缘网络上。有一些与性能相关的限制,比如1毫秒的最大执行时间,但对于重定向等简单用例来说是理想的。

我们所要做的就是定义一个JavaScript处理函数(编写本文时是ECMAScript 5.1),它检查请求并在必要时返回一个重定向响应。CloudFront传递给我们一个事件对象包含请求,我们可以从中提取宿主头进行检查:

函数处理程序事件var宿主事件请求宿主& &事件请求宿主价值||如果宿主indexOfwww。= = =0返回事件请求var变量的名称对象事件请求变量的名称地图关键= >关键++事件请求变量的名称关键]。价值加入);返回statusCode301statusDescription搬到永久位置价值https://www。+宿主+事件请求uri+变量的名称长度>0??+变量的名称),},},};

如果传入的请求已经开始www。,返回原始请求对象,CloudFront像往常一样将其发送到原始请求对象。否则,我们构造一个新的请求URI,并告诉CloudFront发出一个重定向响应。

用cURL检查头文件,确认它是由CloudFront函数处理的:

旋度-我//www.lyogen.com HTTP/2 301 server: CloudFront location: //www.lyogen.com/ x-cache: FunctionGeneratedResponse from CloudFront…

基础设施代码

然而,故事并没有就此结束。在MyBuilder中,我们也非常相信自动化,所以如果不介绍我们是如何编写这部分基础设施的,那将是我的疏忽。只要有可能,我们就会使用terrform之类的工具来减少手动配置的痛苦。

下面的terrraform配置展示了我们如何引用上面的JavaScript来提供一个CloudFront函数并将其附加到CloudFront发行版:

资源“aws_cloudfront_function”“www_redirect”的名字“www-redirect”运行时“cloudfront - js 1.0”代码文件“$ {path.module} / www-redirect.js”发布真正的资源“aws_cloudfront_distribution”“主要”...default_cache_behavior...function_associationevent_type“viewer-request”function_arnaws_cloudfront_functionwww_redirect在攻击

结论

我们迁移到CloudFront Functions在很多方面都给我们带来了好处。它不仅超级便宜(Lambda@Edge成本的六分之一!),而且感觉在基础架构级别隔离这个问题更正确,而不是在我们自己的运行时中。

我们已经使用CloudFront处理栈中的web交付部分有一段时间了,这种情况不太可能很快改变。所以,虽然毫无疑问会有另一种处理重定向的方法近在咫尺,但感觉上我们已经找到了一些可以坚持下去的方法。

工作MyBuilder

我们需要一个有经验的软件工程师,他热爱他们的手艺,并愿意分享他们来之不易的知识。

查看职位空缺
评论的Disqus
Baidu
map