问题描述
假设传感器发送这样的数据:
{"timestamp": "2020-11-11 08:27:19","temperature": 90,"device": "device1"}
-
创建IoT核心规则以将数据发送到Timestream db表。
-
规则sql:
SELECT device,temperature,time_to_epoch(timestamp,'yyyy-MM-dd HH:mm:ss') as fn_ts FROM 'topic'
-
维度:
device
值:
${device}
-
时间戳记:
${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 子句中定义的别名的替换模板时,它将无法按预期工作。
因为替换模板中的表达式与“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 函数并将结果值用作时间流中的时间戳。