web-dev-qa-db-fra.com

Comment écrivez-vous dans le système de fichiers d'une instance aws lambda?

J'essaie en vain d'écrire dans le système de fichiers d'une instance aws lambda. Les docs disent qu'une instance lambda standard dispose de 512 Mo d'espace disponible à /tmp/. Cependant, le code suivant qui s'exécute sur ma machine locale ne fonctionne pas du tout sur l'instance lambda:

  var fs = require('fs');
  fs.writeFile("/tmp/test.txt", "testing", function(err) {
      if(err) {
          return console.log(err);
      }
      console.log("The file was saved!");
  });

Le code de la fonction de rappel anonyme n'est jamais appelé sur l'instance lambda. Quelqu'un a-t-il réussi à faire cela? Merci beaucoup pour votre aide.

Il est possible que ce soit une question liée question . Est-il possible qu'il y ait une sorte de conflit entre le code s3 et ce que j'essaie de faire avec la fonction de rappel fs? Le code ci-dessous est ce qui est en cours d'exécution.

console.log('Loading function');

var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var fs = require('fs');

exports.handler = function(event, context) {
    //console.log('Received event:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    var bucket = event.Records[0].s3.bucket.name;
    var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    var params = {
        Bucket: bucket,
        Key: key
    };
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log(err);
            var message = "Error getting object " + key + " from bucket " + bucket +
            ". Make sure they exist and your bucket is in the same region as this function.";
            console.log(message);
            context.fail(message);
        } else {

            //console.log("DATA: " + data.Body.toString());
            fs.writeFile("/tmp/test.csv", "testing", function (err) {

                if(err) {
                    context.failed("writeToTmp Failed " + err);
                } else {
                    context.succeed("writeFile succeeded");
                }
            });
        }
    });
};
31
Rymnel

La réponse réside donc dans les fonctions context.fail() ou context.succeed(). Étant complètement nouveau dans le monde de aws et lambda, je n'ignorais pas que l'appel de l'une de ces méthodes arrête l'exécution de l'instance lambda .

Selon les documents:

La méthode context.succeed () signale une exécution réussie et renvoie une chaîne.

En les éliminant et en ne les appelant qu'après avoir exécuté tout le code que je voulais, tout fonctionnait bien.

10
Rymnel

La modification de votre code dans le modèle Lambda a fonctionné pour moi. Je pense que vous devez affecter une fonction à exports.handler Et appeler la méthode context.succeed() ou context.fail() appropriée. Sinon, vous obtenez simplement des erreurs génériques.

var fs = require("fs");

exports.handler = function(event, context) {
    fs.writeFile("/tmp/test.txt", "testing", function (err) {
        if (err) {
            context.fail("writeFile failed: " + err);
        } else {
            context.succeed("writeFile succeeded");
        }
    });
};
16
James