如何让ADF中Python脚本访问禁用公网的Azure SQL Server(私有端点)
解决ADF Batch服务中Python脚本无法访问私有Azure SQL Database的问题
问题核心
你的ADF纯SQL管道能正常访问禁用公网的SQL Server,但通过Batch运行的Python脚本无法连接,本质原因是:
- 纯SQL管道依赖ADF集成运行时(托管或自托管),私有网络场景下该IR已配置为可访问SQL私有端点
- Batch任务默认在公共网络环境运行,无法直接访问仅允许私有访问的SQL Server
解决方案
1. 将Batch账户注入目标虚拟网络
要让Batch节点进入私有网络访问SQL Server,需完成以下配置:
- 确保Batch账户为用户订阅模式(Batch服务模式不支持VNet注入,若当前是服务模式需重新创建账户)
- 将Batch账户部署到与SQL Server同VNet的子网,或与SQL所在VNet对等连接的子网中
- 配置子网的NSG规则,允许Batch节点访问SQL Server的1433端口(或SQL私有端点的自定义端口)
2. 配置ADF使用自托管集成运行时连接Batch
- 创建自托管集成运行时(IR),并将其部署到能访问SQL Server的VNet内节点(如Azure VM)
- 在ADF的Batch链接服务配置中,选择该自托管IR,确保Batch任务通过IR所在的私有网络发起连接
3. 调整Python脚本的连接地址
将SQL Server的连接地址替换为私有端点的DNS名称或私有IP,避免使用公网域名:
import urllib import sqlalchemy import pandas as pd sql_query = 'SELECT TOP (1000) * FROM [dbo].[Table]' # 替换为SQL私有端点的DNS名称或私有IP server = '<sql-private-endpoint-dns-or-ip>' database = '<dbname>' username = '<username>' password = '<password>' driver = '{ODBC Driver 17 for SQL Server}' odbc_str = f'DRIVER={driver};SERVER={server};PORT=1433;UID={username};DATABASE={database};PWD={password}' connect_str = 'mssql+pyodbc:///?odbc_connect=' + urllib.parse.quote_plus(odbc_str) engine = sqlalchemy.create_engine(connect_str) df = pd.read_sql(sql_query, engine) engine.dispose()
验证要点
- 确认Batch节点所在子网能ping通SQL的私有端点IP
- 检查SQL Server的防火墙规则,允许Batch子网的IP范围访问
- 确保自托管IR节点能正常连接SQL Server
内容的提问来源于stack exchange,提问作者Freejack
相关产品推荐
相关产品推荐

