AWS Lambda не вызывается, если байтовый массив опубликован через mqtt - PullRequest
1 голос
/ 19 февраля 2020

Я создал правило в AWS -iot, чтобы вызывать лямбду со следующим запросом:

select * from 'my_topic'

Это правило будет вызывать лямбду ниже javascript:

var AWS = require('aws-sdk');
var zlib = require('zlib');
var s3 = new AWS.S3();

        exports.handler = (event, context, callback) => {  
            console.log("hello:");
            var bucketName = "otonomobucket";
            var keyName = getKeyName("myData", Date.now());
            var content = event;
            //var content = JSON.stringify(event);

            console.log("event data:" + content);

            var params = { Bucket: bucketName, Key: keyName, Body: content };

            s3.putObject(params, function (err, data) {
                if (err)
                    console.log(err)
                else
                    console.log("Successfully saved object to " + bucketName + "/" + keyName);
            });
        };

        function getKeyName(folder, filename) {
            return folder + '/' + filename + ".txt";
        }

Лямбда отлично работает, если я опубликую sh любую строку в my_topi c. Но лямбда не работает, если я опубликую sh bytearray в my_topi c. CloudWatch также не показывает никаких журналов. Как я могу получить массив байтов в свою лямбда-функцию.

1 Ответ

4 голосов
/ 19 февраля 2020

Лямбда может принимать двоичные данные при условии, что они закодированы в base64 и в полезной нагрузке JSON. Это можно сделать, изменив правило на:

SELECT encode(*, 'base64') AS data FROM 'my_topic'

Документация по двоичным данным в предложении SELECT указывает, что SELECT * FROM 'a/b' должно работать. Но по моему опыту это работает только для полезных нагрузок не JSON с некоторыми действиями (например, запись в S3), а не с другими (отправка его в лямбда-поток или поток Kinesis).

Похоже, это проблема с тем, как вызывается лямбда.

С https://forums.aws.amazon.com/thread.jspa?messageID=925603&#925603

AWS Lambda принимает только JSON полезных нагрузок [1], поэтому действие Lambda будет работают только для json полезных нагрузок. Это распространенная проблема, и мы рекомендуем изменить правило для кодирования base64 двоичного файла в json блоб следующим образом:

выберите кодировать (*, 'base64') как данные из 'some / topi c '

Затем вам необходимо изменить функцию Lambda для декодирования клавиши «данные» в теле события.

[1] https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestBody

Моя гипотеза состоит в том, что лямбда-вызов использует лямбда-REST API. Для этого требуется JSON полезная нагрузка в теле запроса, как описано в ссылке на API_Invoke_RequestBody

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