Узел AWS Lambda в частной подсети не может вернуть обратный вызов - PullRequest
0 голосов
/ 01 апреля 2019

Ниже приводится постановка моей проблемы:
1. У меня есть конечная точка регионального шлюза API

В частной подсети VPC вызывается лямбда-функция Lambda для доступа к RDS.

Вызов Postman для шлюза APIдля вызова функции Lambda.

Функция Lambda способна правильно обрабатывать все, что внутри нее.

LambdaКод функции достигает блока ответа кода, но не может вернуть ответ.

Группе безопасности функции Lambda разрешен весь исходящий вызов через шлюз NAT в общедоступной подсети..

Ниже приведен обработчик функции -

var async = require('async');
var moment = require('moment');
var service = require('./some-service');

exports.handler = (event, context, callback) => {

    var requestBody = event['body-json'];

    async.waterfall([
        function(callback) {
            var processRequest = {};
            processRequest.validationMessage = validateRequest(requestBody);

            if(processRequest.validationMessage == ''){
                processRequest.isValid = true;

                service.processService(requestBody,function(err, response) {
                    if(err){
                        callback(err, null);
                    }
                    else{
                        callback(null, response);
                    }
                });
            }
            else{
                processRequest.isValid = false;
                callback(null, processRequest);
            }
        }
    ],
    function(err, resp) {
        let response = {};
        if (err) {
            response = {
                statusCode: 500,
                body: JSON.stringify('API Error : ' + err),
            };
            callback(err, response);
        } 
        else {
            if(resp.isValid){
                response = {
                    statusCode: 200,
                    body: 'Record updated for user_id '+requestBody.user_id,
                }; 
                console.log('Success block! ', response);
                callback(null, response);   
            }
            else{
                console.log('Failure block!');
                response = {
                    statusCode: 500,
                    body: resp.validationMessage,
                }; 
                callback(null, response);
            }
        }
    });
};

function validateRequest(requestBody){
    var isValid = '';

    if(requestBody['user_id'] == undefined){
        console.log('user_id missing');
        isValid += 'user_id, ';
    }
    if(requestBody['added_by'] == undefined){
        isValid += 'added_by, ';
    }
    if(isValid != ''){
        isValid = isValid.substring(0, isValid.lastIndexOf(','));
        isValid += ' missing in the request';
    }
    return isValid;
}

Журналы CloudWatch показывают, что код может достичьБлок успеха,

Success block! { statusCode: 200, body: 'Record updated for user_id 17' }

Ответ почтальона -

{
    "message": "Endpoint request timed out"
}

В чем может быть проблема?

1 Ответ

0 голосов
/ 03 апреля 2019

Устранено это путем добавления следующего, в первой строке под обработчиком -

context.callbackWaitsForEmptyEventLoop = false;
...