Node.js AWS Lambda能否与S/FTP联系/互动?

Node.js AWS Lambda能否与S/FTP联系/互动?,node.js,ftp,sftp,aws-lambda,serverless-framework,Node.js,Ftp,Sftp,Aws Lambda,Serverless Framework,我写了一些基本的js来列出FTP的文件,但我得到: “进程在完成请求之前退出” 这是因为Lambda不能与FTP交互吗 顺便说一句,我正在使用jsftp 以下是我的设置: 我使用创建项目 对于我的lambda,我使用nodejs,我使用JSFTP来处理ftp内容 我的代码: // Require Serverless ENV vars var ServerlessHelpers = require('serverless-helpers-js').loadEnv(); // Require

我写了一些基本的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时,它似乎被阻塞了

我在cloud watch中看到的输出:

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

所以它看起来像是在某处窒息了…

现在可以测试了。 确保您的超时设置为足够长,并且在进程终止时调用context.success()

function\uuuuu main\uuuu(事件、上下文){
var JSFtp=require(“JSFtp”);
var ftp=newjsftp({
主持人:“speedtest.tele2.net”,
端口:21,//默认为21
});
ftp.ls(“.”),函数(err,res){
var results=[];res.forEach(函数(文件){
results.push(文件名);
});
成功(结果);
});

};默认情况下,Lambda函数只有3秒的时间完成。如果需要更长的时间,您将看到错误

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

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

简而言之,ftp将不能与lambda一起工作,因为它们使用临时端口


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

lambda函数执行的默认超时为3秒。您的通话可能需要更长时间,因此可能会被终止。您可以尝试将其更改为更大的值。您的进程正在崩溃(在日志中查找错误),或者您没有在结尾处调用context.success()。@mbaird使用代码im using更新了op您是用Lambda模板创建的吗?代码看起来是错的。Lambda应该向您传递事件对象和上下文对象。您的函数接受一个事件对象和一个回调函数。我不确定你的函数是否被Lambda调用。代码是使用无服务器生成的。如果你看第一个代码段,它有事件/上下文;这些r传递给另一个方法来处理逻辑。ftp在尝试ls之前是否需要先进行身份验证?或者创建JSFtp是否已经为u进行了身份验证?通常是的,但我只是使用了一个公共ftp服务器进行测试。只要把你的登录凭证和lambda函数一起发送就行了是的,我确实这样做了,简直是硬编码了凭证。我将尝试一个公共ftp,看看这是否是一个差异。从你的问题的代码是错误的。请注意,在方法中,第二个参数是
cb
,它不是一个函数,而是一个具有三个主要函数
success、fail、done
的对象。需要按照我提供的示例执行你所说的错误是什么意思?我使用node运行代码,它运行得很好(减去lambda的东西)。我使用Serverless运行代码,运行良好。编辑:cb是正确的,在第一个代码段中,响应的第二个参数是cb。这不是真的。也许是你回答这个问题的时候,所以我不会对这个假设投反对票。我们在生产环境AWS Lambda中使用了python中的FTP传输代码。不确定自从我使用它以来是否有任何变化。请注意,这是在支持vpc之前。我尝试使用java和js,但没有检查python。表示不允许传入TCP连接。这意味着FTP PASV至少不会工作。问:AWS Lambda功能代码有哪些限制。。。AWS Lambda阻止入站网络连接,对于出站连接,仅支持TCP/IP套接字,并且限制ptrace(调试)系统调用。TCP端口25流量也作为反垃圾邮件措施受到限制。