是否可以仅使用一个 Lambda 函数从许多物联网设备接收 MQTT 消息?

Is it possible to receive MQTT messages from many IoT devices using only one Lambda function?

我们正在 AWS 中设置基础设施以从 IOT 设备收集数据。设备注册后,它们将开始向一些 MQTT 主题发送 json 消息。为了接收消息并解析它们并将数据保存到数据库中,我计划创建一个规则,在收到消息时触发 Lambda 函数。 Lambda 函数执行解析。

基于 AWS IoT documentation,可以在 IoT 下创建一个规则,以评估您的事物发送的消息,查询如 SELECT * FROM 'mymsgs/+'。该规则似乎与任何特定设备无关。那么我可以假设它可以收听同一帐户下所有设备的主题吗?如果是这样的话,我可以只使用一个 Lambda 函数来处理来自不同设备的所有消息。

正确的主题规则未与任何设备相关联。使用 FROM 语句来控制他们接收的消息。您可能希望将 SQL 语句更新为

SELECT * as data, topic() as topic FROM mymsgs/+

以便您的 lambda 可以知道消息是针对哪个主题发送的。如果设备在主题 mymsgs/device 上发布 { foo: "bar", baz: 100 },则

{
  "data": {
    "foo": "bar",
    "baz": 0
  },
  "topic": "mymsgs/device1"
}

将发送到 lambda 函数。

您还可以使用附加到事物证书的 IoT 策略来强制事物只发布它应该发布的主题。

如果主题数量较少,您可以执行以下操作

SELECT *, topic() as topic FROM 'mylog/+' where regexp_matches(topic(), 'mylog/\b(info|error|warn)\b') = TRUE