我正在尝试在 AWS 上托管我的整个产品组合,其中包括 5 个 React + Node.js 应用程序(包括产品组合本身)。对于每个项目,我将前端托管在 S3 上,并在前端使用 CloudFront 分配。我已将投资组合设置为从我将调用的 Route53 自定义域提供服务,该域mydomain.com
通过 ACM SSL 证书具有 HTTPS。其他应用程序可以使用其存储桶中的网站端点。我希望所有应用程序的前端通过调用与 EC2 实例交互,所需的 API 运行在哪个端口https://api.mydomain.com:${APP_PORT}/${ROUTE}
。APP_PORT
我已经在我的实例上安装了 Node.js,克隆了 2 个 repos,并使用 PM2 启动了应用程序。每个应用程序都在监听 get 请求/
并返回${APP_NAME} API working properly
. 一个在端口 5000 上运行,另一个在 5001 上运行。我在附加到实例的安全组中有以下入站规则:
类型 | 协议 | 端口范围 | 资源 |
---|---|---|---|
HTTP | TCP | 80 | 0.0.0.0/0 |
HTTP | TCP | 80 | ::/0 |
SSH | TCP | 22 | 0.0.0.0/0 |
SSH | TCP | 22 | ::/0 |
自定义 TCP | TCP | 5000 | 0.0.0.0/0 |
自定义 TCP | TCP | 5000 | ::/0 |
HTTPS | TCP | 443 | 0.0.0.0/0 |
HTTPS | TCP | 443 | ::/0 |
自定义 TCP | TCP | 5001 | 0.0.0.0/0 |
自定义 TCP | TCP | 5001 | ::/0 |
目前,我可以通过实例和端口的公共IPv4 DNS调用每个API,这样就可以http://ec2-012-34-56-789.compute-1.amazonaws.com:5000/
工作了http://ec2-012-34-56-789.compute-1.amazonaws.com:5001/
。我想让它https://api.mydomain.com...
改为使用。从我所见,我应该使用应用程序负载均衡器,然后在我的 Route53 托管区域上创建一个 A 记录。
这就是我卡住的地方。
我使用面向内部的方案、IPv4 IP 地址类型和以下侦听器创建了一个应用程序负载均衡器:
负载均衡器协议 | 负载平衡器端口 |
---|---|
HTTP | 80 |
HTTPS | 443 |
HTTPS | 5000 |
HTTPS | 5001 |
我保留默认 VPC 并检查所有可用区。在安全设置中,我选择了我的 ACM 证书,其中包括mydomain.com
、www.mydomain.com
和*.mydomain.com
. 默认安全策略 ( ELBSecurityPolicy-2016-08
)。接下来,安全组与我用于实例的安全组相同。这就是我认为我犯了一个错误的地方:我创建了一个新的目标组类型实例,协议 HTTP 和版本 HTTP1,以及端口 80。运行状况检查是通过 HTTP at 执行的/
。我注册我的实例并单击创建。
我在 Route53 上创建了一条 A 记录,api.mydomain.com
并将其作为指向应用程序负载均衡器的别名。目标群体完成健康检查并显示不健康。HTTP 获取对负载平衡器 DNS 名称的请求,或api.mydomain.com
两者后跟任一端口 show 400 The plain HTTP request was sent to HTTPS port
。HTTPS 请求分别显示Error: Hostname/IP does not match certificate's altnames...
和502 Bad Gateway
。