AWS Lambda中requests.get连接超时问题排查求助
AWS Lambda调用外部API超时问题排查与解决建议
问题详情
在AWS Lambda中运行调用外部API的代码时,出现连接超时错误,本地环境(Visual Studio Code)运行正常。具体错误信息如下:
ConnectTimeout: HTTPSConnectionPool(host='api.hypixel.net', port=443): Max retries exceeded with url: /skyblock/auctions (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f513a00e590>, 'Connection to api.hypixel.net timed out. (connect timeout=None)')) Traceback (most recent call last):
使用的代码:
import requests print("Start") AH_request = requests.get("https://api.hypixel.net/skyblock/auctions",verify=False) print("SC: ",AH_request.status_code) AH_data = AH_request.json() print("AH_data: ", AH_data)
已尝试的操作:
- 代码在本地Visual Studio Code中可正常运行,问题仅出现在AWS Lambda环境
- 尝试设置
verify=false - 调用其他外部API(如
https://www.boredapi.com/api/activity、https://api.publicapis.org/entries)均出现相同错误 - 尝试使用
from botocore.vendored import requests,但提示'.get'不属于该模块
其他信息:
- 刚接触AWS,可能忽略了基础配置
- Lambda已关联VPC和EFS,且
Allow IPv6 traffic = false
核心原因分析
你猜测的权限问题方向正确,但更准确的是Lambda关联VPC后的网络配置问题:默认情况下,Lambda函数关联VPC后,会被部署到指定子网中,如果这些子网是私有子网且未配置NAT网关,Lambda将无法访问公网;另外,安全组或网络ACL的出站规则限制也会导致无法建立外部连接。
解决建议
1. 检查VPC子网配置
- 确认Lambda所在的子网类型:如果是私有子网,必须配置NAT网关(部署在公有子网中),并确保私有子网的路由表添加指向NAT网关的路由条目(目标
0.0.0.0/0指向NAT网关) - 如果不需要Lambda访问VPC内资源(比如EFS),可以直接移除Lambda的VPC关联,此时Lambda默认拥有公网访问权限
2. 验证安全组规则
- 确保Lambda关联的安全组允许出站HTTPS流量(目标端口443,目标地址
0.0.0.0/0) - 安全组是状态型规则,出站允许后,对应的入站响应会自动被允许,无需额外配置入站规则
3. 检查网络ACL配置
- 网络ACL需要同时配置出站允许规则(允许目标端口443,源/目标
0.0.0.0/0)和入站允许规则(允许来自任意地址的临时端口范围,对应HTTPS响应的返回流量) - 注意网络ACL是无状态规则,必须同时配置入站和出站的允许规则
4. 代码层面优化
- 避免使用已废弃的
botocore.vendored.requests,直接在Lambda部署包中包含标准的requests库(可通过本地打包或使用Lambda层实现) - 添加请求超时参数,避免无限制等待:
AH_request = requests.get("https://api.hypixel.net/skyblock/auctions", verify=False, timeout=30)
内容的提问来源于stack exchange,提问作者Yellow Blood
相关产品推荐
相关产品推荐

