webentwicklung-frage-antwort-db.com.de

AWS Lambda: Zeitüberschreitung der Aufgabe

Wir wurden nach meinem Schulprojekt gebeten, einen Java-Code zu schreiben, der in AWS Lambda ausgeführt wird. Es soll den Quellcode der spezifischen URLs abrufen und dann in einen S3-Bucket hochladen. Der Java-Code sollte auf AWS Lambda ausgeführt werden. 

Ich bekomme den Quellcode für die String-Variable in Java. Dann habe ich eine while-Schleife, die versucht, den String in eine Datei im Verzeichnis/tmp zu schreiben. Dann wird die Datei in S3 hochgeladen. 

Alles funktioniert, aber ich bleibe bei einer bestimmten URL hängen. Ich habe das Problem bis zu diesem Punkt verfolgt:

try {
    BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/url.txt"));
    out.write(source_code);  //Replace with the string 
    //you are trying to write  
    out.close();
}
catch (IOException e) {
    System.out.println("Exception ");
}

Das Seltsamste ist, wenn ich den Code lokal teste, funktioniert alles. Die Datei wird im Verzeichnis/tmp auf meinem Computer erstellt und dann in einen S3-Bucket hochgeladen. Wenn ich jedoch den Code in Lambda starte, erhalte ich die folgende Fehlermeldung:

Task timed out after 15.00 seconds

Gibt es eine Idee, warum Lambda die Datei in diesem speziellen Fall nicht in das temporäre Verzeichnis schreibt und mit anderen zusammenarbeitet?

18
jansv

Amazon Lambda wurde als ereignisgesteuertes System entwickelt, das auf Ereignisse reagiert. Der Fluss ist:

  • Irgendwo passiert etwas, an dem Lambda auslöst (z. B. ein Upload in Amazon S3, Daten, die in einen Amazon Kinesis-Stream gelangen, eine Anwendung, die die Lambda-Funktion direkt aufruft)
  • Die Lambda-Funktion ist created, Daten vom Triggerereignis werden übergeben
  • Die Lambda-Funktion läuft

Lambda-Funktionen sind auf eine maximale Ausführungszeit von 5 Minuten begrenzt. Der tatsächliche Grenzwert wird konfiguriert, wenn die Lambda-Funktion erstellt wird. Die Grenze ist gesetzt, da Lambda-Funktionen eher klein und schnell sein sollen als große Anwendungen.

Ihre Fehlermeldung sagt Task timed out after 15.00 seconds. Dies bedeutet, dass AWS die Task absichtlich gestoppt hat, sobald sie eine Laufzeit von 15 Sekunden erreicht hat. Es hat nichts damit zu tun, was die Funktion zu der Zeit gemacht hat, noch mit der Datei, die gerade bearbeitet wurde.

So beheben: Erhöhen Sie die Timeout-Einstellung auf der Konfigurationsseite Ihrer Lambda-Funktion.

40
John Rotenstein

Anscheinend haben Sie das Zeitlimit für 15 Sekunden konfiguriert. Sie können das Zeitlimit wie in diesem Screenshot beschrieben erhöhen. Gemäß den Lambda-Einstellungen beträgt die maximale Ausführungszeit 15 Minuten.

timeout configuration

7
user2226400

In meinem Fall, als die Aufgabe lokal gut funktionierte, aber bei Lambda das Zeitlimit überschritten wurde, musste ich den Speicher erhöhen, der der Lambda-Instanz zugewiesen wurde. 

4
andreamc

Beachten Sie, dass das Muster für den Handler für asynchrone Funktionen unterschiedlich ist, wenn bei der Verwendung von async dieses Zeitüberschreitungsproblem auftritt.

Anstatt von

exports.handler = function (event, context, callback) {
    callback(null, {
        statusCode: 200,
        body: JSON.stringify({/* return stuff here */})
    });
};

es ist

exports.handler = async function (event, context) {
    return {
        statusCode: 200,
        body: JSON.stringify({/* return stuff here */})
    };
};
2
jperezov

Kürzlich habe ich an einem POC gearbeitet, um mit der AWS Lambda-Funktion zu arbeiten. Ich hatte auch das gleiche Problem (Zeitüberschreitung nach 15,01 Sekunden). Ich habe gerade die Speicherzuweisung erhöht und das Problem behoben. Schönheit ist, dass ich in ein paar Sekunden eine Antwort bekommen könnte. Ich denke also, Fehler sind wenig irreführend. Es sollte die genaue Fehlerursache liefern.

1
Pankaj Jain

Ich habe das Problem durch Platzieren des AWS-SDK außerhalb des Funktionskörpers gelöst:

var AWS = require("aws-sdk");
exports.handler = function(event, context, callback)
{
//var AWS = require("aws-sdk"); //Error: Task timed out after 3.00 seconds
var docClient = new AWS.DynamoDB.DocumentClient();
console.log("Lambda starts");
...

1

Erstens, warum in/tmp/schreiben? Sie schreiben an die Stelle, an der die Lambda-Funktion ausgeführt wird?

Besser ist es jedoch, wenn Sie einen String als S3-Datei schreiben möchten, können Sie ein S3Object erstellen und direkt in AWS S3 schreiben. Hier ist ein Beitrag, der ein Beispiel zeigt: https://stackoverflow.com/a/29844224/358013

0
blueskin