11

我写了一些基本的 js 来列出 FTP 的文件,但我得到了:

“完成请求前进程退出”

那是因为 Lambda 无法与 FTP 交互吗?

我正在使用 jsftp 顺便说一句。

这是我的设置:

  • 我使用无服务器来创建项目
  • 对于我的 lambda,我使用了 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 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);
        })
    });
};

我到处添加了一些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

所以看起来它只是在某个地方窒息......

4

3 回答 3

6

简而言之,ftp 不适用于 lambda,因为它们使用临时端口。

sftp 可以很好地与 lambda 配合使用。我通过 jsch 使用 java 代码进行了测试,没有任何问题;我看不出它如何与任何 js sftp lib 一起工作。

于 2015-12-22T19:56:51.073 回答
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);
    });
};

于 2015-12-18T16:45:14.420 回答
1

默认情况下,Lambda 函数只需 3 秒即可完成。如果它需要更长的时间,您将收到您所看到的错误。

您可以将超时时间调整为最多 5 分钟。aws要使用CLI更改它,请运行:

aws lambda update-function-configuration --function-name my-lambda-function --timeout 300
于 2015-12-18T16:51:25.203 回答