2016-07-25 10 views
6

Ich habe eine Knoten Lambda-Funktion erstellt, die einen einfachen Aufruf an eine Aurora-Datenbank ausführt. Wenn ich die Funktion in der Konsole ausprobiere, gibt die Abfrage zurück, ich kann die Ergebnisse im Protokoll sehen, aber der Callback scheint nie aufgerufen zu werden, und deshalb läuft meine Lambda-Funktion ab. Ich kann nicht herausfinden, was das Problem ist. Hoffentlich kann mich hier jemand auf das Problem hinweisen.AWS Lambda-Funktion ruft nie den Rückruf

var mysql = require("mysql"); 

module.exports.handler = function(event, context, cb) { 
    console.log('start\n'); 
    var con = mysql.createConnection({ 
    ... 
    }); 
    console.log('call data\n'); 

    con.query('SELECT * FROM Tags', function(err, rows) { 
    console.log('Data received from Db:\n'); 
    console.log(rows); 

    console.log('calling callback'); 

    cb(null, 'Success'); 

    console.log('callback called'); 
    }); 
    console.log('data called\n'); 
}; 

Das resultierende Cloudwatch Protokoll ist wie folgt ...

2016-07-25T14:20:05.343Z daf5cd6b-5272-11e6-9036-e73ad17006df start 
2016-07-25T14:20:05.398Z daf5cd6b-5272-11e6-9036-e73ad17006df call data 
2016-07-25T14:20:05.405Z daf5cd6b-5272-11e6-9036-e73ad17006df data called 
2016-07-25T14:20:05.440Z daf5cd6b-5272-11e6-9036-e73ad17006df Data received from Db: 
2016-07-25T14:20:05.440Z daf5cd6b-5272-11e6-9036-e73ad17006df [ 
    RowDataPacket { 
     id: 1, 
     externalId: 
     'a87ead34de7e', 
     orgId: 1, 
     name: 'lacinia sapien', 
     createdDate: 1448598369, 
     modifiedDate: 0 
    }, 
    ..., 
    RowDataPacket { 
     id: 50, 
     externalId: '9ebaaab372e3', 
     orgId: 1, 
     name: 'et commodo', 
     createdDate: 1451551837, 
     modifiedDate: 0 
    } 
] 
2016-07-25T14:20:05.483Z daf5cd6b-5272-11e6-9036-e73ad17006df calling callback 
2016-07-25T14:20:05.483Z daf5cd6b-5272-11e6-9036-e73ad17006df callback called 
END RequestId: daf5cd6b-5272-11e6-9036-e73ad17006df 
REPORT RequestId: daf5cd6b-5272-11e6-9036-e73ad17006df Duration: 300000.12 ms Billed Duration: 300000 ms Memory Size: 1024 MB Max Memory Used: 52 MB 
2016-07-25T14:25:05.341Z daf5cd6b-5272-11e6-9036-e73ad17006df Task timed out after 300.00 seconds 
+0

Können Sie den Text Ihrer Callback-Funktion zusammen mit der Angabe von 'cb' veröffentlichen? –

+0

Die Callback-Funktion wird von Lambda bereitgestellt, wenn die Knotenversion 4.3 verwendet wird. Wenn meine Logik beendet ist, rufe ich die von Lambda bereitgestellte Rückruffunktion auf, um anzuzeigen, dass meine Logik beendet ist und irgendwelche Fehler oder Rückgabedaten bereitgestellt werden (die Parameter für die Rückruffunktion). – mp2526

+0

Sie warten nicht auf die Beendigung der Verbindung, bevor Sie die Abfrage absenden. – kixorz

Antwort

18

Dank dieser Frage ...

Lambda Timing out after calling callback

fand ich das Problem. Das Node mysql-Modul hält die Verbindung offen, bis der Server sie schließt, sofern sie nicht explizit von der Handler-Logik geschlossen wird.

Die leere Ereignisschleife wird also nie leer und gibt daher den Callback nicht zurück. In dem obigen Code, habe ich eine ...

con.end(); 

vor dem Aufruf des Rückrufs und es hat funktioniert.

+7

ODER fügen Sie context.callbackWaitsForEmptyEventLoop = false am oberen Rand Ihres Lambda hinzu! –

+0

Danke @MrkFldig! Ich habe vergessen, dass ... meine App mongodb (das gleiche Verhalten von mysql) – Gonzalo

+0

Auch würde ich die Verbindung vom Wrapper zu Handler-Container übergeben werden viel mehr als Sie in Lambda wiederverwendet –

Verwandte Themen