Как я могу поместить ответ в отдельную лямбду за шлюзом api websocket?

У меня есть шлюз API AWS с подключением к веб-сокету. И есть лямбда (LA), которая вызывается этим шлюзом API и отправляет запрос в другую службу вместе с идентификатором подключения к веб-сокету. После этого он существует. Есть еще одна лямбда LB, которая прослушивает какое-то внутреннее хранилище данных. Служба хранилища данных вызовет LB, если произойдет какое-либо событие обновления. Событие включает идентификатор подключения к веб-сокету. И я хотел бы позволить LB отправлять событие обновления на шлюз API, который перенаправляет это событие клиентам через соединение через веб-сокет. Это способ общения в моем сознании. Мой вопрос заключается в том, поддерживает ли API-шлюз такой режим. Если да, то как LB отправляет ответное событие шлюзу API и клиентам?

Общение выглядит так, как показано на скриншоте ниже. Вопрос работает ли? как ответная лямбда отправляет событие на шлюз API?

введите здесь описание изображения

Я добавил ответ интеграции, как показано ниже. Есть Integration Request и Integration Response. Но я могу настроить только одну лямбду для них обоих. Как я могу сделать разные лямбды для запроса и ответа?

введите здесь описание изображения

введите здесь описание изображения


person Joey Yi Zhao    schedule 22.05.2020    source источник


Ответы (1)


Да, это работает.

API-интерфейсы WebSocket шлюза API: bidirectional. Клиент может отправлять сообщения службе, а службы могут independently отправлять сообщения клиентам.

Есть два способа отправить ответ с вашего lambda на api gateway;

1) Интеграция может отправлять ответ, который возвращается клиенту с помощью заданного вами маршрутного ответа. Вот подробности

2) Вы можете использовать @connections API для отправки запроса POST. Дополнительные сведения см. в разделе Использование команд @connections в серверной службе. Вот подробности

Ваш случай похож на вариант 2. Вызов api gateway с помощью connection api на вашем lambda.

person Ersoy    schedule 22.05.2020
comment
Я добавил ответ маршрута, но Integration Response и Route Response неактивны. Я не могу нажать на них, чтобы отредактировать. - person Joey Yi Zhao; 22.05.2020
comment
@JoeyYiZhao Они кликабельны, если вы имеете в виду ту часть prnt.sc/slp43x — вам нужно развернуть — не могли бы вы поделиться скриншот. Вы идете с первым вариантом правильно? - person Ersoy; 22.05.2020
comment
Это кликабельно на integration request. Я имею в виду Integration response. В моем режиме есть две лямбды, одна для запроса, другая для ответа. Я ищу способ настроить integration response из другой лямбды. - person Joey Yi Zhao; 22.05.2020
comment
Я понял, почему Integration response не кликабельно. Потому что это должна быть интеграция без прокси. После изменения на интеграцию без прокси я не могу настроить две лямбда-выражения для запроса и ответа. - person Joey Yi Zhao; 22.05.2020
comment
почему две лямбда-функции для запроса/ответа - одна и та же лямбда вернет ответ через обратный вызов на шлюз API. @JoeyYiZhao - person Ersoy; 22.05.2020
comment
Посмотрите на схему в моем посте, там три лямбды, одна на авторизацию, одна на запрос, одна на ответ. Когда в базе данных есть обновление, оно запускает лямбду, которая отвечает клиенту. Вот почему я думаю, что есть две лямбды для ответа/ответа - person Joey Yi Zhao; 22.05.2020
comment
@JoeyYiZhao проверьте здесь, пожалуйста, github.com /aws-samples/simple-websockets-chat-app/blob/master/ — также репозиторий — есть три лямбда-выражения, один для подключения/отключения/sendMessage — sendMessage обрабатывает оба. - person Ersoy; 22.05.2020
comment
Это не то, что мне нужно. В вашем примере sendMessage будет обрабатывать как запрос, так и ответ. Но в моем случае запрос и ответ обрабатываются разными лямбдами. Представьте, у вас есть лямбда для прослушивания потока Dynamodb, она должна отвечать шлюзу API. Как вы это определяете? - person Joey Yi Zhao; 22.05.2020
comment
@JoeyYiZhao serverless.com/blog/api-gateway-websockets-support это источник вашего изображения, верно? Это также написано в этом посте; При вызове бизнес-логика проверит ваше хранилище данных на наличие подключений, подписанных на этот канал, и callback to API Gateway with the connectionId and your payload. - person Ersoy; 22.05.2020
comment
Да все верно. Это исходное изображение. Но я не знаю, как callback to API Gateway. Вот почему я задал этот вопрос о том, как использовать другую лямбду для ответа на шлюз API. В консоли шлюза API я не могу настроить другую лямбду для ответа. - person Joey Yi Zhao; 22.05.2020
comment
Код обратного вызова также упоминается в примере кода через Promises to ApiGatewayManagementApi. Насколько я знаю, невозможно обработать ответ отдельно. Это может сработать - если вы запускаете dynamodb из лямбды sendmessage - другая лямбда прослушивает таблицу dynamodb - тогда она обещает все. Может у кого есть другой вариант. Это мое топливо :) - person Ersoy; 22.05.2020
comment
глядя на метод обратного вызова, он работает почти так же, как запрос/ответ, а не двусторонняя связь. С веб-сокетом он должен поддерживать push-сообщение с сервера на клиент после их подключения. Мой вопрос касается того, как я могу отправить сообщение с сервера на клиент. - person Joey Yi Zhao; 22.05.2020
comment
Кажется, я понял, как это работает. Я могу создать лямбду для вызова API AWS.ApiGatewayManagementApi для отправки сообщения клиенту через веб-сокет. Эту лямбду не нужно помещать в определение шлюза API. Консоль шлюза API вводит меня в заблуждение. - person Joey Yi Zhao; 22.05.2020