使用 AWS IoT Core 规则和 AWS Lambda 处理嵌套的 JSON 消息

问题描述

我们正在使用 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,nestedPayload: {
         nestedProperty: "bar"
    }
  }
}

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

{
   deviceid: "test",nestedProperty: "bar"
  }
}

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

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

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...