AWS Lambda函数如何更新DynamoDB表中的所有logging?

我正在使用需要运行DynamoDB表中的所有项目并更新某些属性的AWS Lambda函数(节点4.3)。

我遇到的问题是如何让Lambda等待所有DynamoDB操作完成。

var async = require('async'); var aws = require('aws-sdk'); var doc = new aws.DynamoDB.DocumentClient(); exports.handler = (event, context, callback) => { doc.scan({ TableName: 'Occupations_dev' }, function (err, data) { console.log(data.Items.length); var funcs = []; data.Items.forEach(function (item) { funcs.push(function (cb) { item.Popularity = 0; doc.put({ TableName: 'Occupations_dev', Item: item }, function (err, data) { if (err) { console.log("ERROR: " + item.Name); cb(err); } else { console.log('Finished put for ' + item.Id) cb(null, item); } }); }); }); async.parallel(funcs, function (err, results) { console.log('Finished'); if (err) { context.fail(err); } else { callback(null, 'Finished'); } }); }); }; 

我尝试使用async.parallel来等待所有的db.put请求完成,但是只要Lambda函数运行,它就会Process exited before completing request错误Process exited before completing request一个Process exited before completing request

它确实更新了一些 DynamoDB项目,但绝对不是全部。

当有错误时,我添加了一些console.log调用,但我在日志中看到的唯一的输出是这样的:

 START RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870 Version: $LATEST 2017-03-30T02:08:11.691Z b72fd7c6-14ed-11e7-a95a-c1185af4e870 1362 END RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870 REPORT RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870 Duration: 37165.80 ms Billed Duration: 37200 ms Memory Size: 128 MB Max Memory Used: 128 MB RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870 Process exited before completing request 

使Lambda函数等待一切完成的正确方法是什么? (这不是一个大数据量,所以我不担心运行超过5分钟,超时。)

async.parallel函数调用是asynchronous发生的,这可能会导致DynamoDB泛洪许多同时发生的更新,并在数据库级别引发“连接太多”错误

我build议使用同步操作,如async.series来执行数据库更新。 DynamoDB不应该一个接一个地处理这些更新。

“完成请求之前退出的进程”消息表示在调用context.done(或context.succeed等)之前退出的Javascript函数。

这里有一些build议:

首先,尝试增加function的内存限制。 此行Memory Size: 128 MB Max Memory Used: 128 MB可能表示内存不足,并且进程只是在不调用上次callback的情况下被杀死。

增加内存限制后,您可能会看到以下内容之一:

  • 您的function将超时。 在这种情况下,您可能需要增加表的预置容量(和/或您的lambda超时)

  • 即使函数没有超时结束,你也可能会看到并不是所有的表logging都被处理了。 这是因为如果扫描的项目总数超过了最大数据集大小限制1 MB,则扫描和查询操作可能不会返回所有表的行。 扫描完成后,您应该检查LastEvaluatedKey是否与数据一起返回。 如果是,则应该进行另一次扫描,将LastEvaluatedKey值提供为ExclusiveStartKey参数