如何在Azure中运行带依赖包的Python脚本并连接Azure SQL数据库?
Azure Function访问Azure SQL的配置方案及替代部署选项
一、非Premium Azure Function访问Azure SQL的防火墙解决办法
不用升级到Premium计划,有几种低成本方案:
- 开启Azure服务访问权限:在Azure SQL服务器的防火墙设置中,勾选「允许Azure服务和资源访问此服务器」。该选项会允许所有Azure内部服务访问SQL,结合你使用的AD服务主体认证,安全性可以得到保障。
- VNet集成方案:给Azure Function配置VNet集成,将其加入与SQL服务器同VNet或对等VNet,然后在SQL防火墙中添加该VNet的地址范围。这种方式比Premium计划成本低,适合低频次运行的场景。
- 确认AD服务主体权限:确保你代码中使用的服务主体已被授予Azure SQL的访问权限(比如添加
db_datawriter、db_datareader角色),这是token认证能正常工作的前提。
二、优化依赖包管理与部署效率
解决本地修改后重复发布的低效问题:
- 远程构建部署:将代码托管到GitHub/GitLab等仓库,在Azure Function的部署中心选择从仓库部署,并开启远程构建。Azure会自动读取
requirements.txt安装依赖,无需本地打包。 - 在线编辑器修改:直接在Azure Portal的Function代码编辑器中修改代码和
requirements.txt,保存后Azure会自动安装依赖,适合小范围调整。 - 自动化CI/CD:配置Azure DevOps Pipeline或GitHub Actions,实现代码提交后自动部署到Azure Function,完全替代手动发布流程。
三、连接代码在Azure Function中失效的排查与修复
你提供的本地正常但云端失效的代码,可从以下几点优化:
- 替换弃用的ADAL库:ADAL已被官方弃用,改用
azure-identity库更稳定,且token处理更简洁。 - 环境变量替代硬编码:将
authority_url、applicationID、secret等敏感信息放到Azure Function的「应用设置」中,用os.getenv()读取,避免硬编码错误。 - 简化token处理逻辑:新版pyodbc支持直接传入token字符串的字节形式,无需手动构建复杂的byte结构。
修复后的示例代码:
import pyodbc import os from azure.identity import ClientSecretCredential # 从应用设置读取配置 tenant_id = os.getenv("TENANT_ID") client_id = os.getenv("CLIENT_ID") client_secret = os.getenv("CLIENT_SECRET") server = os.getenv("SQL_SERVER") database = os.getenv("SQL_DATABASE") # 获取认证token credential = ClientSecretCredential(tenant_id, client_id, client_secret) token = credential.get_token("https://database.windows.net/.default") # 构建连接字符串并连接 conn_str = f"Driver={{ODBC Driver 18 for SQL Server}};SERVER={server};DATABASE={database};Encrypt=yes" dbEngine = pyodbc.connect(conn_str, attrs_before={1256: token.token.encode("utf-8")})
另外需确保requirements.txt中包含依赖:
pyodbc azure-identity
四、替代实现方案
如果Azure Function的方案仍不符合需求,可考虑以下选项:
- Azure Logic Apps:无需编写Python代码,直接用内置连接器调用API并写入Azure SQL,支持定时触发和手动触发,自带依赖管理,零代码部署。
- Azure Container Apps Jobs:将Python脚本打包为Docker镜像,部署为Container Apps Job,支持定时和手动触发,成本极低(按运行时长计费),依赖包预先封装在镜像中,修改代码后重新构建镜像即可。
- Azure Automation Runbook:使用Python Runbook,支持定时和手动触发,可安装第三方包,适合低频次的数据同步任务,运维成本低。
内容的提问来源于stack exchange,提问作者Wannes
相关产品推荐
相关产品推荐

