2016-08-12 11 views
3

Ich führe eine Meteor (Node 4.4.7) -Applikation aus, die lange Operationen auf AWS Lambda ausführt. Ich rufe die Lambda-Funktion aus meinem Code auf und warte auf die Antwort, bevor ich zum nächsten Aufruf übergehe. Ich habe das Timeout auf 300000ms eingestellt, wie in einem former question beschrieben (sowohl bei Lambda als auch im AWS.Lambda-Objekt in meinem Code).AWS Lambda-Aufruffunktion (js sdk): Timeout wird auf Standard zurückgesetzt

Mein Problem ist, dass manchmal der AWS.Lambda Timeout-Wert auf den Standardwert von 120000ms zurückgesetzt wird. Da meine Lambda-Funktion mehr Zeit für die Ausführung benötigt (aber immer noch weniger als die maximalen 300s), erhalte ich die Antwort nicht. Außerdem sehe ich, dass meine Funktion 3 weitere Male gemäß dem Standard maxRetries Wert aufgerufen wird, auch wenn ich es auf 1 setze.

Ich kenne die Schritte nicht, um es zu reproduzieren. Es scheint zufällig. In der Regel passiert es nach ein paar Tagen mit meiner App. Wenn ich die Eigenschaften meines AWS.Lambda Objekts überprüfe, hat es immer noch den 300000ms Zeitüberschreitungswert, obwohl es sich verhält, als ob es den Standard 120000ms Wert hat. Sobald dies geschieht, haben alle nachfolgenden Aufrufanforderungen das gleiche Problem und ich muss die App neu starten, damit sie wieder funktioniert.

Beachten Sie, dass auf den Lambda-Protokollen sehe ich, dass die Funktionen ordnungsgemäß ausgeführt wird. Dauer < 120s gibt in meinem Code zurück. Dauer> 120s werden wiederholt.

Beispielcode:

var options = { 
    maxRetries: 1, 
    httpOptions: { 
    timeout: 300000 
    } 
}; 

var lambda = new AWS.Lambda(options); 

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

Unter den Dingen, die ich habe versucht: eine new AWS.Lambda() für jeden Aufruf erstellen.

Antwort

1

Nach dem SDK documentation, der httpOptions.timeout Schlüssel in AWS.Lambda ist nicht die Funktion Timeout - es ist die Socket-Timeout. Das ist sinnvoll, weil das Standard-Timeout für eine Lambda-Funktion 3 Sekunden und nicht 2 Minuten beträgt.

Sie können das Funktions-Timeout in Ihrem Code mithilfe der Methode updateConfiguration ändern. Wenn Sie das Serverless Framework zum Bereitstellen Ihrer Lambda-Funktionen verwenden, können Sie das Zeitlimit in serverless.yml festlegen. Und natürlich können Sie das Zeitlimit immer in der AWS-Konsole festlegen (Probleme mit den in der Konsole festgelegten Konfigurationen wurden bei der Bereitstellung mit Serverless/CloudFormation behoben, ich weiß jedoch nicht, wie Sie es bereitstellen sollte kein Problem sein, wenn Sie nur Code für S3 lesen oder eine ZIP hochladen).

+0

Wie in der ursprünglichen Frage gesagt, ist die Lambda-Funktion Timeout nicht der Standardwert, aber bereits auf seinen Maximalwert festgelegt, das ist 300s. –

0

Sie müssen das Zeitlimit für das Lambda festlegen, das lambda.invoke aufruft, nicht für Lambda.invoize (wie Sie es mit options tun).

Also, wenn Sie LambdaA haben, die LambdaB, das Timeout auf LambdaA aufruft hat das gleiche wie (oder höher) als der Timeout für LambdaB sein, sonst wird LambdaA potenziell Timeout vor LambdaB abgeschlossen ist.

Ich nehme an, dass der Code, den Sie bereitstellen, in einem Lambda ausgeführt wird. Sie müssen das Timeout auf setzen, dass Lambda.

Die options, die Sie verwenden, um AWS.Lambda zu erstellen, kann in dem Code verworfen werden, den Sie hier angegeben haben.

Verwandte Themen