在私有暂存域名上为负载均衡器设置CloudFront

43次阅读
没有评论

问题描述

拥有一个名为 foobar-staging.com 的域名,用于暂存环境,以便在发布到生产环境之前进行反馈、测试或演示。最近,他决定将 UI 静态文件部署到 S3,并将其他所有内容回退到 ALB。原始设置仅可私有访问,因此用户必须连接到 VPN 才能访问 foobar-staging.com。根据目前的测试,CloudFront 的内容源必须是公共的,因此似乎我无法保持暂存服务器私有,除非有人告诉我有其他方法?

他希望在私有环境中访问的是:

域名 > CloudFront > S3(/routeX、/routeY)或 ALB(其他路由 /*)

EC2 实例只有私有 IP,而 ELB 安全组不允许公共访问。他已经允许了 80/443 端口对 0.0.0.0/16 的访问,以便查看 CloudFront 在设置中的工作情况…虽然他不一定需要 CloudFront(其他替代方法也可以,因为他不能在 ALB 中路由到 S3),但如果没有 CloudFront 放在 S3 和 ALB 前面,他只能通过 S3 Amazon 域名访问 UI 应用程序,而他更愿意使用 foobar-staging.com。

他想知道是否可能实现这一点。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1:使用 CloudFront 和签名 Cookie

基于签名 Cookie 的解决方案可以实现私有访问需求。用户可以为 CloudFront 设置签名 Cookie,以便在访问时验证权限。以下是实现步骤:
1. 阅读并了解 Amazon CloudFront 签名 Cookie 的实现方式
2. 创建一个 Lambda 函数,用于处理签名 Cookie。您可以参考 这个示例 进行基本实现。
3. 确保您将 CloudFront 中的内容源设置为 S3 和 ALB。
4. 在 CloudFront 的行为设置中,选择 “Restrict Viewer Access (Use Signed URLs or Signed Cookies)”,以便只允许携带有效签名 Cookie 的请求访问。

方案2:使用自定义脚本控制访问顺序

另一种方法是使用自定义脚本来控制访问顺序,使得 CloudFront 只能在满足特定条件时将请求转发到 S3 或 ALB。以下是一个简单的示例脚本:

#!/bin/bash
# 使用 curl 请求 CloudFront,携带签名 Cookie
response=$(curl -s -o /dev/null -w "%{http_code}" -H "Cookie: your_signed_cookie=your_cookie_value" https://your_cloudfront_domain.com/routeX)
# 根据返回状态码判断是否转发请求到 S3 或 ALB
if [ "$response" -eq 200 ]; then
    # 请求转发到 S3
    curl https://your_cloudfront_domain.com/routeX
else
    # 请求转发到 ALB
    curl https://your_cloudfront_domain.com/other_routes
fi

在上述示例中,脚本首先使用 curl 请求 CloudFront,携带签名 Cookie,并检查返回的状态码。根据状态码,脚本将请求转发到 S3 或 ALB。

请注意,这些解决方案仅供参考,您可能需要根据您的实际情况进行调整和修改。

总结

通过使用 CloudFront 和签名 Cookie,或者自定义脚本控制访问顺序,您可以在私有暂存域名上为负载均衡器设置 CloudFront,以实现所需的私有访问需求。这将使您能够在私有环境中访问 UI 应用程序,并确保只有具有有效权限的请求才能访问。

正文完