2015-12-18 13 views
5

Ich schrieb einige grundlegende js nur die Dateien eines FTP-Liste, aber ich erhalte:Kann AWS Lambda mit S/FTP kommunizieren?

„Prozess beendet, bevor Anforderung abgeschlossen“

Ist das, weil Lambda nicht mit FTP in Wechselwirkung treten können?

Ich benutze jsftp BTW.

Hier ist mein Setup:

  • ich Serverless verwende das Projekt
  • Für mein Lambda zu schaffen, habe ich NodeJS und ich bin mit JSFTP mit den ftp Sachen beschäftigen.

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

Mein ftp Lambda-Code:

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

ich einige console.log hinzugefügt() alle über den Ort und es scheint, wie es einmal würgte es versucht, ftp.auth.

Der Ausgang I in Cloud-Uhr sehen:

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 

So sieht es aus wie es gerade irgendwo erstickt ...

+0

Das Standard-Timeout für die Ausführung einer Lambda-Funktion beträgt 3 Sekunden. Ihr Anruf könnte länger dauern und beendet werden. Sie können versuchen, es zu einem größeren Wert zu ändern –

+0

Entweder Ihr Prozess stürzt ab (suchen Sie nach Fehlern im Protokoll) oder Sie rufen context.succeed() am Ende nicht auf. –

+0

@mbaird aktualisiert op mit dem code im mit – iCodeLikeImDrunk

Antwort

3

kurz gesagt, ftp nicht mit Lambda arbeiten, da sie temporäre Ports verwenden.

sftp wird gut mit Lambda arbeiten. Ich testete mit Java-Code über JSCH ohne Probleme; tho ich kann nicht sehen, wie es mit jeder js sftp lib arbeiten würde.

+0

Dies ist nicht wahr. Vielleicht war es, als du das beantwortet hast, also werde ich diese Vermutung nicht ablehnen. Wir haben FTP-Transfer-Code in Python in der Produktion AWS Lambda. – javamonkey79

+0

nicht sicher, ob sich etwas geändert hat, seit ich daran gearbeitet habe. Beachten Sie, dass dies vor der Unterstützung von vpc erfolgte. Ich habe versucht mit Java und Js, aber nicht Python überprüfen. – iCodeLikeImDrunk

+1

https://aws.amazon.com/lambda/faqs/ besagt, dass eingehende TCP-Verbindungen nicht zulässig sind. Dies bedeutet, dass FTP PASV nicht funktionieren wird. F: Welche Einschränkungen gelten für den AWS Lambda-Funktionscode? ... Eingehende Netzwerkverbindungen werden von AWS Lambda blockiert, und für ausgehende Verbindungen werden nur TCP/IP-Sockets unterstützt und ptrace (Debugging) Systemaufrufe sind eingeschränkt. TCP-Port 25-Datenverkehr wird ebenfalls als Anti-Spam-Maßnahme eingeschränkt. – Adam

3

Es ist möglich, gerade jetzt getestet ist. Stellen Sie sicher, ur-Timeout eingestellt ist lang genug sein, und Sie anrufen context.succeed() auf Prozessbeendigung

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

würde das FTP zuerst authentifizieren müssen, bevor Sie ls versuchen? oder erstellt das JSFtp bereits auth für dich? – iCodeLikeImDrunk

+0

normalerweise ja, aber ich habe nur einen öffentlichen FTP-Server zum Testen verwendet. Senden Sie einfach Ihre Login-Daten mit der Lambda-Funktion selbst. – Yerken

+0

Ja, ich habe die Creds buchstäblich hartcodiert. ich werde versuchen, ein öffentliches ftp und sehen, ob das ein diff. – iCodeLikeImDrunk

1

standardmäßig Lambda-Funktionen haben nur 3 Sekunden. Wenn es länger dauert, erhalten Sie den Fehler, den Sie sehen.

Sie können den Timeout auf bis zu 5 Minuten einstellen. Um es zu ändern, die aws CLI verwenden, führen:

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

es endete unter 1s, und ive bereits das Timeout für 2 Minuten mit 1GB Mem ... – iCodeLikeImDrunk