web-dev-qa-db-fra.com

AWS Lambda: la tâche a expiré

Mon projet d'école nous a été demandé d'écrire un code Java qui s'exécute dans AWS Lambda. Il est supposé obtenir le code source des URL spécifiques, puis le télécharger dans un compartiment S3. Le code Java doit être exécuté sur AWS Lambda. 

Je reçois le code source de la variable String en Java. Ensuite, j'ai une boucle while qui tente d'écrire la chaîne dans un fichier du répertoire/tmp. Ensuite, le fichier est téléchargé sur S3. 

Tout fonctionne mais je reste bloqué avec une URL spécifique. J'ai suivi le problème à ce point:

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

Le plus étrange est que, lorsque je teste le code localement, tout fonctionne. Le fichier est créé dans le répertoire/tmp de mon ordinateur, puis il est chargé dans un compartiment S3. Cependant, lorsque j'exécute le code dans Lambda, l'erreur suivante apparaît:

Task timed out after 15.00 seconds

Avez-vous une idée de la raison pour laquelle Lambda n’écrit pas le fichier dans son répertoire temporaire dans ce cas particulier et fonctionne avec d’autres?

18
jansv

Amazon Lambda est conçu pour être utilisé en tant que système géré par événement qui répond aux événements. Le flux est:

  • Quelque chose se passe quelque part que déclenche Lambda (par exemple, un téléchargement sur Amazon S3, des données entrant dans un flux Amazon Kinesis, une application appelant directement la fonction Lambda)
  • La fonction Lambda est créée , les données de l'événement déclencheur sont transmises
  • La fonction Lambda s'exécute

Les fonctions Lambda sont limitées à une durée d'exécution maximale de 5 minutes. La limite réelle est configurée lors de la création de la fonction Lambda. La limite est en place parce que les fonctions Lambda sont censées être petites et rapides plutôt que d'être de grandes applications.

Votre message d'erreur dit Task timed out after 15.00 seconds. Cela signifie qu'AWS a arrêté intentionnellement la tâche une fois qu'elle a été exécutée pendant 15 secondes . Cela n'a rien à voir avec ce que la fonction faisait à l'époque, ni avec le fichier en cours de traitement.

Pour résoudre ce problème: Augmentez le délai d'attente sur la page de configuration de votre fonction Lambda.

40
John Rotenstein

Dans mon cas, lorsque la tâche fonctionnait bien localement mais que le délai était écoulé sous Lambda, c'était parce que je devais augmenter la mémoire allouée à l'instance Lambda. 

4
andreamc

J'ai résolu le problème en plaçant AWS-SDK en dehors du corps de la fonction:

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
Wolfgang Bischoff

Tout d’abord, pourquoi écrire dans/tmp /? Vous écrivez au même endroit où la fonction Lambda est exécutée?

Cependant, une meilleure chose à faire est que, si vous voulez écrire une chaîne en tant que fichier S3, vous pouvez créer un S3Object et l'écrire directement dans AWS S3. Voici un article qui montre un exemple: https://stackoverflow.com/a/29844224/358013

0
blueskin