S3 托管网站 Cloudfront 分布和 API 网关自定义域指向同一子域

M.S*_*.S. 4 cname amazon-s3 amazon-cloudfront amazon-route53

我的网站有一个名为 api.example.com 的子域,我希望实现以下目标:

  • 有 1 个映射到 api.example.com 的 S3 静态网站的 CloudFront 分配

  • 将 API Gateway 自定义域名映射到同一个子域 api.example.com

我为实现此设置所做的步骤是:

  1. 创建一个 API 网关自定义域 api.example.com 并为我想公开为 v1(现在是版本 1)的 API 设置基本映射

  2. 在 Route 53 中,我创建了一个 CNAME 记录 api.example.com,指向步骤 1 中 API 网关的 Edge 优化目标域名

注意:此时我如预期的那样从https://api.example.com/v1得到 200 响应

  1. 我创建了一个 S3 存储桶并将其设置为静态网站托管。所有文件上传成功并正常工作。

  2. 我创建了一个新的 Cloudfront 发行版,源在 S3 存储桶中。此时,对于此 Cloudfront 分配,我无法将 CNAME 记录设置为 api.example.com,因为它已被 API 网关中设置的第一个自定义域名使用,并且 AWS 给出了 CNAMEAlreadyExistsException - 所以我将此字段留空. 访问 S3 存储桶的 CloudFront 分配按预期工作。

  3. 在为 S3 存储桶生成的 CloudFront 分配下,我添加了另一个源(API Gateway 自定义域名)并创建了 Bevahior 规则以将 v1/* 调用路由到 API Gateway 自定义域名。

在这一点上,事情不再就位: - 访问https://api.example.com 时,我从 API 网关分发中收到 {"message": "Fobidden" }。但是 URL https://api.example.com/v1仍然返回预期的结果。

问题:有什么我遗漏的设置,以便 URL https://api.example.com返回 S3 静态网站的内容吗?

注意:此外,我在 S3 存储桶 cloudfront 分配上有一个空的 CNAME 字段,而我在 Route53 中使用相同的 cloudfront 分配定义了一个 CNAME,这一事实提示我一条警告消息,指出这种情况可能会使我暴露在漏洞中。

Ash*_*han 5

对于您提到的用例,您只需要一个 Cloudfront 发行版(映射到 api.example.com),它应该能够使用不同的行为配置将流量转发到 S3 和 API Gateway(均作为源添加到同一发行版) . 您可以配置行为,将 /v1/* 流量路由到 API 网关,将其他流量路由到 S3。

在设置起源和行为时,您需要遵循的配置很少。

  • 确保 S3 和 API Gateway 行为都将 HTTP 重定向到 HTTPS。
  • 添加仅转发 HTTPS 流量的 API 网关源集时。
  • 在 API Gateway 行为中,将 accept-*ones、授权、来源、引用者的标头列入白名单,并确保您没有将“主机”标头列入白名单。
  • 在这两个来源中,不要添加任何路径。
  • 对于 API 网关行为,将 TTL 配置为 0 并允许所有方法(GET、POST 等)

  • API Gateway 部署完全不需要自定义域名。CloudFront 分配可以设置一个源以指向 API 的通用 `execute-api` 主机名。(此外,API 应该是区域性的,而不是边缘优化的。无论哪种方式都可以使用,但是当在您自己的 CloudFront 发行版后面使用时,不应使用边缘优化,因为它会具有更高的延迟,并且某些标头可能无法按预期通过因为请求遍历 AWS 边缘网络两次而不是一次。) (2认同)