2016-04-15 4 views
2

Ich führe eine AWS Lambda-Funktion für Bild/Video-Verarbeitung mit Node 4.3 as a runtime. Ich rufe meine Funktion von meinem webapp-Code mit dem Knoten aws-sdk auf.AWS Lambda-Aufruf-Funktion gibt nicht immer zurück

Das Problem ist, dass, wenn die Funktion eine lange Zeit dauert (z. B. 250 Sekunden), der Aufruf Callback nie erhalten wird, obwohl ich in den Cloudwatch-Logs deutlich sehen kann, dass die Funktion ordnungsgemäß ausgeführt. Obendrein wird die Funktion mindestens zweimal erneut ausgeführt (dies hängt wahrscheinlich mit dem maxRetries-Parameter des Aufrufs zusammen: da er keine Antwort zurückerhält, versucht er es erneut).

Was mich verwirrt ist, dass es für schnellere Funktionen funktioniert und meine Lambda-Funktion niemals ausläuft. Wer hat ein solches Problem? Kann es mit der neuen 4.3 Runtime zusammenhängen? Beachten Sie, dass ich die context.succeed() oder context.fail() weglassen, wie es nicht mehr erforderlich ist, aber ich habe es versucht und es ändert nichts.

Lambda Code

... 
var handler = function (event, context, callback) { 
    // video/image processing code 
    // 
    // callback function 
    ..., function(err, result) { 
     if (err) { 
      console.log("Error", err, err.stack); 
      callback(err); 
     } else { 
      console.log("Done"); 
      callback(null, result); 
     } 
    } 
}; 

Lambda Invocation

var lambda = new AWS.Lambda; 

var myEventObject = {...}; 
var payload = JSON.stringify('myEventObject'); 

var params = { 
    FunctionName: 'myLambdaFunction' 
    InvocationType: 'RequestResponse', 
    LogType: 'None', 
    Payload: payload 
}; 

lambda.invoke(params, function(err, data) { 
    if (err) console.log(err, err.stack); // an error occurred 
    else  console.log(data);   // successful response 
}); 

Lambda Cloudwatch Log

REPORT RequestId: xxx Duration: 206757.82 ms Billed Duration: 206800 ms Memory Size: 1536 MB Max Memory Used: 354 MB 
+0

Ich vermute, dass die Timeout-Konfiguration für die SDK 240 Sekunden ist, was erklären könnte, dass Sie eine Wiederholung erhalten. Könnten Sie versuchen, diese Konfiguration in Ihrem CLI zu ändern? – Tom

+0

Nein, die Timeout-Konfiguration ist auf max: 300 Sekunden eingestellt. Wenn es länger als 300 Sekunden dauert, überschreiten die Funktionen die Zeit und ich kann es in den Cloudwatch-Protokollen sehen. Wenn ich das Timeout auf einen niedrigeren Wert setze, sagen wir 30 Sekunden, kehrt die Funktion mit einem Timeout-Fehler zurück und ich erhalte den Callback-Fehler. –

+2

Bitte beachten Sie, dass ich nicht über die Auszeit von Lambda, aber die aus der SDK-Konfiguration sprechen, also Sie? – Tom

Antwort

4

a s in den Kommentaren angegeben, hat die aws sdk eine eigene Timeout-Konfiguration, die standardmäßig auf 120 Sekunden eingestellt ist (dies ist eine andere Zeiteinstellung als die Lambda-Einstellung).

im aktuellen Fall, da der Lambda für mehr dieses Timeout läuft, nimmt der SDK einen Fehler und feuern Versuche.

Die Einstellung dieser Konfiguration auf 300 Sekunden sollte das Problem lösen. Wie Daniel T im Kommentar gezeigt hat, kann dies temporär geändert werden: var lambda = new AWS.Lambda ({httpOptions {timeout: 300000}});