【问题标题】:Can AWS Lambda reach/interact with S/FTP?AWS Lambda 可以访问/与 S/FTP 交互吗?
【发布时间】:2016-03-25 09:39:10
【问题描述】:

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

“完成请求前进程退出”

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

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

这是我的设置:

  • 我使用Serverless创建项目
  • 对于我的 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

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

【问题讨论】:

  • lambda 函数执行的默认超时时间是 3 秒。您的通话可能需要更长的时间并被终止。您可以尝试将其更改为更大的值
  • 要么您的进程崩溃(在日志中查找错误),要么您最后没有调用 context.succeed()。
  • @mbaird 使用我正在使用的代码更新了操作
  • 您是使用 Lambda 模板创建的吗?代码看起来不对。 Lambda 应该向您传递一个事件对象和一个上下文对象。您的函数采用事件对象和回调函数。我不确定你的函数是否被 Lambda 调用。
  • 代码是使用无服务器生成的,如果您查看第一个 sn-p,它具有事件/上下文;那些 r 传递给另一个方法来处理逻辑..

标签: node.js ftp sftp aws-lambda serverless-framework


【解决方案1】:

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

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

【讨论】:

  • 这不是真的。也许是你回答这个问题的时候,所以我不会反对这个假设。我们在生产 AWS Lambda 中使用 python 中的 FTP 传输代码。
  • 不确定自从我工作以来是否有任何变化。请注意,这是在支持 vpc 之前。我尝试使用 java 和 js,但没有检查 python。
  • aws.amazon.com/lambda/faqs 表示不允许传入的 TCP 连接。这意味着 FTP PASV 至少不能工作。问:AWS Lambda 函数代码有哪些限制? ...入站网络连接被 AWS Lambda 阻止,出站连接仅支持 TCP/IP 套接字,并且 ptrace(调试)系统调用受到限制。作为反垃圾邮件措施,TCP 端口 25 流量也受到限制。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案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);
        });
    };

    【讨论】:

    • 在尝试 ls 之前 ftp 是否需要先进行身份验证?还是 creatnig JSFtp 已经为你进行了身份验证?
    • 通常是的,但我只是使用公共 ftp 服务器进行测试。只需使用 lambda 函数本身发送您的登录凭据
    • 是的,我做到了,字面上是硬编码的凭据。我会尝试一个公共 ftp 看看是否有差异。
    • 您问题中的代码是错误的。请注意,您方法中的第二个参数是cb,不是函数,而是具有三个主要函数succeed, fail, done 的对象。需要按照我提供的例子执行
    • 你说的错是什么意思?我使用节点运行代码,它运行得很好(减去 lambda 的东西)。我使用无服务器运行代码并且运行良好。编辑:cb 是正确的,在第一个 sn-p 中,响应的第二个参数是 cb。
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 2018-12-27
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多