Как отправить ответ обратно клиенту с помощью веб-сокетов в AWS Lambda - PullRequest
1 голос
/ 14 октября 2019

Я использую Serverless Framework для развертывания приложения 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, я не получаю ответа.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Функции AWS Lambda не очень подходят для WebSockets. WebSockets должны быть долгоживущими, в то время как лямбда-функции обычно выполняются, а затем завершаются. Для использования WebSockets и Lambda вам понадобится другой слой, возможно, что-то вроде AWS IoT или Fanout.

0 голосов
/ 16 октября 2019

Проблема была с моей лямбдой, она была в пользовательском VPC, в результате чего лямбда не получала доступ в интернет.

Я исправил это, добавив дополнительные подсети с NAT-шлюзом в AWS.

...