Могу ли я использовать AWS лямбду для работы в качестве клиента WebSocket (AWS IoT стек)? - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь подключиться к уже развернутому AWS стеку IoT

const AWS = require('aws-sdk');
const iotData = new AWS.IotData({ endpoint: MYENDPOINT });

exports.handler = async (event) => {
try {
   const request = event;
   console.log(request);

    const params = {
        topic: common.topicOut,
        payload: 'MYPAYLOAD'
    }
    console.log("endpoint:",iotData.endpoint,"params:",params);
    iotData.publish(params, (err,res) => {
        if (err) throw err;
        return { statusCode: 200, body: res };
    })


} catch (e) {
   console.error(e);
   return { statusCode: 400, body: 'error, see lambda console' };
}
};

формально все «компилируется» (без ошибок), но затем я не получаю ответа. Сужая проблему, я вижу, что я пытаюсь использовать конечную точку REST https, но MYENDPOINT поддерживает только wss

Я знаю https://aws.amazon.com/es/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/, но это для того, чтобы лямбды назывались 'server' клиента wscat. Я также прочитал некоторые обескураживающие сообщения здесь , но я предпочитаю перепроверить, если кто-то из вас, ребята, уже нашел решение для он использует AWS -Lambda

Если нет, я начну использовать этот обходной путь , но я не контролирую конечную точку wss, поэтому мне придется сделать один на моем владеть и предложить коллеге внести изменения для меня на своей стороне (а я совсем не контролирую их)

Ваш опыт (даже если они дают советы о том, «не следовать по этому пути» - я sh) очень приветствуется.

ОБНОВЛЕНИЕ : у меня есть консольный тестовый клиент, который может подключаться к конечной точке через awsIot.device и предоставляет keyPath, certPath, caPath и clientId.

Может ли быть, что я получаю тихую ошибку из-за разрешений? Когда я пытаюсь использовать awsIot.device без сертификата, происходит сбой с Error: No "keyPath" or "privateKey" option supplied., поэтому я не могу проверить, что если бы на консоли я получил ту же (тихую) ошибку

UPDATE2 : Follow https://docs.aws.amazon.com/iot/latest/developerguide/http.html Я могу сделать

$ curl --tlsv1.2 --cacert ./certificates/Amazon_Root_CA_1.pem --cert ./certificates/MYCRT --key ./certificates/MYKEY -X POST -d"PAYLOAD" "https://XXX.iot.REGION.amazonaws.com:8443/topics/MYTOPIC?qos=0"

, и это работает. Так что я еще больше убежден, чем раньше, что это сработает, если я смогу добавить сертификаты к запросу

UPDATE3 : в настоящее время я ничего не использую AWS для это и просто создание запроса https, который имитирует вышеупомянутый вызов curl

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

Я пытаюсь написать в стиле asyn c -wait. Это работает как проверено. Пожалуйста, убедитесь, что роль и конечная точка верны.

var AWS = require('aws-sdk');

const iotdata = new AWS.IotData({ endpoint: 'XXXXXXXXXX.iot.YYYYYYYYYYY.amazonaws.com' });

exports.handler = async(event) => {
    try {
        const params = {
            topic: 'smartHomeTest',
            payload: 'Hello there',
            qos: 0
        };

        const data = await iotdata.publish(params).promise();

        console.log(data);
        const response = {
            statusCode: 200,
            body: JSON.stringify(data)
        };
        return response;
    }
    catch (e) {
        console.error(e);
        return { statusCode: 400, body: 'error, see lambda console' };
    }
}
1 голос
/ 14 марта 2020

Ваше решение не работает, потому что ваша лямбда-функция ничем не вызывается. Это просто zip-файл на AWS лямбда-сервере где-то в ожидании вызова для запуска AWS для его запуска. Таким образом, для функции Lambda невозможно создать соединение через веб-сокет и держать его открытым, прислушиваясь к сообщению.

Похоже, вам не хватает того факта, что у службы AWS IoT есть встроенная встроенная поддержка для вызова AWS лямбда-функций при получении событий. Вам необходимо определить лямбда-функцию как цель события в вашей AWS IoT-службе, и она автоматически вызовет вашу функцию и передаст сообщение MQTT в качестве параметра event вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...