Lambda调用私有子网Fargate服务时NLB连接被拒问题排查
问题排查与解决方案
首先,Error: connect ECONNREFUSED 127.0.0.1:80这个错误是核心线索——你的Lambda函数没有正确解析到Network Load Balancer(NLB)的真实IP,反而尝试连接本地回环地址。结合你的配置细节,我整理了几个最可能的原因和对应的解决思路:
1. Lambda函数未部署到目标VPC,无法解析私有NLB的DNS
你的NLB是Scheme: internal类型,它的DNS名称属于VPC私有域名空间,只有VPC内部的资源才能正确解析到NLB的弹性网络接口(ENI)IP。如果Lambda默认运行在AWS托管的公网环境(未配置VPC),它会使用AWS公网DNS解析器,根本无法识别私有NLB的域名,最终可能解析失败或返回无效地址(比如127.0.0.1)。
解决方法:
- 进入Lambda函数配置页,将其部署到你的目标VPC的私有子网(和NLB、Fargate同VPC)
- 你已经给Lambda执行角色配置了
ec2:CreateNetworkInterface等必要权限,这部分没问题 - 注意:Lambda部署到私有子网后,如果需要主动访问S3(比如处理上传的文件),需要配置VPC网关端点(Gateway类型)或者NAT网关——私有子网默认没有公网访问能力,而S3触发Lambda是AWS内部调用,但Lambda主动访问S3需要额外配置。
2. Lambda的VPC配置存在错误
如果你已经把Lambda部署到VPC,但以下配置有误也会导致问题:
- 选择了公网子网而非私有子网
- 子网路由表缺失VPC本地路由(默认VPC都会有,除非你手动删除)
enableDnsSupport或enableDnsHostnames未在VPC中启用(你提到VPC已启用DNS选项,这一步可以快速确认)
验证方法:
- 检查Lambda的子网配置,确保选择的是NLB所在VPC的私有子网
- 查看子网路由表,确认有指向VPC CIDR的本地路由条目
3. NLB目标组与Fargate服务的端口不匹配
虽然你说Fargate健康检查通过,但需要确认NLB转发的端口和Fargate容器实际监听的端口一致:
- 你的NLB监听TCP 80,但如果Fargate容器内的服务实际监听的是其他端口(比如3000),且目标组的
TargetPort未对应设置,NLB会把流量转发到错误端口,最终导致连接被拒绝(虽然这个场景的错误通常不是127.0.0.1,但也需要排查)
验证方法:
- 查看
TargetGroupService的配置,确认Port/TargetPort与Fargate任务定义中暴露的端口一致 - 检查Fargate容器的端口映射规则是否正确
4. 安全组的隐性限制(即使全开放也要确认)
虽然你说Lambda和Fargate用同一个全开放安全组,但还要确认:
- NLB的安全组是否允许来自Lambda安全组的TCP 80入站流量(NLB的安全组需要明确允许目标流量)
- Fargate的安全组是否允许来自NLB安全组的对应端口流量
快速测试建议
你可以在Lambda中添加一段代码,先解析NLB的DNS名称再尝试连接,通过日志定位问题:
const dns = require('dns'); const axios = require('axios'); exports.handler = async (event) => { const nlbDns = 'your-nlb-dns-name'; // 替换成你的NLB实际DNS名称 console.log(`Resolving NLB DNS: ${nlbDns}`); const ips = await dns.promises.resolve(nlbDns); console.log(`Resolved IPs: ${JSON.stringify(ips)}`); try { const response = await axios.get(`http://${nlbDns}`); return { statusCode: 200, body: response.data }; } catch (err) { console.error('Error details:', err); return { statusCode: 500, body: err.message }; } };
如果日志显示解析出的IP不是NLB的ENI IP,那问题肯定出在VPC配置或DNS解析环节。
内容的提问来源于stack exchange,提问作者DavidCG
相关产品推荐
相关产品推荐

