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
相关产品推荐
相关产品推荐

