2015-12-18 85 views
5

我寫了一些基本的js只列出FTP的文件,但我得到:AWS Lambda可以與S/FTP交互/互動嗎?

是不是因爲拉姆達不能與FTP互動「過程完成請求之前退出」?

我正在使用jsftp btw。

這裏是我的設置:

  • 我用Serverless創建項目
  • 對於我的拉姆達,我用和的NodeJS我使用JSFTP應對FTP的東西。

我的代碼:

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

我的FTP拉姆達代碼:

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

我加了一些的console.log()所有的地方,它看起來像它扼殺一旦它試圖ftp.auth。

輸出我在雲表看到:

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 

所以看起來它只是哽咽的地方......

+0

lambda函數執行的默認超時時間爲3秒。您的通話可能需要更長時間並終止。您可以嘗試將其更改爲更大的值 –

+0

您的進程崩潰(在日誌中查找錯誤)或最後沒有調用context.succeed()。 –

+0

@mbaird更新版本使用代碼即時通訊使用 – iCodeLikeImDrunk

回答

3

總之,FTP不會拉姆達因爲它們使用臨時端口工作。

sftp將與lambda很好地配合使用。我通過jsch使用java代碼進行測試,沒有問題;我不能看到它不會與任何js sftp lib工作。

+0

這是不正確的。也許是當你回答這個問題的時候,所以我不會在這個推定上倒下。我們在生產AWS Lambda的python中使用FTP傳輸代碼。 – javamonkey79

+0

不知道自從我工作以來是否有任何改變。請注意,這是在vpc被支持之前。我試着用java和js,雖然沒有檢查python。 – iCodeLikeImDrunk

+1

https://aws.amazon.com/lambda/faqs/表示不允許傳入的TCP連接。這意味着FTP PASV至少不會工作。問:AWS Lambda功能代碼有哪些限制? ...入站網絡連接被AWS Lambda阻止,對於出站連接,僅支持TCP/IP套接字,並且ptrace(調試)系統調用受到限制。 TCP端口25流量也被限制爲反垃圾郵件措施。 – Adam

3

它只是現在可以進行測試。 確保烏爾超時設置得足夠長,你調用context.succeed()的進程終止

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

在嘗試ls之前,ftp需要先驗證身份嗎?或者是否已經認證JSFtp已經授權? – iCodeLikeImDrunk

+0

通常是的,但我只是使用公共的ftp服務器進行測試。只需將您的登錄憑證與lambda函數本身一起運送 – Yerken

+0

是的,我從字面上對硬幣進行了硬編碼。我會嘗試一個公共的ftp,看看是否有差異。 – iCodeLikeImDrunk

1

默認情況下,lambda函數只有三秒鐘即可完成。如果花費的時間比這更長,你會看到你所看到的錯誤。

您可以將超時調整爲最多5分鐘。要使用aws CLI改變它,運行:

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

它以1s結束,並且我已經用1GB內存設置了2分鐘的超時... – iCodeLikeImDrunk

相關問題