AWS Lambda使用NodeJS的basic-ftp库连接FTP服务器超时如何解决?
问题排查与解决步骤
该错误是AWS Lambda运行环境到目标FTP服务器21端口的网络不通导致,本地运行正常说明FTP服务本身无异常,问题出在Lambda侧的网络配置或FTP的访问规则配置,可按以下顺序排查:
1. 排查Lambda网络部署配置
- 如果Lambda使用默认无VPC部署模式:默认具备公网出口,首先确认目标FTP服务器是否配置了IP白名单,Lambda默认模式的出口IP为AWS对应区域动态分配的地址,若FTP有白名单限制,要么将AWS对应区域的公网IP段加入白名单,要么将Lambda迁移到配置了固定公网出口的自定义VPC中。
- 如果Lambda绑定了自定义VPC:
- 若目标FTP是公网服务:需将Lambda部署在VPC的私有子网中,私有子网绑定NAT网关、NAT网关绑定弹性公网IP,提供公网访问能力,同时确认VPC安全组的出站规则允许到目标FTP IP的TCP 21端口请求。
- 若目标FTP是内网服务(同VPC/专线连通的内部环境):确认VPC路由表配置正确,可正常路由到FTP所在的IP段,同时对应安全组、网络ACL放通21端口的访问规则。
2. 排查FTP模式配置
basic-ftp默认使用被动模式连接FTP,需确认对应端口规则已放开:
- 被动模式下除了21控制端口,还需要连接FTP服务器返回的随机高位端口,需确认Lambda安全组出站规则、FTP侧的入站规则都放开了FTP服务配置的被动端口范围。
- 若使用主动模式,需在代码中显式关闭被动模式
client.ftp.activatePassiveMode = false,同时需要FTP服务器可主动访问Lambda的入站端口,该场景复杂度更高,优先推荐使用被动模式。
3. 网络连通性验证
可在Lambda中加入极简的端口连通测试代码,排除basic-ftp库本身的影响,缩小问题范围:
const net = require('net'); exports.handler = async (event) => { return new Promise((resolve, reject) => { const socket = new net.Socket(); socket.setTimeout(3000); socket.connect(21, '替换为你的FTP服务器IP', () => { console.log('21端口连通正常'); socket.destroy(); resolve('success'); }); socket.on('error', (err) => { console.log('21端口连通失败', err); reject(err); }); socket.on('timeout', () => { console.log('连接超时'); socket.destroy(); reject(new Error('连接超时')); }); }); };
若该测试代码也返回超时,可100%确认是网络配置问题,和FTP连接库无关。
4. 其他配置排查
- 确认Lambda的函数超时时间设置,FTP连接握手耗时通常高于普通HTTP请求,建议先将超时时间调整到10秒以上测试。
- 确认FTP服务器未开启防暴力破解、频率限制规则,避免Lambda的请求被临时拦截。
内容的提问来源于stack exchange,提问作者Lucas Sousa
相关产品推荐
相关产品推荐

