如果通过 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󡾣
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
中所述
我在 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󡾣
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
中所述