通过IoT核心规则传递时间戳时通过SQL time_to_epoch,数据未插入到Timestream表中

问题描述

假设传感器发送这样的数据:

{"timestamp": "2020-11-11 08:27:19","temperature": 90,"device": "device1"}
  1. 创建IoT核心规则以将数据发送到Timestream db表。

  2. 规则sqlSELECT device,temperature,time_to_epoch(timestamp,'yyyy-MM-dd HH:mm:ss') as fn_ts FROM 'topic'

  3. 维度:device

    值:${device}

  4. 时间戳记:${fn_ts}

    单位:MILLISECONDS

此数据未达到Timestream db。但是,如果删除在步骤4中设置的“时间戳记”字段,则数据将到达“时间流”数据库可能是什么问题?

令人惊讶的是-如果我将步骤2的输出重新发布到一个主题,并创建一条规则,以与上述步骤3和步骤4相同的配置将来自该主题的msg发送到Timestream db中,则数据将进入Timestream db中。

此外,如果原始消息是{"fn_ts": 1605083835000,"device": "device1"},并且我有一条规则要使用相同的步骤3和步骤4将数据发送到Timestream db,那么数据将到达Timestream表。

解决方法

我只是浪费了 2 天的时间来玩弄 IoT Rule direct Injection to the Timestream。我只能确认它从一开始就和看起来一样有问题。使用自定义时间戳的唯一方法是执行您提出的解决方法,例如在单独的规则中转换有效负载并重定向到另一个 IoT 主题。因为出于某种原因,注入操作看不到 SQL 生成的 JSON 中的字段,我可以清楚地诊断它,因为我附加了一个 CloudWatch 操作来查看我尝试使用 SQL 创建的每个负载。


但是还有一个大问题。当您最终设法将数据注入表中时,您会发现每个有效负载字段都是表中的一个单独的度量字段,甚至时间戳本身以及您已标记为维度的所有字段。那是可恶的。在我浪费了这么多时间之后,我仍然需要继续使用自定义 lambda 来避免表格中的所有那些凌乱的度量。

,

对于 AWS IoT 规则,当您使用引用 SQL 的 AS 子句中定义的别名的替换模板时,它将无法按预期工作。

来自documentation

因为替换模板中的表达式与“SELECT ...”语句是分开计算的,所以不能引用使用 AS 子句创建的别名。您只能引用原始负载、函数和运算符中存在的信息。

对于你的有效载荷:

{"timestamp": "2020-11-11 08:27:19","temperature": 90,"device": "device1"}

如果您将 SQL 更改为以下内容:

SELECT * FROM 'topic'

您仍然可以像以前一样设置尺寸和设备,但您可以像这样设置时间戳:

${time_to_epoch(timestamp,'yyyy-MM-dd HH:mm:ss')}

这将使用您的时间戳调用 time_to_epoch 函数并将结果值用作时间流中的时间戳。