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