调用回调的Lambda调用错误:指标不显示任何错误

时间:2018-06-26 08:09:57

标签: node.js amazon-web-services aws-lambda

我在AWS中创建了一个Lambda函数,可将日志从Cloudfront导出到Elasticsearch。

在AWS控制台上,Invocation error前面还有个警告,尽管指标显示24小时内没有警告。

enter image description here

enter image description here

典型的日志工作流程如下

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');
    });
};

1 个答案:

答案 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