AWS IoT-无法调用lambda函数

问题描述

我正在尝试让我的IoT设备启动Lambda功能。尝试了几个小时无济于事。

我的lambda函数很简单:

exports.handler = async (event) => {
    // Todo implement
    const response = {
        statusCode: 200,body: JSON.stringify(event.message),};
    return response;
};

我已经设置了IoT规则以通过SELECT * FROM 'iot/trigger-lambda'触发lambda函数。当我从AWS IoT的测试功能iot/trigger-lambda主题发布消息时,lambda函数成功触发。但是,当我从设备发布消息时,出现以下错误

{
    "ruleName": "ruleTriggerLambda","topic": "iot/trigger-lambda","cloudwatchTraceId": "xxx-yyy-zzz","clientId": "ABC123","base64OriginalPayload": "eydvcGVyYGTpb24nOiAncHV0T2JqZWN0JywgJ2J1Y2tldCc6ICdyZWR3YXZlLWFwcC1kZXYnLCAna2V5JzogJ3JlYWNoYmFjay56aXAnLQWncmVwbHlUbyc6ICdpb3QvdGhyGHT0aWQtMDAwMS9wcmUtc2lnbmVkLBNzLXVybC1yBBNwb25zZXMnfSBbMV0=","failures": [
        {
            "FailedAction": "LambdaAction","FailedResource": "arn:aws:lambda:us-east-1:xxx:function:lambdaTriggerLambda","errorMessage": "Failed to invoke lambda function. Received Server error from Lambda. The error code is 400"
        }
    ]
}

当我将lambda函数添加到规则中时,AWS表示它将创建更正权限。我还尝试过更新lambda函数的权限。

有关如何解决此问题的任何建议?任何帮助/信息都非常感谢。


编辑:4小时后或扯掉头发

原来是我从IoT设备作为有效负载发送的数据格式。让我解释一下,如果有人可以告诉我这是为什么,我很想知道。

我将Mac用作设备,并从AWS IoT Python SDK实现了this code。我的讯息如下:

message = {"message": "test message"}

似乎很简单的json。

发布消息的代码如下:

mqtt_connection.publish(
                topic=args.topic,payload=args.message,qos=mqtt.QoS.AT_LEAST_ONCE)

AWS IoT Core上收到的有效负载如下:

{'message': 'test message'} [1]

并伴随着这样的错误消息:我们无法将消息显示为JSON,而是将其显示为UTF-8字符串。

我想我有点没连接点,但是事实证明我必须对我的代码执行以下操作:

mqtt_connection.publish(
                topic=args.topic,payload=json.dumps(args.message).replace("\"",'').replace("[1]",'').replace("'",'"'),qos=mqtt.QoS.AT_LEAST_ONCE)

希望这种解释对将来的人有所帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)