AWS API Gateway与Socket.io的集成

时间:2019-01-29 18:31:33

标签: amazon-web-services socket.io aws-api-gateway amazon-cognito

我想将API网关端点与Socket.io服务器端点进行映射,以便通过Cognito对用户进行身份验证,如果成功,则重定向到Socket.io服务器并建立具有可选名称空间和房间的套接字。

这有意义吗?我没有找到任何示例,并且API Gateway最近才启用了WebSocket API,但不支持Socket.io

2 个答案:

答案 0 :(得分:3)

您的问题分为两个部分:

首先,API网关使用Cognito对您的客户端进行身份验证;

第二,假设您使用的EC2运行带有API。网关作为客户端端点的带有Socket.IO的Node.JS。

对于第一部分,您可以使用以下reference from AWS documentation。 在谈论AWS Cognito时,有几个子部分,例如,包括用于启用API资源端点HTTP方法的AIM权限Method Execution

第二点,enable API Gateway与运行Socket.io的EC2端口建立同步连接,您可能会读到一些参考文献,例如this one。 您应该配置API网关:

  1. 协议WebSocket连接
  2. 选择您的Route Selection expression,例如\$default
  3. 为每个$connect$disconnect$default映射目标后端
    1. 使用集成类型AWS服务
    2. 选择EC2并填写其余配置。

答案 1 :(得分:1)

Rafael 的回答更侧重于使用 Websocket API 网关,在我看来它仍然相对较新,并且有一些改进空间。另外,我不喜欢将 lambda 与数据库访问集成,因为没有 RDS 代理,它们会非常快地超过数据库连接,而且我认为 HTTP 集成不会为整个事情增加任何东西,因为您最终执行的是 HTTP 请求,但它是通过 Websocket API 调用。

我同意 Rafael 的一件事是,您需要有一个运行 socket.io 的 EC2 实例,无论它是在 Node.js 中还是在 python 中(在我的情况下,我使用 python 和 Flask)。

我通过使用 HTTP API 网关并设置 allow_upgrades=False 设法连接到我的 socket.io,因此 http 协议不会升级到 ws 协议,因为 HTTP API 网关不支持 ws。我的 HTTP API 网关只是将 socket.io 请求转发到负载均衡器,好处是您可以在 HTTP API 网关中定义的每个路由上定义 access control

我的 EC2 实例上的 socket.io 定义如下:

socketio = SocketIO(async_handlers=True, allow_upgrades=False, cors_allowed_origins='*')

我的客户端只需调用启用了代理集成的 HTTP API 网关中定义的路由即可连接到它。

https://xxxxxxxxx.execute-api.us-west-2.amazonaws.com/socket.io/{proxy}

最终结果 - 客户端连接到套接字

socket.io connected