【发布时间】:2019-07-14 21:39:14
【问题描述】:
我设置了一个 nodejs websocket AWS lambda 端点(Api 网关),它可以连接并回显消息。在初始连接期间,我将端点和 connection_id 保存到数据库。那得救就好了。如果我打开浏览器客户端并连接到 websocket 端点,我可以成功连接,并成功从浏览器发送消息 - 我有代码可以回显消息,并且可以正常工作。
现在,在另一个提供 REST 端点的 nodejs lambda 中,我有从数据库加载 connection_id 并执行此操作的代码:
// 'connection' is loaded successfully from DB (I log it and see the right values)
let api = new AWSSDK.ApiGatewayManagementApi({apiVersion: '2018-11-29', endpoint: connection.endpoint});
await api.postToConnection({
ConnectionId: connection.connection_id,
Data: JSON.stringify({ message: 'Hello World' })
}).promise();
但是,REST 端点中的代码(上面的代码)总是在 postToConnection 中出现 410 错误。我知道连接仍然处于活动状态,因为我可以在测试上面的 REST API 之前连接到它并在浏览器客户端中 ping 它。
是否无法从非 websocket lambda 发布到 websocket 连接?
【问题讨论】:
-
请检查此 AWS lambda 是否有足够的权限访问 API 网关并将消息发送到套接字。
-
我添加了类似这样的内容,但没有收到任何权限错误:-效果:允许操作:-执行-api:管理连接-执行-api:调用资源:#-“arn:aws:执行 api:${opt:region, self:provider.region}:*:
/*/*/@connections/{connectionId}" - "arn:aws:execute-api:${opt:region, self:provider.region}:*:*" -
为了向套接字发送消息,您需要先建立连接。没有它,您将无法发送消息。这就是该协议的工作原理。只有该客户端和服务器可以通过该套接字连接发送消息。在您的情况下,您可能需要检查 pub sub 架构师和实现。
-
这是一个 lambda,它们是短暂的,它是维护与客户端连接的 API 网关。这就是您获得要发布到的连接 ID 的原因。
标签: node.js amazon-web-services websocket aws-lambda