AWS将MQTT消息存储到DynamoDB
我构建了一个定期发送MQTT消息的python脚本。AWS将MQTT消息存储到DynamoDB
这是发送给后端的JSON字符串:
{"Id": "1234", "Ut": 1488395951, "Temp": 22.86, "Rh": 48.24}
在后端的一面,我想存储MQTT消息到DynamoDB表。
我遵循亚马逊教程,包含在MQTT消息中的数据存储在表中。
我的问题是关于表列。
表仅有3 colums:
- 编号:分区键
- UT:排序关键字
- 有效载荷:包含MQTT消息。
MQTT消息中包含的每个密钥都可能有列吗?
我想有这样的列: - 标识 - UT - 温度 - 铑
感谢您的帮助!
是的,你可以。
在DynamoDB中,您不需要创建所谓的“列”。成功投放操作的唯一要求是您提供主要属性(在您的案例中Id
和Ut
)。
从docs:
属性名称/值对,一个用于每个属性的映射。只有 主键属性是必需的;您可以选择为该项目提供其他 属性名称 - 值对。
在Python中,你可以做一些类似的(可能需要检查语法和调整列类型):
import boto3
client = boto3.client('dynamodb')
response = client.put_item(
TableName = 'Messages',
Item={
'Id': {
'S': '1234'
},
'Ut': {
'S': '1488395951'
},
'Temp': {
'S': '22.86'
},
'Rh': {
'S': '48.24'
}
}
)
感谢您的回复。我忘了提及消息推送是由规则自动触发到AWS IoT控制台中的。我的python脚本将MQTT消息发送到AWS MQTT代理。是否可以配置此规则来分割数据? – Federico
是的,当然。您可以为要存储在DynamoDB表中的任何内容创建列,而不是或除了存储完整的有效内容之外。
以下步骤3.1:从this tutorial创建新项目,如果您在DynamoDB控制台看看你的表,你会更新put_item代码,包括所有项目的详细信息...
#Parse your JSON message and get out all your attributes
id = message["Id"]
ut = message["Ut"]
temp = message["Temp"]
rh = message["Rh"]
response = table.put_item(
Item={
'id': id,
'ut': ut,
'temp': temp,
'rh': rh
}
)
现在,你会看到为您的其他属性创建了新列。
我假设您正在尝试将您的消息存储在DynamoDB表中的IoT网关规则。不幸的是,IoT规则不允许将数据存储在多个列中 - 您只能将有效负载(或其子集)存储在单个列中。目前没有规定将有效载荷中的属性提取到多个不同的列中。
解决此问题的唯一方法(我迄今为止找到的)是调用一个lambda函数,该函数的运行代码类似于其他答案显示的代码。
你有固定的属性或属性可以非常动态吗?在这两种情况下,都可以分别存储属性。但是,您可能需要解析json并相应地设置值。 – notionquest
需要我调用解析json并将数据存储到dynamoDB的lambda函数?谢谢 – Federico