我在AWS中创建了一个Lambda函数,可将日志从Cloudfront导出到Elasticsearch。
在AWS控制台上,Invocation error
前面还有个警告,尽管指标显示24小时内没有警告。
典型的日志工作流程如下
START RequestId: 302f0b95-7856-11e8-9486-55b3f10e7d4e Version: $LATEST
Request complete
END RequestId: 302f0b95-7856-11e8-9486-55b3f10e7d4e
REPORT RequestId: 302f0b95-7856-11e8-9486-55b3f10e7d4e Duration: 794.93 ms Billed Duration: 800 ms Memory Size: 128 MB Max Memory Used: 52 MB
日志中没有错误,我猜唯一可能触发此调用错误的是有时两个请求同时启动
09:01:47
START RequestId: 63cd00e1-7856-11e8-8f96-1f900def8e65 Version: $LATEST
09:01:47
START RequestId: 63e1e7f3-7856-11e8-97e6-3792244f6ab0 Version: $LATEST
除此以外,我不知道此错误来自何处。 我想念什么吗?还是我需要等待超过24小时才能更改状态?也许有一种方法可以查明我没有找到的AWS控制台/ API错误?
很高兴听到您对此的看法。
编辑:以防您想看一下代码本身。
var aws = require('aws-sdk');
var zlib = require('zlib');
var async = require('async');
const CloudFrontParser = require('cloudfront-log-parser');
var elasticsearch = require('elasticsearch');
var s3 = new aws.S3();
var client = new elasticsearch.Client({
host: process.env.ES_HOST,
log: 'trace',
keepAlive: false
});
exports.handler = function(event, context, callback) {
var srcBucket = event.Records[0].s3.bucket.name;
var srcKey = event.Records[0].s3.object.key;
async.waterfall([
function fetchLogFromS3(next){
console.log('Fetching compressed log from S3...');
s3.getObject({
Bucket: srcBucket,
Key: srcKey
},
next);
},
function uncompressLog(response, next){
console.log("Uncompressing log...");
zlib.gunzip(response.Body, next);
},
function publishNotifications(jsonBuffer, next) {
console.log('Filtering log...');
var json = jsonBuffer.toString();
var records;
CloudFrontParser.parse(json, { format: 'web' }, function (err, accesses) {
if(err){
console.log(err);
} else {
records = accesses;
}
});
var bulk = [];
records.forEach(function(record) {
bulk.push({"index": {}})
bulk.push(record);
});
client.bulk({
index: process.env.ES_INDEXPREFIX,
type: 'log',
body: bulk
}, function(err, resp, status) {
if(err) {
console.log('Error: ', err);
}
console.log(resp);
next();
});
console.log('CloudFront parsed:', records);
}
], function (err) {
if (err) {
console.error('Failed to send data: ', err);
} else {
console.log('Successfully send data.');
}
callback(null, 'success');
});
};
答案 0 :(得分:0)
您需要明确地将信息返回给调用方。 以下是相关文档:
Node.js运行时v6.10和v8.10支持可选的回调 参数。您可以使用它来明确地将信息返回给 呼叫者。通用语法为:
回调(错误错误,对象结果);其中:
error –是一个可选参数,可用于提供结果 Lambda函数执行失败的原因。当Lambda函数 成功后,您可以将null作为第一个参数。
result –是一个可选参数,可用于提供 函数成功执行的结果。提供的结果必须是 JSON.stringify兼容。如果提供错误,则此参数为 忽略。
如果您未在代码中使用回调,则AWS Lambda将调用它 隐式地,返回值为null。
调用回调(显式或隐式)时,AWS Lambda 继续Lambda函数调用,直到事件循环为 空的。
以下是示例回调:
callback(); // Indicates success but no information returned to the caller.
callback(null); // Indicates success but no informatio returned to the caller.
callback(null, "success"); // Indicates success with information returned to the caller.
callback(error); // Indicates error with error information returned to the caller
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html