问题描述
我们正在使用 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”修复了该问题。