AWS IoT Core数据每3秒写入DynamoDB仅成功一次的解决求助
问题描述
我参考了AWS IoT相关教程,通过AWS IoT Core触发Lambda函数将数据写入DynamoDB。我的NodeJS程序每3秒向IoT Core发送数据,IoT Core能正常接收,但DynamoDB仅成功写入一次。用于写入的Lambda函数代码如下:
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"} } }); }
解决方案
1. 核心问题定位
Lambda中使用的dynamo.put()是DynamoDB的写入/覆写操作:如果待写入条目的主键(分区键+排序键)与已有条目完全一致,会直接替换旧数据,而非新增条目。若你的设备每次发送数据的主键字段(比如仅用serialNumber作为分区键)没有变化,就会一直覆写同一条数据,表现为“只写入一次”。
2. 调整DynamoDB表主键配置
打开DynamoDB控制台,找到IoTCatalog表:
- 若当前仅设置
serialNumber为分区键,需改为复合主键:以serialNumber作为分区键,timestamp(或其他唯一标识字段,比如带毫秒级的时间戳)作为排序键。这样每个设备的每条数据因timestamp唯一,都会成为独立条目。
3. 优化Lambda代码
将回调式写法改为async-await,确保异步写入操作完成后再结束Lambda执行,避免因Lambda提前终止导致的写入丢失;同时确保主键组合唯一:
console.log('Loading function'); const AWS = require('aws-sdk'); const dynamo = new AWS.DynamoDB.DocumentClient(); const collection = "IoTCatalog" exports.handler = async function(event) { 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"); try { await dynamo.put(params).promise(); console.log("Data saved:", JSON.stringify(params, null, 2)); return {"message": "Item created in DB"}; } catch (err) { console.error("Unable to add device. Error JSON:", JSON.stringify(err, null, 2)); throw err; } }
4. 验证IoT规则配置
检查AWS IoT规则:
- 确保规则设置为每条消息都触发Lambda,而非批量处理;
- 确认规则的SQL语句能正确匹配所有传入消息,没有过滤掉后续数据。
5. 排查执行日志
打开CloudWatch日志,查看Lambda每次执行记录:
- 确认IoT消息是否每次都触发了Lambda;
- 检查写入DynamoDB时是否有错误日志(比如主键重复的报错)。
内容的提问来源于stack exchange,提问作者ItsRibhav
相关产品推荐
相关产品推荐

