WebSockets 通过 CloudFront + NLB 到 ECS Fargate (NestJS)

问题描述 投票:0回答:1

我的应用程序的一部分旨在使用 socket.io 处理来自我的 React 前端的 websocket 连接

问题

我已经设置好所有内容,现在遇到一个问题,来自 socket.io-client 的 HTTP 握手尝试获取状态 400 作为响应,如果我尝试直接使用 WebSocket 传输,我只能在“网络”选项卡中看到重复的“完成”状态

设置

我的后端设置:Docker > NestJS (socket.io)

我的 AWS 设置:CloudFront > NLB > ECS Fargate

我的前端设置:React + socket.io

附加信息

CloudWatch 中的 NestJS 日志是纯粹的,最后一个:NestJS 成功启动最后一个预期:已连接:到达我前端中的端点后的用户 ID

我已经通过使用 CloudFront 域名在浏览器中导航到 / 根路径来测试 NestJS 容器的连接,并且它运行良好 - 按预期返回 Hello World 页面,因此 NestJS 服务器正在运行

还在本地测试了我的带有或不带有容器的 NestJS - 一切都按预期运行,所以问题出在 AWS 基础设施中的某个地方

从底部开始,我的配置:

NestJS

NestJS 在端口 80 运行

WebSocket 网关继承 80 端口,未定义命名空间

Docker

Docker 暴露 80 端口

ECS

ECS 任务定义端口映射 - 80:80 TCP

ECS 服务(NestJS 容器)安全组:允许来自 NLB 的所有 TCP:0-65535 流量

NLB

NLB 安全组 1:IPv4 HTTPS TCP:443。从 0.0.0.0/0 (以防万一)

NLB 安全组 2:IPv4 HTTP TCP:80。从0.0.0.0/0

NLB 监听器设置为 TCP:80 到目标组,其中包含运行 NestJS 容器的服务

云前

CloudFront 安全策略:TLSv1.2_2021

CloudFront 支持的 HTTP 版本:HTTP/2、HTTP/1.1、HTTP/1.0

CloudFront 终止 TSL 并使用 TCP:80 将流量路由到 NLB,尽管它本身接受 443(HTTP 仅到 > NLB)

CloudFront 策略:将 HTTP 重定向到 HTTPS(传入)

重要更新: 连接到 NLB,避免使用 CloudFront - 有效。问题出在 CloudFront 中的某个地方

amazon-web-services websocket amazon-ecs amazon-cloudfront aws-nlb
1个回答
0
投票

解决了!

我应该附加允许保留标头(在我的情况下为来源、主机、授权)的缓存策略,并且连接已成功建立。

© www.soinside.com 2019 - 2024. All rights reserved.