什么AWS服务,以避免与S3静态内容和后端的CORS问题

介绍

我已经在Amazon AWS上部署了以下架构。

高级架构

目标是在https://app.acmecorp.com上公开一个作为入口点的Web应用程序(单页应用程序)。 这是一个单页面应用程序:

  • 提供静态资源(html / js / css)
  • 需要通过JavaScript访问REST后端

后端

这个想法是将后端部署在Elastic Container Service Cluster(通过docker)中。 然后,这些资源会被生成/自动扩展到由负载均衡器提供服务的目标组中。 后端通过https://backend.acmecorp.com公开。 (指向AWS负载均衡器的DNS CNAME)

前端

单页面应用程序部署在Amazon S3 Bucket中,并通过S3静态站点托pipe显示。 ( http://frontend.s3-website-us-west-2.amazonaws.com )。 这也可以通过http://frontend.acmecorp.com上的DNS CNAME公开

反向代理

我想要的是以下。 用户通过https://app.acmecorp.com访问应用程序。 这应该服务于静态内容。 为避免CORS设置,我希望单页面应用程序能够将该域调用的API调用转换为/api ,因此对https://app.acmecorp.com/api/ **的调用应映射到后端。

  • https://app.acmecorp.com/api – > https://backend.acmecorp.com
  • https://app.acmecorp.com/ – > http://frontend.acmecorp.com/index.html

显然,这可以用Nginx之类的东西来完成,但是我想知道是否有亚马逊为此提供的东西,以及需要什么样的构build块才能拥有这个function

您可以使用Cloudfront和逆向代理方法实现您的目标:

  1. 首先使用app.acmecorp.com将您的发行版创build为特定的CNAME,并上传此子域的自定义SSL证书。

  2. 创build两个来源,一个指向您的存储桶,另一个指向您的API Load Balancer。 这两个来源将在稍后configuration您的CDN行为时使用。

  3. 为/ api创build一个以平衡器为原点的行为,将所有标题传递给原点(这将有效地禁用边缘caching)

  4. configuration默认行为以指向您的S3存储桶。

  5. 最后,将您的app.acmecorp.com指向DNS中的CDN端点。

Cloudfront的起源和行为有更多的select,你必须注意,但满足你的需求的基础是在那里。