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?
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:
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.
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.
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");
...
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