2015-12-18 1 views
5

j'ai écrit quelques js de base pour ne citer que les fichiers d'un FTP, mais je reçois:AWS Lambda peut-il atteindre/interagir avec S/FTP?

« Processus sorti avant de remplir la demande »

Est-ce parce que Lambda ne peut pas interagir avec FTP? J'utilise jsftp btw.

Voici ma configuration:

  • J'utilise Serverless pour créer le projet
  • Pour ma lambda, je nodejs et j'utilise JSFTP pour traiter les trucs ftp.

Mon code:

// Require Serverless ENV vars 
var ServerlessHelpers = require('serverless-helpers-js').loadEnv(); 

// Require Logic 
var lib = require('../lib'); 

// Lambda Handler 
module.exports.handler = function (event, context) { 

    lib.respond(event, function (error, response) { 
     return context.done(error, response); 
    }); 
}; 

Mon code ftp lambda:

var JSFtp = require("jsftp"); 

module.exports.respond = function (event, cb) { 

    var ftp = new JSFtp({ 
     host: "host", 
     user: "user", 
     password: "password" 
    }); 

    ftp.auth(ftp.user, ftp.password, function(err, res) { 
     if (err) console.log(err); 
     else console.log(res); 

     ftp.ls(".", function (err, res) { 
      var results = []; 
      res.forEach(function (file) { 
       results.push(file.name); 
      }); 

      ftp.raw.quit(); 

      return cb(null, results.length); 
     }) 
    }); 
}; 

Je glissai console.log() dans tous les sens et il semble que cela étranglé une fois qu'il a essayé de ftp.auth.

La sortie que je vois dans la montre de nuage:

START RequestId: __ID__ Version: $LATEST 
END RequestId: __ID__ 
REPORT RequestId: __ID__ Duration: 526.46 ms Billed Duration: 600 ms  Memory Size: 1024 MB Max Memory Used: 33 MB 
Process exited before completing request 

Il ressemble juste étranglé quelque part ...

+0

Le délai d'attente par défaut pour une exécution de la fonction lambda est de 3 secondes. Votre appel peut prendre plus de temps et se terminer. Vous pouvez essayer de le changer pour une valeur plus grande –

+0

Soit votre processus plante (recherchez les erreurs dans le journal) ou vous n'appelez pas context.succeed() à la fin. –

+0

@mbaird mise à jour op avec le code im en utilisant – iCodeLikeImDrunk

Répondre

3

bref, ftp ne fonctionne pas avec lambda car ils utilisent des ports éphémères. Sftp fonctionnera bien avec lambda

j'ai testé en utilisant le code java via jsch sans problèmes; Je ne peux pas voir comment cela ne marcherait pas avec n'importe quel js sftp lib.

+0

Ce n'est pas vrai. Peut-être que c'était lorsque vous avez répondu à cette question, alors je ne vais pas baisser les bras sur cette présomption. Nous avons un code de transfert FTP en python qui fonctionne dans la production AWS Lambda. – javamonkey79

+0

pas sûr si quelque chose a changé depuis que j'ai travaillé dessus. notez que c'était avant que vpc ne soit supporté. J'ai essayé d'utiliser java et js, mais je n'ai pas vérifié python. – iCodeLikeImDrunk

+1

https://aws.amazon.com/lambda/faqs/ indique que les connexions TCP entrantes ne sont pas autorisées. Cela signifie que FTP PASV ne fonctionnera pas au moins. Q: Quelles restrictions s'appliquent au code de fonction AWS Lambda? ... Les connexions réseau entrantes sont bloquées par AWS Lambda et, pour les connexions sortantes, seules les sockets TCP/IP sont prises en charge et les appels système ptrace (débogage) sont restreints. Le trafic du port TCP 25 est également restreint en tant que mesure anti-spam. – Adam

3

Il est possible testé tout à l'heure. Assurez-vous que ur délai d'attente est configuré pour être assez longue et vous appelez context.succeed() à la fin du processus

function __main__(event, context) { 
 
    var JSFtp = require("jsftp"); 
 
    var ftp = new JSFtp({ 
 
     host: "speedtest.tele2.net", 
 
     port: 21, // defaults to 21 
 
    }); 
 
    ftp.ls(".", function(err, res) { 
 
     var results = []; res.forEach(function(file) { 
 
     results.push(file.name); 
 
     }); 
 
     context.succeed(results); 
 
    }); 
 
};

+0

le ftp aurait besoin d'auth d'abord avant d'essayer ls? ou est-ce que creatnig le JSFtp déjà autorisé pour vous? – iCodeLikeImDrunk

+0

normalement oui, mais j'ai juste utilisé un serveur ftp public pour tester. Juste expédier vos identifiants de connexion avec la fonction lambda elle-même – Yerken

+0

ouais je l'ai fait, littéralement hardcoded les creds. Je vais essayer un ftp publique et voir si cela mke un diff. – iCodeLikeImDrunk

1

Par défaut, les fonctions Lambda ont seulement 3 secondes. Si cela prend plus de temps, vous obtiendrez l'erreur que vous voyez.

Vous pouvez régler le délai jusqu'à 5 minutes. Pour changer l'aide de la CLI aws, exécutez:

aws lambda update-function-configuration --function-name my-lambda-function --timeout 300 
+0

il s'est terminé sous 1s, et ive déjà fixé le timeout pour 2 minutes avec 1gb mem ... – iCodeLikeImDrunk