Как мога да поставя отговор в отделна ламбда зад websocket api gateway?

Имам AWS API Gateway с websocket връзка. И има ламбда (LA), която се извиква от този API шлюз и изпраща заявка до друга услуга заедно с идентификатора на връзката на websocket. След това съществува. Има друга ламбда LB, която слуша някое хранилище за данни в задната част. Услугата за съхранение на данни ще извика LB, ако има събитие за актуализиране. Събитието включва идентификационен номер на връзка към websocket. И бих искал да позволя на LB да изпрати събитие за актуализация до API шлюза, който препраща това събитие към клиенти през уебсокет връзка. Това е режим на комуникация според мен. Въпросът ми е дали API шлюзът поддържа такъв режим. Ако да, как LB изпраща събитие за отговор до API шлюза и до клиентите?

Комуникацията изглежда като екранната снимка по-долу. Въпросът е дали работи? как отговорът ламбда изпраща събитие към API шлюза?

въведете описание на изображението тук

Добавих интеграционния отговор, както е показано по-долу. Има Integration Request и Integration Response. Но мога да настроя само една ламбда и за двете. Как мога да направя различна ламбда за заявка и отговор?

въведете описание на изображението тук

въведете описание на изображението тук


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


Отговори (1)


Да работи.

API Gateway WebSocket са 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 gateway. @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 обработва и двете. - 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 Gateway. В конзолата на api gateway не мога да конфигурирам различна ламбда за отговор. - person Joey Yi Zhao; 22.05.2020
comment
Кодът за обратно извикване също е споменат в примерния код чрез Promises to ApiGatewayManagementApi. Доколкото знам, не е възможно да се обработи отговор в отделна. Може да работи - ако задействате dynamodb от sendmessage lambda - друга lambda слуша dynamodb таблица - тогава обещава всичко. Може би някой друг може да има друга възможност. Това ми е горивото :) - person Ersoy; 22.05.2020
comment
като разгледаме метода за обратно извикване, той работи почти като заявка/отговор, а не като двупосочна комуникация. С websocket трябва да поддържа насочено съобщение от сървър към клиент, след като се свържат. Въпросът ми е как мога да изпратя съобщение от сървър към клиент. - person Joey Yi Zhao; 22.05.2020
comment
Мисля, че разбрах как работи. Мога да създам ламбда, за да извикам API AWS.ApiGatewayManagementApi, за да изпратя съобщение до клиента чрез websocket. Тази ламбда не е необходима за поставяне в дефиницията на API Gateway. Конзолата на API Gateway ме подвежда. - person Joey Yi Zhao; 22.05.2020