首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:在AWS lambda函数中用ssh2-sftp客户端连接到SFTP服务器将引发超时。

错误:在AWS lambda函数中用ssh2-sftp客户端连接到SFTP服务器将引发超时。
EN

Stack Overflow用户
提问于 2020-06-04 08:33:45
回答 2查看 10.2K关注 0票数 2

我正在尝试连接到Server,并在/ARCHIVE文件夹中列出文档。凭据存储在.env文件中。当我在本地机器上运行它时,它会工作,并列出文档。

代码语言:javascript
复制
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。日志显示该函数试图连接到服务器,但甚至无法使用凭据登录。

代码语言:javascript
复制
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函数中没有实现的连接呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-04 10:26:18

AWS外SFTP服务器的解决方案

正如前面的@Atef所提到的,问题是SFTP服务器托管在AWS之外,并且只允许访问已被白化的IP。因此,我使用了以下解决方法:

使用VPC为Lambda函数配置静态IP

  1. 打开VPC管理控制台
  2. 创建一个弹性IP
  3. 向导 (“有私有和公共子网”)创建VPC
  4. 将弹性IP附加到VPC (“弹性IP分配ID")
  5. 使用路由表将私有和公共子网从0.0.0.0/0路由到弹性IP
  6. 创建一个因特网网关并将其附加到VPC
  7. 将Lambda函数附加到VPC
    1. 为您的lambda服务赋予权限AWSLambdaVPCAccessExecutionRoleAmazonEC2FullAccess

您可以通过从函数调用ipify API来测试这一点,并检查HTTP中提供的ip。应该和你的弹力IP一样。现在,您可以将此IP白名单以访问SFTP-Server。

有关更多信息,请参见见本文

票数 1
EN

Stack Overflow用户

发布于 2020-06-04 08:52:50

问题可能是您的Lambda函数无法访问SFTP主机。

此SFTP服务器是托管在AWS之外还是在您的帐户内?

如果它是托管在internet上而不是由您在AWS上托管的,您可以执行以下操作:

  1. 如果您已经有了公共VPC,则创建一个公共VPC。
  2. 在公共VPC中添加NAT网关,如果您已经拥有NAT网关,也跳过此操作
  3. 在您的Lambda函数所在的VPC中,添加一个路由表,通过将目标设置为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服务器连接和交换数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62190224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档