【问题标题】:Serve SPA multi-tenants through AWS CloudFront from a single S3 bucket通过 AWS CloudFront 从单个 S3 存储桶为 SPA 多租户提供服务
【发布时间】:2020-11-04 13:51:35
【问题描述】:

考虑到以下几点:

  • 包含静态前端 SPA 文件的单个 S3 存储桶。
  • 前端通过 CloudFront 提供服务,每个租户都有自己的 CloudFront 分配(tenantA.domain.com,...tenantZ.domain.com)。
  • 每个租户都有自己的配置(可以从解析域的配置服务中获取)。
  • 每个 CloudFront 都需要在运行时在前端注入此类配置。


我正在考虑一个 Lambda 函数,它查询“配置服务”(可能缓存响应),然后设置全局范围的变量(例如 window.config1)供 SPA 使用。通过 CloudFront 可以实现这样的场景吗?有没有更通用/标准化的方式?

【问题讨论】:

  • 如果前端从 api 调用或 S3 存储桶 get 调用获取配置而不需要云端执行此操作,是否存在问题?

标签: amazon-web-services amazon-s3 amazon-cloudfront multi-tenant


【解决方案1】:

是的,你可以做到,我做到了! (一直想写一篇关于它的博客。 我在一个多租户 SAAS 平台上工作,其中租户有自己的 Cognito 身份提供者配置。我所做的是我有一个文件config.js,看起来像这样,有一堆 Cognito 设置:(我正在使用 ReactJS)

window.TENANT_CONFIG = {
      REACT_APP_USERPOOL_REDIRECT_SIGNIN : "https://todo.somesite.com/",
      REACT_APP_USERPOOL_REDIRECT_SIGNOUT : "https://todo.somesite.com/",
      REACT_APP_WEB_CLIENT_ID : "todo",
      REACT_APP_TENANT_NAME : "todo" ....
    };

此图块作为 javascript 脚本包含在我的 index.html 顶部

<script type="text/javascript" src="%PUBLIC_URL%/config.js"></script> 

Lambda

您需要us-east-1 中的 Lambda 函数,它将成为 Cloudfront 分发中 Edge 的 Lambda。这个函数必须只有128 MB,并且没有环境变量。您可以参考this 文档了解如何创建 Lambda 函数。但一般来说你需要构造window.TEN...。您可以阅读event.Records[0].cf.request.headers['host'][0].value 以确定您的呼叫是来自一个域还是另一个域,并构建适当的config.js 文件。我的 Lambda 函数实际上是从 S3 存储桶读取配置。你的会不一样。

CloudFront

如果可以生成正确的证书,实际上只需要一个CloudFront 域。只需确保您已添加所有不同子域的 CName。然后你需要添加一个路径模式为:config.js 的行为。配置Lambda Function Associations 的Viewer Request 并指定您的Lambda Function ARN。你很高兴!

【讨论】:

  • 这正是我正在实施的解决方案! (通过每个租户的 Cognito 用户池配置)。我很想看看你写的博客文章。
  • 哈哈,我真有心去做!买了我的域名和一切。是的,在 Cognito 中,每个租户都有不同的 Web 应用程序客户端,我根据他们访问的子域查找配置。每个租户可能有不同的 IDP 提供者。此外,当用户进行身份验证时,我将他们的tenantId 添加到他们的 id-token 中。每个租户也是 Cognito 中的一个组,用于在租户内搜索用户。是的,这就是我一直在做的一些事情,效果非常好,很难找到所有信息来将它们联系在一起。
  • @Derrops 你最后写了一篇关于它的博客吗?我非常期待实现相同目标的指导,但到目前为止还没有找到任何有用的资源
  • 这里实际上有一个视频:youtube.com/watch?v=mwQ5lipGTBI 几乎是我所做的,但有点不同。实际上,我已经决定把它变成一种产品,客户可以部署它来完成开发 SaaS 应用程序的一些繁重工作,因为这确实是很多工作,而且自己做这件事非常困难。
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2021-01-25
  • 1970-01-01
  • 2017-07-04
  • 2016-12-08
相关资源
最近更新 更多