英文:
AWS IoT , Rules, Lambda Function, DynamoDB (storing streaming AWS iot core data to dynamoDB)
问题
我已经参考了这篇Medium文章:https://medium.com/dev-jam/tutorial-part-2-aws-iot-rules-lambda-function-dynamodb-40a7d4ea35b9
上面是实现的完整图片。
我用于接收来自IoT核心到DynamoDB的Lambda函数如下所示:
console.log('Loading function');
const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();
const collection = "IoTCatalog";
// 处理程序 Lambda 函数
exports.handler = function(event, context) {
console.log('Received event:', JSON.stringify(event, null, 2));
const params = {
TableName: collection,
Item:{
"serialNumber": event.serialNumber,
"timestamp": event.dateTime,
"activated": event.activated,
"clientId": event.clientId,
"device": event.device,
"type": event.type,
"payload": event.payload
}
};
console.log("Saving Telemetry Data");
dynamo.put(params, function(err, data) {
if (err) {
console.error("Unable to add device. Error JSON:", JSON.stringify(err, null, 2));
context.fail();
} else {
console.log(data)
console.log("Data saved:", JSON.stringify(params, null, 2));
context.succeed();
return {"message": "Item created in DB"}
}
});
}
我每3秒从IoT核心接收数据。我已部署了这个Lambda函数,但是当我运行NodeJS程序以传输数据到IoT核心每3秒一次时,我应该每3秒在DynamoDB表中接收数据,但我只接收到1次。
为了在DynamoDB中接收数据,我应该怎么做,因为我每3秒在IoT核心中接收数据?
英文:
I have refered this meduim article :<https://medium.com/dev-jam/tutorial-part-2-aws-iot-rules-lambda-function-dynamodb-40a7d4ea35b9>
Above is the full picture of the implementation.
lambda function that I used for receiving data from iot core to dynamoDB is given below
console.log('Loading function');
const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();
const collection ="IoTCatalog"
// Handler lamda function
exports.handler = function(event, context) {
console.log('Received event:', JSON.stringify(event, null, 2));
const params = {
TableName: collection,
Item:{
"serialNumber": event.serialNumber,
"timestamp": event.dateTime,
"activated": event.activated,
"clientId": event.clientId,
"device": event.device,
"type": event.type,
"payload": event.payload
}
};
console.log("Saving Telemetry Data");
dynamo.put(params, function(err, data) {
if (err) {
console.error("Unable to add device. Error JSON:", JSON.stringify(err, null, 2));
context.fail();
} else {
console.log(data)
console.log("Data saved:", JSON.stringify(params, null, 2));
context.succeed();
return {"message": "Item created in DB"}
}
});
}
I am receiving data in iot core for every 3 seconds.
And I have deployed this lambda function, but when I run the NodeJS program which functions to transmit data to iot core after every 3 seconds, and so I should be receiving data every 3 seconds in DynamoDB table, but I am receiving only 1 time.
What should I do to receive data in DynamoDB as I am receiving data in IOT core after every 3 seconds?
答案1
得分: 1
DynamoDB项是根据它们的主键(分区键和排序键的组合)是唯一的。如果您使用相同的键写入多个项,那么每次都会简单地覆盖该项。
您需要确保每次插入时您的键都是唯一的。例如,您可以使用纳秒时间戳作为排序键。
英文:
DynamoDB items are unique based on their primary key (partition and sort key combined). If you are writing multiple items with the same key, then you are simply overwriting the item each time.
You need to ensure you key is unique for each and every insert. For example, you can use a nanosecond timestamp as the sort key.
答案2
得分: 0
我建议将Lambda函数删除,并直接将IoT规则操作连接到DynamoDB(这将降低您解决方案的成本)。在这里,Lambda函数没有提供任何有价值的逻辑(除非您隐藏了某些内容)。另外,正如Lee所提到的,确保发送到DDB的每条消息都是唯一的(分区键和排序键)。分区键可以是序列号,排序键可以是时间戳。
英文:
I would highly suggest to remove the lambda and connect directly IoT Rule Action to DynamoDB (this would reduce the cost of your solution). The lambda here doesn't provide any valuable logic (unless you have hidden something). Also, as mentioned by Lee, make sure every message sent to DDB is unique (partition and sort key). Partition key could be serial number and sort key the timestamp.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论