在Azure Data Factory中通过Function App运行Python脚本报Unauthorized错误如何解决
ADF调用Azure Function报401未授权错误解决方案
你遇到的Unauthorized报错是Azure Data Factory调用Azure Function阶段的身份鉴权失败,和你代码中操作存储账户的逻辑无关,按以下步骤排查修复:
排查步骤
- 检查Azure Function的授权级别配置
进入Function App对应的HTTP触发器函数页面,左侧菜单选择「函数密钥」,查看授权级别:- 如果授权级别为
Function或Admin:复制页面中默认的函数密钥,回到ADF的Azure Function活动配置页,在「函数密钥」输入框中粘贴该密钥即可。 - 如果授权级别为
Anonymous:无需配置密钥,但生产环境不建议使用该级别。
- 如果授权级别为
- 检查ADF中Azure Function链接服务配置
确认链接服务中填写的「Function App URL」和Function App概览页显示的官方地址完全一致,无多余后缀。
若你的Function App开启了App Service身份验证(Azure AD鉴权),还需要额外配置托管身份权限:- 为ADF实例开启系统分配托管身份
- 进入Function App的「访问控制(IAM)」页面,添加角色分配,给ADF的托管身份分配
Function App调用者角色 - 回到ADF的Function链接服务配置页,选择「系统分配托管身份」作为认证方式
- 检查网络访问限制
如果Function App配置了IP访问限制,需要将ADF对应区域的服务出站IP添加到Function App的白名单;若使用私有端点部署,需确保ADF和Function App网络连通。
额外代码优化建议(与当前报错无关,提升Function运行稳定性)
你现有代码存在两个可优化点:
- 语法错误:
file2 = pd.DataFrame(])多了一个右括号,需修正为file2 = pd.DataFrame() - 临时文件路径兼容性问题:Windows格式的反斜杠路径在Linux环境的Function App中无法识别,建议直接用内存流操作,无需写入本地磁盘:
from io import BytesIO # 下载blob时直接读入内存,省略写本地步骤 blob_data = blob_client_instance.download_blob() if i == 'file1.csv': file1 = pd.read_csv(BytesIO(blob_data.readall())) if i == 'file2.csv': file2 = pd.read_csv(BytesIO(blob_data.readall())) # 合并后直接转字节流上传ADLS,省略写本地步骤 output = BytesIO() summary.to_csv(output, index=False, encoding='utf-8') output.seek(0) file_client.upload_data(output.read(), overwrite=True)
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

