19

Sto tentando invano di scrivere sul file system di un'istanza di aws lambda. The docs say che un'istanza lambda standard ha 512mb di spazio disponibile a /tmp/. Tuttavia il seguente codice che viene eseguito sulla mia macchina locale non funziona affatto su istanza lambda:Come si scrive sul file system di un'istanza di aws 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!"); 
    }); 

Il codice nella funzione di callback anonima non è mai sempre chiamato sull'istanza lambda. Qualcuno ha avuto successo a fare questo? Grazie mille per il vostro aiuto.

È possibile che si tratti di uno question correlato. È possibile che ci sia un qualche tipo di conflitto tra il codice s3 e quello che sto cercando di fare con la funzione di callback fs? Il codice seguente è ciò che è attualmente in esecuzione.

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

La mia comprensione di aws-lambda è che il codice viene eseguito in risposta ad un 'evento' - l''evento' quel pezzo di codice" risponde "anche all'essere attivato? –

+0

@ JaromandaX Sì, è corretto. L'evento è stato licenziato con successo. Questo fa parte di un più ampio set di codice che tenta di scrivere un file CSV ottenuto da S3 e quindi convertirlo in Json e caricarlo di nuovo in un altro s3 bucket in modo che possa essere ingerito in un dynamoDB tramite un'altra istanza lambda. Tutto funziona ma questo pezzo ... – Rymnel

+1

stai usando 'console.log' - l'output di console.log è a tua disposizione in qualche modo (non uso aws-lambda che è il motivo per cui lo chiedo) - se sì, fa un console.log PRIMA che fs.writeFile venga eseguito? –

risposta

7

Quindi la risposta sta nel context.fail() o context.succeed() funzioni. Essendo completamente nuovo nel mondo di aws e lambda, ignoravo il fatto che chiamassi uno di questi metodi stops execution of the lambda instance.

Secondo la documentazione:

Il context.succeed() metodo segnali esecuzione riuscita e restituisce una stringa.

Eliminando questi e chiamandoli solo dopo aver eseguito tutto il codice che volevo, tutto ha funzionato bene.

10

La modifica del codice nel modello Lambda ha funzionato per me. Penso che sia necessario assegnare una funzione a exports.handler e chiamare il metodo appropriato context.succeed() o context.fail(). Altrimenti, ottieni solo errori generici.

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

Grazie per il suggerimento. Ho modificato il mio codice e incluso più contesto, ma la mia funzione di callback non viene richiamata. Sospetto che ci sia un qualche tipo di conflitto tra la funzione s3.getObject e quello che sto cercando di fare.Ho visto la tua risposta qui http://stackoverflow.com/questions/30927172/how-to-upload-an-object-into-s3-in-lambda e mi chiedo se non si riferisce in qualche modo alla mia domanda. – Rymnel

Problemi correlati