AWS Lambda 可以 reach/interact 和 S/FTP 吗?
Can AWS Lambda reach/interact with S/FTP?
我写了一些基本的 js 来列出 FTP 的文件,但我得到:
"Process exited before completing request"
那是因为 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
所以它看起来像是在某处窒息了...
刚才测试是可以的。
确保你的超时设置足够长并且你在进程终止时调用 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);
});
};
默认情况下,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 lib.
一起工作
我写了一些基本的 js 来列出 FTP 的文件,但我得到:
"Process exited before completing request"
那是因为 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
所以它看起来像是在某处窒息了...
刚才测试是可以的。 确保你的超时设置足够长并且你在进程终止时调用 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);
});
};
默认情况下,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 lib.
一起工作