将 S3 静态站点与应用程序负载均衡器结合使用

Posted

技术标签:

【中文标题】将 S3 静态站点与应用程序负载均衡器结合使用【英文标题】:Using a S3 Static Site with an Application Load Balancer 【发布时间】:2019-12-14 13:51:48 【问题描述】:

我有一个 ALB,它当前将流量路由到多个 url。如果我们需要执行维护,我希望能够将流量路由到静态 S3 站点。然后,我们将显示一个静态的“维护”页面,而不是我们的登录页面。

我创建了一个 CloudFront 分配,允许 S3 站点加载 SSL 证书,但我不确定如何连接该分配以将所有流量发送到 S3 维护站点。

这是我正在使用的 Terraform ALB 侦听器。我可以在target_group 指定我的CloudFront 分配arn 并让它将所有流量路由到静态站点吗?

或者我可以简单地将我的 S3 arn 与允许 ALB 访问以获取存储桶对象的 S3 策略链接?

resource "aws_alb_listener" "ssl_alb_httpslistener" 
   load_balancer_arn = "$aws_alb.alb_lis.arn"
   port = "443"
   protocol = "HTTPS"
   ssl_policy = "Sec-TLS"
   certificate_arn = "$var.ssl_cert_arn"

    default_action 
     target_group_arn = "$data.terraform_remote_state.php.target_arn"
     type = "forward"
   

我希望我可以将通过 ALB 的流量从 target_group 路由到静态 S3 站点。好奇这是否是解决此问题的最佳方法。

【问题讨论】:

【参考方案1】:

简单的答案是使用 ALB 上的重定向选项将流量转发到新的 url。我的 Route53 url 连接到与 S3 存储桶链接的 CloudFront 分配。在这里,我可以指定一个重定向 url,并通过最少的基础设施修改来保持我的 HTTPS 流量选项。

【讨论】:

【参考方案2】:

您现在可以将 Lambda 函数作为目标组,并且使用 Lambda,您可以触发 S3、发出 cloudfront(http) GET 请求等。

【讨论】:

lambda 的问题是,请求的主体只能是 1MB。我在提供 Angular 应用程序时遇到了同样的问题。我无法加载 main..*.js,因为它是 1.4 MB。仍在寻找另一种解决方案,因为我们希望在同一主机下拥有前端和后端。如果有人有解决方案,请发表评论!【参考方案3】:

我在使用 ALB 和 lambda 时遇到了同样的 1MBytes 限制问题,并使用压缩作为解决方法。 在响应头中设置 Content-Encoding= 并相应地压缩您的文件。

【讨论】:

以上是关于将 S3 静态站点与应用程序负载均衡器结合使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 S3 用作静态网页和 EC2 作为 REST API 一起使用? (AWS)

Nginx+Tomcat负载均衡集群

Oracle RAC 负载均衡测试(结合服务器端与客户端)

GSLB全局负载均衡详解

记一次负载均衡+NFS博客站点搭建的总结

nginx 反向代理以及负载均衡实验