从AWS中的通配符域提供大量静态站点

Gra*_*ant 2 amazon-s3 amazon-web-services amazon-route53

在这里,我遇到了一个非常具体的问题,我们已经拥有并维护了一个系统,该系统涉及使用子域将人员路由到特定应用。

在如下所示的传统服务器上;我们有一个通配符子域* .domain.com,该子域路由到nginx并提供一个文件夹

因此myapp.domain.com> nginx>提供了myapp应用文件夹> myapp文件夹包含一个静态站点

我正在尝试以某种方式将此迁移到AWS,我基本上需要在AWS中做类似的事情,我的想法是将每个静态应用程序放入s3存储桶,然后将其放入路由53中的通配符域,但是不确定s3如何知道要使用哪个文件夹,因为该功能不是路由53的一部分

有人有什么建议吗?

感谢你的帮助

Mic*_*bot 10

CloudFront + Lambda @ Edge + S3可以做到此“无服务器”。

Lambda @ Edge是CloudFront的增强功能,它允许将请求和响应的属性表示和操纵为简单的JavaScript对象。可以设置触发器以在请求处理期间触发,可以在检查缓存之前(“查看器请求”触发器),也可以在请求进行到后端之前(在这种情况下为S3网站托管端点“起源服务器”)在缓存未命中(“原始请求”触发器)之后...或在响应处理期间,从原始接收到响应之后,才考虑将其存储在CloudFront缓存中(“原始响应”触发器),或者在完成对浏览器的响应(“查看器响应”触发器)。响应触发器还可以检查原始请求对象。

以下代码片段是我最初在AWS论坛上发布的内容。这是一个Origin Request触发器,它将原始主机名与您的模式进行比较(例如,域必须匹配*.example.com),如果匹配,则主机名前缀subdomain-here.example.com为request ,该请求是从为该子域命名的文件夹中提供的。

lol.example.com/cat.jpg        -> my-bucket/lol/cat.jpg
funny-pics.example.com/cat.jpg -> my-bucket/funny-pics/cat.jpg
Run Code Online (Sandbox Code Playgroud)

通过这种方式,可以从单个存储桶中提供任意数量的子域中的静态内容。

为了访问原始的传入Host标头,即使Lambda函数执行的最终结果是在源头实际看到之前修改该值,也需要将CloudFront配置为将Host标头白名单以转发到源头

该代码实际上非常简单-以下大多数是解释性注释。

lol.example.com/cat.jpg        -> my-bucket/lol/cat.jpg
funny-pics.example.com/cat.jpg -> my-bucket/funny-pics/cat.jpg
Run Code Online (Sandbox Code Playgroud)

请注意,索引文档和来自S3的重定向可能还需要Origin响应触发器,以Location针对原始请求将标头标准化。这将取决于您所使用的S3网站功能。但是以上是一个有效的示例,它说明了总体思路。

请注意,const origin_hostname需要将其设置为在CloudFront原始设置中配置的存储区的端点主机名。在此示例中,存储桶位于us-east-2中,并且网站托管功能处于活动状态。

  • @mfink 感谢您的反馈。我确实忘记提及“Host”头白名单。但是,对于 `origin_hostname`,如果启用了网站托管功能并且您将网站端点用作原始域名——在此应用程序中通常是这种情况,因为这是呈现自动索引文档所必需的。 (2认同)