Ошибка лямбда-вызова с вызванным обратным вызовом: метрики не показывают ошибок - PullRequest
0 голосов
/ 26 июня 2018

Я создал функцию Lambda в AWS, которая экспортирует журналы из Cloudfront в Elasticsearch.

С консоли AWS у меня по-прежнему стоит «wining» перед 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 часов, прежде чем сатус сменится?Может быть, есть способ точно определить ошибку с помощью консоли / API AWS, о которой я не нашел?

Буду рад услышать, что вы думаете по этому поводу.

Редактировать: Если вы хотите взглянуть на сам код.

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 голосов
/ 26 июня 2018

Вам необходимо явно вернуть информацию обратно вызывающей стороне.Вот соответствующая документация:

Среды выполнения Node.js v6.10 и v8.10 поддерживают необязательный параметр обратного вызова.Вы можете использовать его для явного возврата информации обратно вызывающей стороне.Общий синтаксис:

обратный вызов (ошибка с ошибкой, результат объекта);Где:

error - необязательный параметр, который можно использовать для предоставления результатов неудачного выполнения лямбда-функции.Если лямбда-функция завершается успешно, в качестве первого параметра можно передать значение null.

result - это необязательный параметр, который можно использовать для предоставления результата успешного выполнения функции.Предоставленный результат должен быть совместим с JSON.stringify.Если предоставляется ошибка, этот параметр игнорируется.

Если вы не используете обратный вызов в своем коде, AWS Lambda будет вызывать его неявно, а возвращаемое значение будет нулевым.

Когда обратный вызоввызывается (явно или неявно), 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...