AWS VPC中调用Network Firewall的Lambda函数超时问题排查
问题根因
- 核心认知偏差:
describe_firewall属于AWS Network Firewall的控制平面API,调用目标是AWS区域级公共服务端点,并非你VPC内部署的Network Firewall数据平面端点(即路由表中配置的vpce-firewallEndpoint)。你之前通过Network Analyzer验证的仅为Lambda到VPC内防火墙数据面端点的私网连通性,完全没有覆盖Lambda到AWS控制面端点的访问路径,属于无效排查项。 - 网络路径阻断:你当前VPC架构未部署NAT网关,VPC内资源访问公网必须满足「子网路由指向IGW+资源弹性网卡绑定公网IP」两个条件,但VPC模式部署的Lambda默认不会为弹性网卡分配公网IP,导致代码中硬编码公网endpoint的API流量无法通过IGW转发到公网,TCP握手持续失败最终触发超时。该问题和函数内存、超时阈值、安全组规则、防火墙实例定位逻辑无直接关系,boto3不存在配置缺失导致无法定位防火墙实例的问题——如果是资源不存在或权限不足,会直接返回明确的ClientError,不会触发无日志超时。
修复方案
按优先级从高到低选择方案即可:
- 最优方案(私网访问,无需公网带宽)
- 首先调整Lambda代码,删除硬编码的公网
endpoint_url配置,同时建议将boto3客户端初始化移入handler逻辑,避免跨执行环境的连接残留问题,修正后代码如下:
import boto3 import json def lambda_handler(event, context): session = boto3.session.Session() nf_client = session.client( service_name="network-firewall", region_name="eu-west-2" ) response = nf_client.describe_firewall(FirewallName="DemoFirewall2") return 1- 在当前VPC内创建
com.amazonaws.eu-west-2.network-firewall类型的接口型VPC端点,开启私有DNS解析功能,将端点部署在现有可达子网中,关联安全组放通来自Lambda所属网段的443端口入站。配置完成后boto3会自动通过PrivateDNS将控制面请求解析到VPC端点私网地址,流量全程走VPC内部转发,无需公网访问能力,也不会经过你部署的防火墙数据面链路,延迟和稳定性最优。
- 首先调整Lambda代码,删除硬编码的公网
- 替代方案(公网访问,链路更长)
如果你不想创建接口VPC端点,需要在防火墙子网部署NAT网关,将Lambda所属子网的默认路由调整为指向NAT网关,同时在Network Firewall的访问策略中放通到AWS Network Firewall公网服务地址段的443出站流量。该方案需要额外支付NAT网关带宽和资源费用,且流量需要多绕一层防火墙,不推荐使用。
验证方法
配置完成后先在测试事件中触发函数,若配置正确CloudWatch会正常记录API返回结果或权限类错误提示,不会再出现无任何业务日志直接超时的现象;如果提示权限不足,给Lambda执行角色附加network-firewall:DescribeFirewall对应权限即可。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

