从S3文件中读取JSON,并使用带有NodeJS运行时的Lambda将记录插入dynamoDB

时间:2017-07-02 21:20:30

标签: node.js lambda amazon-dynamodb

我的DynamoDB表具有以下分区键:

UserId  String

这是我的Lambda函数:

'use strict';

console.log('Loading function');
const doc = require('dynamodb-doc');
const dynamo = new doc.DynamoDB();

var AWS = require('aws-sdk');

var S3 = new AWS.S3({
    maxRetries: 0,
    region: 'us-east-1',
});

var insertSuccess = 0;
var insertErrors = 0;

function dynamoResultCallback(err, data) {
    if (err) {
        insertErrors++;
        console.log("Insert Error: \n");
        console.log(err, err.stack); // an error occurred
    } else {
        insertSuccess++;
    }
}

exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    console.log("Init complete, running.. \n")

    var srcBucket = event.Records[0].s3.bucket.name;
    var srcKey = event.Records[0].s3.object.key;

    console.log("Params: srcBucket: " + srcBucket + " srcKey: " + srcKey + "\n")

    S3.getObject({
        Bucket: srcBucket,
        Key: srcKey,
    }, function(err, data) {
        if (err !== null) {
            return callback(err, null);
        }
        var fileData = data.Body.toString('utf-8');
        var recordsArray = fileData.split("\n");

        for (var i = 0; i < recordsArray.length; i++) {
             var record = recordsArray[i];
              console.log("Inserting record: " + record);

            var params = {
                Item: record,
                ReturnConsumedCapacity: "TOTAL",
                TableName: "PacketData"
            };
            dynamo.putItem(params, dynamoResultCallback);
        }
        console.log("Insert Result -- successCount: " + insertSuccess + " errorCount: " + insertErrors)
        return callback(null, data);
    });
};

目前正在发生的是,它按预期读取S3文件,但我无法将结果记录传递给dynamo,云监视日志错误是它没有通过UserId(所需的parition密钥)尽管它在数据中。 CloudWatch中的记录打印正常,实际上如果我替换此行上的记录变量:

Item: record,

使用CloudWatch的JSON字符串,它可以按预期工作。有什么建议?

P.S。我是一个JavaScript新手,如果这还不明显,但我认为问题是由于变量记录在运行时被解释,因为如果我用它的值替换该变量它工作正常作为硬编码字符串。

1 个答案:

答案 0 :(得分:3)

使用JSON.parse(record);

根据dynamodb-doc documentation,putItem方法需要一个对象而不是字符串。