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

Zug*_*dud 5 lambda node.js amazon-dynamodb

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

UserId  String
Run Code Online (Sandbox Code Playgroud)

这是我的 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);
    });
};
Run Code Online (Sandbox Code Playgroud)

当前发生的情况是,它按预期读取 S3 文件,但我无法将结果记录传递到 dynamo,云监视日志错误是它没有通过 UserId(所需的分区键)尽管如此在数据中。记录在 CloudWatch 中打印得很好,实际上,如果我替换此行上的记录变量:

Item: record,
Run Code Online (Sandbox Code Playgroud)

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

PS 我是一个 JavaScript 新手,如果这还不是很明显,但我相信问题是由于变量记录在运行时是如何被解释的,因为如果我将该变量替换为它的值作为硬编码字符串,它可以正常工作。

Ash*_*han 5

使用JSON.parse(record);

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