发布的汤姆不能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宿主=(事件.请求.头.宿主& &事件.请求.头.宿主.价值)||”;如果(宿主.indexOf('www。')= = =0){返回事件.请求;}var变量的名称=对象.键(事件.请求.变量的名称).地图(关键= >关键+'='+事件.请求.变量的名称[关键]。价值).加入('&');返回{statusCode:301,statusDescription:'搬到永久',头:{位置:{价值:'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_association{event_type=“viewer-request”function_arn=aws_cloudfront_function.www_redirect.在攻击}}}
结论
我们迁移到CloudFront Functions在很多方面都给我们带来了好处。它不仅超级便宜(Lambda@Edge成本的六分之一!),而且感觉在基础架构级别隔离这个问题更正确,而不是在我们自己的运行时中。
我们已经使用CloudFront处理栈中的web交付部分有一段时间了,这种情况不太可能很快改变。所以,虽然毫无疑问会有另一种处理重定向的方法近在咫尺,但感觉上我们已经找到了一些可以坚持下去的方法。