You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端口,不要搞混两类规则:
    1. 如果函数未配置虚拟网络(VNet)集成,走公网访问MI,必须确认MI已开启公网访问开关,公网终结点地址格式为<mi_name>.public.<dns_zone>.database.windows.net,3342,不要漏写地址里的public段,否则公网环境无法解析到正确IP。同时确认NSG入站规则的3342端口是作用在MI公网终结点对应的网卡/子网上,不要错配到私有终结点的规则上。
    2. 如果函数配置了VNet集成走内网访问MI,不需要加公网IP白名单,需要检查:函数集成子网的出站NSG没有拦截到MI子网1433端口的流量;MI子网的NSG入站规则放通了函数集成子网的整个地址段访问1433端口。
  • 直接在函数环境验证连通性
    登录函数应用的Kudu控制台,执行tcpping <你的MI连接地址>:<端口>命令直接测试网络连通性,如果tcpping不通,不需要排查代码、驱动、账号问题,继续排查网络路径即可。
  • 检查MI实例级防火墙规则
    部分SQL MI除了子网NSG外,还配置了实例层面的访问防火墙,确认该层规则没有拦截函数对应的IP段。

内容的提问来源于stack exchange,提问作者atif_sreezon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:39:16