AWS ECS 架构

问题描述

我有一个 React 前端和 Flask 后端,我想用 ECS 部署它们。我想让 React 应用程序面向公众,并隐藏 Flask 服务器并且无法从外界访问。

从我读到的,方法应该如下:

  1. 在公共子网上为 Flask 服务器创建一个带有 NAT 网关的公共和私有子网。
  2. 在公共子节点上部署 react 应用程序,在私有子节点上部署服务器。

现在我感到困惑的地方:

  1. 如何将 React 应用程序暴露给外界?我应该使用 Internet 网关还是 ELB/ALB?有什么区别?
  2. 当服务器只有私有 IP 时,如何让 React 应用程序与服务器通信?服务发现?如果是这样,我应该如何使用 docker 将服务器的服务名称注入 react 应用程序?

解决方法

  1. 如何将 React 应用程序暴露给外界?我应该使用 Internet 网关还是 ELB/ALB?有什么区别?

如果 React 前端是静态网站,那么最好使用 S3 + CloudFront 来托管它。但是,如果您想使用 ECS,那么是的,通常使用面向 Internet 的负载均衡器就是这样做的。

ELB 是第一代负载均衡器。现在,您应该将 ALB 与 第二代 平衡器一起使用,它提供了比 ELB 多得多的功能,例如从 http 重定向到 https。

互联网网关适用于您的 VPC,仅当您使用自定义目标 VPC 时才需要。如果您使用默认 VPC,则无需担心。

  1. 当服务器只有私有 IP 时,如何让 React 应用程序与服务器通信?服务发现?如果是这样,我应该如何使用 docker 将服务器的服务名称注入 react 应用程序?

您不能使用私有 IP 或服务发现。您的前端将在您的客户端浏览器中执行,因此它必须使用互联网与您的后端通信。这意味着您需要使用公共 IP 而非私有 IP 公开 Flask API。

这也可以使用公共 ALB 来完成。您可以使用与前端相同的 ALB。因此,您将进行以下设置:

                                   |---> Target Group 1 ---> ECS Services for React frontend (private subnet)
Client ---> ALB (public subnet) ---|
                                   |---> Target Group 2 ---> ECS Service for Flask (private subnet)