【发布时间】:2017-08-23 17:41:17
【问题描述】:
我正在开发一个 AWS Lambda 函数(节点 4.3),该函数需要遍历 DynamoDB 表中的所有项目并更新某些属性。
我遇到的问题是如何让 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 错误结束。
它确实更新了 一些 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 分钟而超时。)
【问题讨论】:
-
我想
Process exited before completing request表示您的 js 代码中还有其他错误 - 这是否在本地工作,并且只有 AWS Lambda 上的错误? -
我对 Lambda 比较陌生,所以我实际上不知道如何在本地运行它。有什么方法可以从 Lambda 获取更多错误详细信息?我在 CloudWatch 日志中看不到任何内容。
-
奇怪,我相信他们应该在 Cloudwatch 中。当您运行代码 sn-p 时,您是否看到任何
console.log语句?这些应该来自 Lambda 中的日志输出 -
我添加了一些
console.log语句,用于当doc.put出现错误但我没有看到任何日志。我只看到console.log(data.Items.length);的输出和大约 60 个Finished put for...语句在它死之前。 -
狂野! DynamoDB 对同时连接有任何限制吗?如果您尝试异步插入太多记录,则可能会出错。也许尝试使用像
async.series或Promise.all这样的同步方法,看看你的结果是否相同。
标签: javascript node.js asynchronous amazon-dynamodb aws-lambda