我正在尝试连接到Server,并在/ARCHIVE文件夹中列出文档。凭据存储在.env文件中。当我在本地机器上运行它时,它会工作,并列出文档。
async function main (event){
let Client = require('ssh2-sftp-client');
let sftp = new Client();
const dotenv = require('dotenv');
dotenv.config();
const ftpOptions = {
host: process.env.FTP_HOST,
port: process.env.FTP_PORT,
username: process.env.FTP_USER,
password: process.env.FTP_PASSWORD,
debug: console.log
}
await sftp.connect(ftpOptions);
let documentList = await sftp.list('/ARCHIVE');
console.log(documentList);
sftp.end();
}但是如果我在AWS函数中尝试它,它就会尝试连接并超时。在执行sftp.connect(ftpOptions)之前,将加载env变量并使其达到avaiable。日志显示该函数试图连接到服务器,但甚至无法使用凭据登录。
Function Logs:
START RequestId: 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e Version: $LATEST
2020-06-04T08:27:12.837Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e INFO Debugging turned on
2020-06-04T08:27:12.860Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e INFO DEBUG: Local ident: 'SSH-2.0-ssh2js0.4.10'
2020-06-04T08:27:12.898Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e INFO DEBUG: Client: Trying ftp_foo.com on port 22 ...
2020-06-04T08:27:32.929Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e INFO CLIENT[sftp]: Connection attempt 1 failed. Trying again.
2020-06-04T08:27:33.931Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e INFO DEBUG: Local ident: 'SSH-2.0-ssh2js0.4.10'
2020-06-04T08:27:33.931Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e INFO DEBUG: Client: Trying ftp_foo.com on port 22 ...
2020-06-04T08:27:53.951Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e INFO CLIENT[sftp]: Exhausted all connection attempts. Giving up
2020-06-04T08:27:53.957Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e ERROR Invoke Error {"errorType":"Error","errorMessage":"connect: Timed out while waiting for handshake after 2 attempts","code":"ERR_GENERIC_CLIENT","custom":true,"stack":["Error: connect: Timed out while waiting for handshake after 2 attempts"," at Object.formatError (/var/task/node_modules/ssh2-sftp-client/src/utils.js:62:18)"," at Client.connectErrorListener (/var/task/node_modules/ssh2-sftp-client/src/index.js:98:21)"," at Object.onceWrapper (events.js:417:26)"," at Client.emit (events.js:310:20)"," at Timeout._onTimeout (/var/task/node_modules/ssh2/lib/client.js:697:14)"," at listOnTimeout (internal/timers.js:549:17)"," at processTimers (internal/timers.js:492:7)"]}
2020-06-04T08:27:53.959Z 20d3c3b7-19d8-49cf-8997-1f2331eb0b6e ERROR Unhandled Promise Rejection {"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"Error: end: No SFTP connection available","reason":{"errorType":"Error","errorMessage":"end: No SFTP connection available","code":"ERR_NOT_CONNECTED","custom":true,"stack":["Error: end: No SFTP connection available"," at formatError (/var/task/node_modules/ssh2-sftp-client/src/utils.js:62:18)"," at Object.haveConnection (/var/task/node_modules/ssh2-sftp-client/src/utils.js:612:20)"," at /var/task/node_modules/ssh2-sftp-client/src/index.js:1248:19"," at new Promise (<anonymous>)"," at SftpClient.end (/var/task/node_modules/ssh2-sftp-client/src/index.js:1236:12)"," at downloadPDFs (/var/task/index.js:40:14)"," at processTicksAndRejections (internal/process/task_queues.js:97:5)"]},"promise":{},"stack":["Runtime.UnhandledPromiseRejection: Error: end: No SFTP connection available"," at process.<anonymous> (/var/runtime/index.js:35:15)"," at process.emit (events.js:310:20)"," at processPromiseRejections (internal/process/promises.js:209:33)"," at processTicksAndRejections (internal/process/task_queues.js:98:32)"]}
[ERROR] [1591259273978] LAMBDA_RUNTIME Failed to post handler success response. Http response code: 403.在我的本地机器上是否有什么东西可以提供我在lambda函数中没有实现的连接呢?
发布于 2020-06-04 10:26:18
AWS外SFTP服务器的解决方案
正如前面的@Atef所提到的,问题是SFTP服务器托管在AWS之外,并且只允许访问已被白化的IP。因此,我使用了以下解决方法:
使用VPC为Lambda函数配置静态IP
AWSLambdaVPCAccessExecutionRole和AmazonEC2FullAccess
您可以通过从函数调用ipify API来测试这一点,并检查HTTP中提供的ip。应该和你的弹力IP一样。现在,您可以将此IP白名单以访问SFTP-Server。
有关更多信息,请参见见本文。
发布于 2020-06-04 08:52:50
问题可能是您的Lambda函数无法访问SFTP主机。
此SFTP服务器是托管在AWS之外还是在您的帐户内?
如果它是托管在internet上而不是由您在AWS上托管的,您可以执行以下操作:
0.0.0.0/0,将目标设置为NAT网关,从而将流量重定向到NAT网关,这是我们在步骤2中创建的。通过访问这篇AWS文章:如何在VPC中让互联网访问我的Lambda功能?,您可以找到关于如何将internet连接添加到Lambda函数的详细答案。
如果SFTP服务器已经由您在AWS中托管,您可以通过使用AWS安全组添加对它的访问。
请检查如何将Lambda连接到另一个AWS服务(它使用的是RDS,但您可以遵循与SFTP服务器相同的逻辑):配置Lambda函数以访问Amazon中的Amazon
此外,请确保将Lambda超时设置为足够长,以便允许与外部SFTP服务器连接和交换数据。
https://stackoverflow.com/questions/62190224
复制相似问题