Исключение при публикации сообщения mqtt из лямбда внутри контейнера docker

#amazon-web-services #docker #mqtt #aws-iot

Вопрос:

Я запускаю aws SAM Lambda внутри контейнера docker и пытаюсь опубликовать сообщение MQTT, используя класс PubSub из примера кода aws (aws iot SDK для JAVA). Когда я использую один и тот же класс/метод вне лямбды, это работает. когда я запускаю его изнутри лямбды, я получаю следующее исключение:

software.amazon.awssdk.crt.CrtRuntimeException: ошибка aws_tls_ctx_options_init_client_mtls_from_path (ошибка aws_last_error: ОШИБКА AWS_ERROR_FILE_INVALID_PATH(44), Неверный путь к файлу.) НЕИЗВЕСТНО(-1)

Я думал, что это связано с тем, что у контейнера docker не было доступа к сертификатам (pem-файлам), поэтому я добавил это в параметры общего доступа к файлам в конфигурации docker, и все равно то же исключение.. Что я здесь упускаю?

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

1. Invalid file path Ошибка кажется довольно очевидной; без дополнительной информации ( Dockerfile и т. Д.) Ее трудно прокомментировать дальше.

Ответ №1:

Как и говорили «британцы», смысл довольно ясен. Файлы сертификатов не распознаются, поскольку Lambda работает в контейнере Docker, который не имеет доступа к файлам на вашем локальном жестком диске, включая сертификаты. Есть два решения, которые могут сработать:

  1. Вместо использования прямого MQTT используйте MQTT Через WebSocket — Sig4, который использует учетные данные IAM вместо сертификатов. https://github.com/aws/aws-iot-device-sdk-java#build-the-sdk-from-the-github-source
  2. В зависимости от вашего варианта использования может даже иметь смысл использовать HTTPS — IotDataPlaneClient для публикации сообщений вместо MQTT, особенно если могут возникнуть проблемы с параллелизмом при использовании нескольких Лямбд, пытающихся использовать одни и те же сертификаты. https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/iotdataplane/IotDataPlaneClient.html

В итоге я выбрал вариант 1 — IDK, если есть способ включить файлы в область контейнера docker, но это хороший обходной путь.