Google Cloud Function调用LibreNMS API超时问题排查求助
问题:Google Cloud Function调用LibreNMS API超时
本地可正常运行的代码
我用以下Python代码调用LibreNMS API:
import requests import json # 注:原代码遗漏该导入,本地能运行可能是环境隐式导入,但云函数会报错 TOKEN = './token.json' def get_request(request_type): url = f'http://192.168.1.141/api/v0/{request_type}' with open(TOKEN,'r') as file: headers = json.load(file) response = requests.get(url,headers=headers) if response.status_code == 200: pass else: print(f"Failed to pull for {request_type}: {response.status_code}") return response.json() if __name__ == '__main__': dat = get_request('alerts') # pull alerts
问题现象
- 本地运行脚本完全正常,响应速度快
- 部署为Google Cloud Function后,
requests.get(url, headers=headers)出现超时,云日志报错如下:
Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.11/site-packages/urllib3/connection.py", line 203, in _new_conn sock = connection.create_connection( Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.11/site-packages/urllib3/connectionpool.py", line 703, in urlopen httplib_response = self._make_request( Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.11/site-packages/requests/adapters.py", line 489, in send resp = conn.urlopen( Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.11/site-packages/flask/app.py", line 2529, in wsgi_app response = self.full_dispatch_request()
已排查的内容
- 本地和云函数的
requirements.txt均使用相同版本依赖:requests==2.28.1、urllib3==1.26.14,排除版本差异问题 - 最初怀疑本地IP
192.168.1.141无法被云函数访问,替换为域名librenms.bctechnologies.co.za:8050后,仍然超时
问题分析与解决建议
核心原因
Google Cloud Function默认运行在Google公共网络环境中,无法直接访问两类资源:
- 本地私有IP(192.168.1.141):属于局域网地址,仅在你的本地网络内可达,云函数所在的外部网络无法路由到该地址
- 未公开的域名(librenms.bctechnologies.co.za:8050):该域名对应的服务要么未对外开放公网访问,要么防火墙/安全组未允许Google Cloud的IP段访问
解决步骤
确保LibreNMS服务可被公网访问
- 检查LibreNMS所在服务器的防火墙规则,开放8050端口(或对应服务端口),并允许来自任意公网IP(或限定Google Cloud的IP范围)的访问
- 确认域名
librenms.bctechnologies.co.za已正确解析到服务器的公网IP,且端口映射配置正确(如果服务器在NAT后)
配置云函数的网络访问权限
- 如果LibreNMS部署在Google Cloud VPC内的私有网络,可将云函数配置为与VPC连接,使其能访问VPC内的私有资源
- 若使用其他云厂商或本地服务器,需确保服务器的公网入口规则允许云函数的出口IP访问
代码补全与容错优化
- 补全
import json导入,避免云函数抛出NameError - 添加超时参数避免无限等待:
response = requests.get(url, headers=headers, timeout=10)(可根据实际情况调整超时时间) - 增加异常捕获,比如
requests.exceptions.Timeout、requests.exceptions.ConnectionError,便于定位具体问题
- 补全
内容的提问来源于stack exchange,提问作者Dylan Solms
相关产品推荐
相关产品推荐

