我的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新手,如果这还不明显,但我认为问题是由于变量记录在运行时被解释,因为如果我用它的值替换该变量它工作正常作为硬编码字符串。