【问题标题】:How to send a response back to client using websockets in AWS Lambda如何使用 AWS Lambda 中的 websocket 将响应发送回客户端
【发布时间】:2020-02-11 10:37:07
【问题描述】:

我正在使用无服务器框架将 WebSocket 应用程序部署到 AWS Lambda。

我需要让它在访问 WebSocket 路由时向客户端发送响应。

这是我的处理程序:

const AWS = require("aws-sdk");

module.exports.websocketHandler = async (event, _) => {
  const {
    requestContext: { routeKey }
  } = event;

  switch (routeKey) {
    case "$connect":
      // ....
      break;

    case "$disconnect":
      // ....
      break;

    case "getBot":
      const body = JSON.parse(event.body);
      const postData = body.data;
      const params = {
        ConnectionId: event.requestContext.connectionId,
        Data: JSON.stringify(postData)
      };

      postMessage(params, event);
      break;

    case "$default":
    default:
      return { statusCode: 200 };
  }

  return { statusCode: 200 };
};

const postMessage = async (data, event) => {
  try {
    const apigwManagementApi = new AWS.ApiGatewayManagementApi({
      apiVersion: "2018-11-29",
      `https://${event.requestContext.domainName}/${event.requestContext.stage}`
    });

    await apigwManagementApi.postToConnection(data).promise();
  } catch (err) {
    console.log(err);
  }
};

它只是回复发送的任何内容。我正在使用wscat 工具连接到WebSocket。

wscat -c wss://{API-ID}.execute-api.{REGION}.amazonaws.com/dev
{"action": "getBot", "data": "Hello world"}

我试过离线测试它,它工作得很好。部署后,我可以连接到它,但每当我尝试将操作发送到 getBot 时,我都没有收到任何响应。

【问题讨论】:

  • 您使用它的方式(至少在此示例中),最好使用 REST api,因为您实际上只是在客户端向您发送请求时做出响应。我对这些东西不太了解,但我使用 websocket api,它与 lambda 完美配合,向注册的连接 id 发布消息,但我从来没有在对客户端消息的响应中这样做 - 不确定这是否有效。
  • 为了简单和调试,我使用了这个代码示例。

标签: javascript node.js amazon-web-services aws-lambda serverless


【解决方案1】:

问题在于我的 lambda,它位于自定义 VPC 中,导致 lambda 无法访问互联网。

我通过在 AWS 中添加带有 NAT 网关的额外子网来解决此问题。

【讨论】:

    【解决方案2】:

    对于其他提出这个问题的人,您需要做一些事情:

    1. 使用 API 网关创建 WebSocket API。
    2. 为您需要处理的每个 WS 事件创建路由键
    3. 在创建路由键的同时(或之前),为每个 WS 事件创建 Lambda 函数。 将您给定的 Lambda 函数连接到 WS API 路由。 (请务必部署您的 Lambda 函数)
    4. 确保为每个 Lambda 函数正确设置权限(确保 API Gateway 可以访问它们)。
    5. 从 API Gateway 部署您的 WS API。使用 wss://[...] URL 通过客户端进行连接。

    有用的文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/websocket-api-develop.html

    享受吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      相关资源
      最近更新 更多