【问题标题】:Can you send a message to a websocket client from a non-websocket lambda?您可以从非 websocket lambda 向 websocket 客户端发送消息吗?
【发布时间】: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


【解决方案1】:

我认为您应该使用它从后端向您的客户发送消息。

要向客户端发送回调消息,请使用:

发布 https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-how-to-call-websocket-api-connections.html

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    相关资源
    最近更新 更多