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

Azure ML计算实例通过用户托管标识连接Azure SQL超时问题

排查Azure ML计算实例通过用户托管标识连接Azure SQL超时问题

问题现象

使用Azure ML计算实例开发时,通过用户托管标识连接Azure SQL数据库触发登录超时错误,错误栈如下:

Traceback (most recent call last):
  File "active_monitoring/dbtester.py", line 8, in <module>
    err_mart_conn.open_connection(local=False)
  File "/mnt/batch/tasks/shared/LS_root/mounts/clusters/ourrehman2/code/Users/ourrehman/Sweden_cashflow_forecasting_aml/ml_logic/active_monitoring/db_manager.py", line 47, in open_connection
    self.conn = pyodbc.connect(self.conn_str)
pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 18 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

已完成的配置

  • 创建并将用户托管标识关联至Azure ML计算实例
  • 在SQL数据库侧创建外部用户并分配权限:
CREATE USER [cluster-xxxxxxxxxx-dev] FROM EXTERNAL PROVIDER
 
EXEC sp_addrolemember 'db_datareader', 'cluster-xxxxxxxxxx-dev'
EXEC sp_addrolemember 'db_datawriter', 'cluster-xxxxxxxxxx-dev'
  • SQL防火墙已允许所有Azure资源访问
  • 已安装ODBC Driver 18 for SQL Server
  • 连接字符串指定Authentication=ActiveDirectoryMsi

排查步骤

1. 校验连接字符串格式

确保连接字符串参数完整且正确,ODBC Driver 18的标准MSI连接格式如下:

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<SQL服务器全名>.database.windows.net,1433;Database=<目标数据库名>;Authentication=ActiveDirectoryMsi;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;

注意:

  • ODBC Driver 18默认强制加密,必须显式指定Encrypt=yes
  • 核对服务器名、数据库名的拼写是否准确

2. 检查用户托管标识的IAM权限

仅数据库内部的读写权限不足以完成MSI身份验证,需在SQL服务器的IAM页面为用户托管标识分配Azure SQL Database Contributor或SQL Server Contributor角色,确保标识有权限向SQL服务器进行身份验证。

3. 测试网络连通性

在Azure ML计算实例的终端中,使用以下命令测试SQL服务器1433端口的可达性:

# 使用telnet
telnet <SQL服务器全名>.database.windows.net 1433
# 或使用nc
nc -zv <SQL服务器全名>.database.windows.net 1433

如果端口不通,说明网络层面存在阻断,需检查计算实例所在虚拟网络与SQL服务器的网络 peering、路由规则是否配置正确。

4. 验证ODBC驱动安装状态

执行以下命令查看计算实例上已安装的ODBC驱动:

odbcinst -j

确认输出中包含ODBC Driver 18 for SQL Server的条目,若缺失需重新安装驱动。

5. 测试MSI令牌获取能力

在计算实例中运行以下Python代码,验证能否正常获取SQL服务的访问令牌:

import requests
import json

resource = "https://database.windows.net/"
token_endpoint = f"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource={resource}"

headers = {"Metadata": "true"}
response = requests.get(token_endpoint, headers=headers)
print(json.loads(response.text))

若返回包含access_token的JSON数据,说明MSI功能正常;若返回错误,需检查用户托管标识是否正确关联到计算实例,以及计算实例是否能访问IMDS服务(169.254.169.254)。

6. 查看SQL服务器审计日志

在Azure门户的SQL服务器页面,进入诊断设置,开启SQL安全审计日志,查看是否有身份验证相关的错误记录,进一步区分是身份验证失败还是纯粹的网络超时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:20:26