Azure Function App连接SQL托管实例报登录超时问题排查
问题描述
使用Python编写的Azure Function App连接同订阅下受Network Security Group(NSG)管控的SQL Managed Instance(MI)时,本地测试(本地IP已加入NSG白名单)连接正常;已将函数应用所有出站IP在NSG入站规则中加白、开放3342端口访问权限,部署到云端后触发连接超时错误:
[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)
使用的数据库连接代码如下:
server = '<server_name>.windows.net,3342' database = 'database' username = 'Admin' password = "strongpassword" cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';Uid='+username+';Pwd='+ password+';')
函数运行时错误核心日志:
Result: Failure Exception: OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)') Stack: File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 407, in _handle__invocation_request call_result = await self._loop.run_in_executor( File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 649, in _run_sync_func return ExtensionManager.get_sync_invocation_wrapper(context, File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/extension.py", line 215, in _raw_invocation_wrapper result = function(**args) File "/home/site/wwwroot/dbConnTest/__init__.py", line 22, in main cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';Uid='+username+';Pwd='+ password+';Connection Timeout=30;')
已通过Azure门户网络页面、Azure CLI命令核对过函数出站IP,使用的查询命令如下:
az webapp show --resource-group <resource group> --name <function app> --query outboundIpAddresses --output tsv
需要确认问题排查方向、是否为ODBC驱动版本问题、白名单配置是否有误,以及遗漏的配置项。
排查步骤与解决方案
首先排除ODBC驱动版本问题:本地环境使用相同版本ODBC Driver 17可正常连接,Azure Function Python基础镜像预装的ODBC 17版本完全兼容SQL MI连接,你遇到的Login timeout expired是典型的网络层连通性故障,和驱动版本、代码逻辑、账号权限无关——本地测试已经验证过这部分逻辑正常。
按以下优先级逐一排查遗漏配置:
- 补全函数应用出站IP白名单
你当前仅添加了outboundIpAddresses对应的IP段,这只是函数应用当前稳定使用的出站IP。当函数发生缩放、平台升级、配置变更时,会从possibleOutboundIpAddresses地址池里随机选IP发起出站请求,这部分IP未加白就会出现连接超时。必须把两组IP全部加入NSG入站白名单,可通过以下CLI命令查询全量可能的出站IP:az webapp show --resource-group <resource group> --name <function app> --query possibleOutboundIpAddresses --output tsv - 核对SQL MI终结点与对应网络规则
SQL MI的公网终结点默认使用3342端口,私有终结点使用1433端口,不要搞混两类规则:- 如果函数未配置虚拟网络(VNet)集成,走公网访问MI,必须确认MI已开启公网访问开关,公网终结点地址格式为
<mi_name>.public.<dns_zone>.database.windows.net,3342,不要漏写地址里的public段,否则公网环境无法解析到正确IP。同时确认NSG入站规则的3342端口是作用在MI公网终结点对应的网卡/子网上,不要错配到私有终结点的规则上。 - 如果函数配置了VNet集成走内网访问MI,不需要加公网IP白名单,需要检查:函数集成子网的出站NSG没有拦截到MI子网1433端口的流量;MI子网的NSG入站规则放通了函数集成子网的整个地址段访问1433端口。
- 如果函数未配置虚拟网络(VNet)集成,走公网访问MI,必须确认MI已开启公网访问开关,公网终结点地址格式为
- 直接在函数环境验证连通性
登录函数应用的Kudu控制台,执行tcpping <你的MI连接地址>:<端口>命令直接测试网络连通性,如果tcpping不通,不需要排查代码、驱动、账号问题,继续排查网络路径即可。 - 检查MI实例级防火墙规则
部分SQL MI除了子网NSG外,还配置了实例层面的访问防火墙,确认该层规则没有拦截函数对应的IP段。
内容的提问来源于stack exchange,提问作者atif_sreezon
相关产品推荐
相关产品推荐

