S3托管网站Cloudfront发行版和指向同一子域的API Gateway自定义域

时间:2018-09-20 23:24:38

标签: amazon-s3 amazon-cloudfront amazon-route53 cname

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

  • 针对映射到api.example.com的S3静态网站具有1个CloudFront分布

  • 已将API网关自定义域名映射到相同的子域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网关自定义域名)并创建Bevahior规则以将v1 / *调用路由到API网关自定义域名。

在这一点上,事情不再落伍:  -访问https://api.example.com时,我从API网关发行版中获得了{“ message”:“ Fobidden”}。但是,URL https://api.example.com/v1仍返回预期结果。

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

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

1 个答案:

答案 0 :(得分:4)

对于上述用例,您仅需要一个Cloudfront发行版(已映射到api.example.com),该发行版就可以使用以下命令将流量转发到S3和API Gateway(均作为源添加到同一发行版)不同的行为配置。您可以通过以下方式配置行为:将/ v1 / *流量路由到API网关,将其他流量路由到S3。

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

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