#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 и не показывает ошибок. Хочешь, я покажу тебе журналы ? Я обновлю3. привет — вы можете использовать модуль ведения журнала для отладки этого — все ваши инструкции по ведению журнала будут помещены в журнал cloudwatch (лучше, чем печать)
4. спасибо, да, я буду им пользоваться. До сих пор это, вероятно, не дает больше информации для ведения журнала, чем для печати, я просто пытался сделать минимальный пример кода
Ответ №1:
Иногда, и это, вероятно, ваш случай, вы не развернули свои изменения в API WebSocket. Это случилось со мной, когда я использовал автоматическое поэтапное развертывание с API HTTP, а не с API WebSocket.
Ответ №2:
Похоже, что ваша функция Lambda не имеет разрешения на отправку сообщений в соединения шлюза API. Попробуйте предоставить вашей лямбда-функции разрешение на действие execute-api:ManageConnections
с ресурсом шлюза API.
Комментарии:
1. Спасибо за ваш ответ. Не могли бы вы предоставить более подробную информацию ? Я не могу найти это разрешение при попытке добавить его в свою лямбду. Кроме того, я добавил скриншот моих текущих разрешений, которые отлично работают с HTTP-API и одинаковы для этой Лямбды.