You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:57:16