配置NAT Gateway后,使用Python Requests的Lambda Function仍超时求助
Lambda函数VPC内HTTP请求超时的排查方案
针对你遇到的Lambda在VPC内执行HTTP请求超时的问题,结合你的配置(NAT网关+公有子网、安全组全放开),可以按以下步骤排查:
1. 核心路由配置验证
- 检查Lambda关联子网的路由表:必须存在
0.0.0.0/0指向NAT网关的路由条目,而非互联网网关(IGW)。如果子网直接指向IGW,Lambda在VPC内无法直接访问公网,必须通过NAT网关中转。 - 确认NAT网关状态为可用,且绑定了有效的弹性IP。
2. DNS解析检查
VPC内的Lambda依赖VPC的DNS服务解析域名,若配置不当会导致无法解析目标地址:
- 检查VPC的
enableDnsSupport和enableDnsHostnames是否都设置为true - 在Lambda中添加测试代码验证解析:
import socket def lambda_handler(event, context): try: ip = socket.gethostbyname('google.com') print(f"Resolved IP: {ip}") except Exception as e: print(f"DNS resolve failed: {e}")
3. NAT网关的网络权限验证
- 检查NAT网关所在子网的安全组:必须允许出站的443/80端口流量到任意地址(0.0.0.0/0)
- 检查VPC的网络ACL:出站规则需允许443/80端口,入站规则需允许对应的响应流量(通常是1024-65535端口的TCP流量)
4. Lambda执行角色权限确认
Lambda在VPC内运行需要创建弹性网络接口,执行角色必须具备以下权限:
ec2:CreateNetworkInterfaceec2:DescribeNetworkInterfacesec2:DeleteNetworkInterface
额外测试建议
- 临时将Lambda移出VPC测试,如果请求正常,说明问题确实出在VPC相关配置上
- 尝试用底层的
urllib3发起请求,排除requests库的潜在问题
附你提供的问题代码:
def lambda_handler(event, context): headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'} print('Testing requests') res = requests.get('https://google.com', headers=headers) print(res.status_code) print('Test complete')
错误信息:
[ERROR] ConnectionError: HTTPSConnectionPool(host='google.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fcbb89d5b80>: Failed to establish a new connection: [Errno 110] Connection timed out')) Traceback (most recent call last): File "/var/task/lambda_function.py", line 86, in lambda_handler posts_res = requests.get(page_url, headers=headers) File "/var/task/requests/api.py", line 73, in get return request("get", url, params=params, **kwargs) File "/var/task/requests/api.py", line 59, in request return session.request(method=method, url=url, **kwargs) File "/var/task/requests/sessions.py", line 587, in request resp = self.send(prep, **send_kwargs) File "/var/task/requests/sessions.py", line 701, in send r = adapter.send(request, **kwargs) File "/var/task/requests/adapters.py", line 565, in send raise ConnectionError(e, request=request)
内容的提问来源于stack exchange,提问作者Ashley Southworth
相关产品推荐
相关产品推荐

