如果通过 mqtt 发布字节数组,则不会调用 AWS Lambda

AWS Lambda is not invoked if byte array is published via mqtt

我在 AWS-iot 中创建了一个规则来调用带有以下查询的 lambda:

select * from 'my_topic'

此规则将调用以下 javascript lambda:

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";
        }

如果我将任何字符串发布到 my_topic,lambda 将完美运行。但是,如果我将 bytearray 发布到 my_topic,lambda 将不起作用。 CloudWatch 也没有显示任何日志。我怎样才能将字节数组放入我的 lambda 函数中。

lambda 可以接收二进制数据,只要它在 JSON 负载中经过 base64 编码 。这可以通过将规则更改为:

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

binary payloads in the SELECT clause 上的文档表明 SELECT * FROM 'a/b' 应该可以工作。但根据我的经验,这仅适用于具有某些操作(例如写入 S3)的非 JSON 有效负载,而不适用于其他操作(将其发送到 lambda 或 Kinesis 流)。

这似乎与 lambda 的调用方式有关。

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

AWS Lambda only accepts JSON payloads [1] so the Lambda action will only work for json payloads. This is a common problem and we recommend modifying your rule to base64 encode the binary into a json blob like so:

select encode(*, 'base64') as data from 'some/topic'

Your Lambda function will then need to be modified to decode the 'data' key in the event body.

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

我的假设是 lambda 调用使用 lambda REST API。这需要请求正文中的 JSON 有效负载,如 link 到 API_Invoke_RequestBody

中所述