【问题标题】:Handling nested JSON messages with AWS IoT Core rules and AWS Lambda使用 AWS IoT Core 规则和 AWS Lambda 处理嵌套 JSON 消息
【发布时间】:2021-04-13 11:42:51
【问题描述】:

我们正在使用 AWS IoT 规则将所有消息从事物转发到 Lambda 函数,并在途中使用此查询附加一些属性:

SELECT *, topic(2) AS DeviceId, timestamp() AS RoutedAt FROM 'devices/+/message'

发送给主题的消息是一个嵌套的 JSON:

{
   version: 1,
   type: "string",
   payload: {
     property1: "foo",
     nestedPayload: {
         nestedProperty: "bar"
    }
  }
}

当我们对另一个规则使用相同的查询并将消息路由到 S3 存储桶而不是 Lambda 时,存储桶中生成的 JSON 文件与预期的一样:

{
   DeviceId: "test",
   RoutedAt:1618311374770,
   version: 1,
   type: "string",
   payload: {
     property1: "foo",
     nestedPayload: {
         nestedProperty: "bar"
    }
  }
}

但是当路由到一个 lambda 函数时,“nestedPayload”的属性被拉高了一级:

{
   DeviceId: "test",
   RoutedAt:1618311374770,
   version: 1,
   type: "string",
   payload: {
     property1: "foo",
     nestedProperty: "bar"
  }
}

但是,当使用 VS Code 在本地调试 Lambda 时,提供 JSON 文件(换句话说:未连接到 AWS IoT Core),JSON 结构符合预期,这就是为什么我假设错误不与JSON 序列化器/反序列化器,但有规则。

有人遇到过同样的问题吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-iot


    【解决方案1】:

    事实证明,问题出在规则的 SQL 版本上。

    我们使用 CDK 创建了到 Lambda 的规则路由,默认情况下将版本设置为“2015-10-08”。没有显示错误的路由到 S3 的规则是手动创建的,并且使用了版本“2016-03-23”。将规则路由更新到 Lambda 以也使用“2016-03-23”修复了该问题。

    【讨论】:

    • 嗨 Schweder,这实际上是唯一对我有用的解决方案,感谢您的回答。阅读您的答案后,我搜索了有关 sql 版本的信息,发现 AWS 在其官方文档中也说明了此修复程序。 docs.amazonaws.cn/en_us/iot/latest/developerguide/… "2016-03-23 SQL 规则引擎版本的新增功能" "选择嵌套 JSON 对象的修复。"
    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2019-07-02
    • 2020-06-22
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多