API Websocket не возвращает ответы AWS

#amazon-web-services #websocket #aws-lambda #aws-api-gateway

Вопрос:

У меня есть очень простой Websocket API хостинг в AWS.
Я интегрировал этот API с Lambda функцией, код которой :

 import json


def lambda_handler(event, context):
    print(event)
    return {
        "isBase64Encoded": False,
        "statusCode": 200,
        "headers": {"Content-Type": "application/json"},
        "body": json.dumps(event)
    }

 

Я также добавил ответ интеграции для двусторонней связи, как указано в этой документации

Ниже приведен мой тест wscat с использованием команды : wscat -c myapiendpoint

Результат

Как вы можете видеть, я успешно подключился, и если я напишу существующий маршрут из request.body.action selection ( sendMessage ), ошибки не будет, но вывода не будет. Если я напишу неправильный маршрут ( test который я не создал в консоли шлюза API), я получу сообщение об ошибке.

Я также пробовал использовать более простые выходы из функции, но ни один из них не работает. Я, наконец, написал приведенный выше код, как указано в этой документации.

Я просто хочу иметь возможность отправлять клиенту пользовательское сообщение (фактически данные из моей базы данных) при вызове маршрута.
На самом деле это то, что я хочу также для $connect $disconnect маршрутов и.

Я делаю что-то не так ?

Редактировать :

Вот моя настройка шлюза API для маршрута :

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

Вот скриншот о разрешении Лямбды. Кстати, это разрешения для всех моих Лямбд (в соответствии с HTTP API), которые все работают нормально :

разрешения

Комментарии:

1. Действительно ли ваш лямбда-код выполнен, что сообщают вам журналы лямбда-кода, что сообщают вам журналы шлюза api?

2. да, у меня есть журналы из Лямбды в CloudWatch, и все в порядке. body Параметр event содержит мои {«действие»: «Отправить сообщение», «данные»:»тест»}. Шлюз API, похоже, регистрирует только событие $disconnect и не показывает ошибок. Хочешь, я покажу тебе журналы ? Я обновлю print Лямбду в этом случае и обновлю вопрос.

3. привет — вы можете использовать модуль ведения журнала для отладки этого — все ваши инструкции по ведению журнала будут помещены в журнал cloudwatch (лучше, чем печать)

4. спасибо, да, я буду им пользоваться. До сих пор это, вероятно, не дает больше информации для ведения журнала, чем для печати, я просто пытался сделать минимальный пример кода

Ответ №1:

Иногда, и это, вероятно, ваш случай, вы не развернули свои изменения в API WebSocket. Это случилось со мной, когда я использовал автоматическое поэтапное развертывание с API HTTP, а не с API WebSocket.

Ответ №2:

Похоже, что ваша функция Lambda не имеет разрешения на отправку сообщений в соединения шлюза API. Попробуйте предоставить вашей лямбда-функции разрешение на действие execute-api:ManageConnections с ресурсом шлюза API.

Комментарии:

1. Спасибо за ваш ответ. Не могли бы вы предоставить более подробную информацию ? Я не могу найти это разрешение при попытке добавить его в свою лямбду. Кроме того, я добавил скриншот моих текущих разрешений, которые отлично работают с HTTP-API и одинаковы для этой Лямбды.