【问题标题】:Read JSON from S3 file and Insert records into dynamoDB using Lambda with NodeJS runtime从 S3 文件读取 JSON 并使用 Lambda 和 NodeJS 运行时将记录插入到 dynamoDB
【发布时间】:2017-07-02 21:20:29
【问题描述】:

我的 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(所需的分区键) 尽管它在数据中。记录在 CloudWatch 中打印良好,实际上如果我在这一行替换记录变量:

Item: record,

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

附:如果这还不明显,我是 JavaScript 新手,但我认为问题在于变量 record 在运行时如何被解释,因为如果我用它的值替换该变量它工作正常作为硬编码字符串。

【问题讨论】:

  • 你能试试 JSON.parse(record);将记录字符串转换为对象?
  • 啊,是的,这就是问题所在,JSON.parse(record) 修复了它。谢谢!

标签: node.js lambda amazon-dynamodb


【解决方案1】:

使用JSON.parse(record);

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

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2019-03-30
    • 2017-07-14
    • 1970-01-01
    • 2020-09-28
    • 2018-08-15
    • 1970-01-01
    • 2019-03-18
    • 2020-01-25
    相关资源
    最近更新 更多