Azure Synapse PySpark中ManagedIdentityCredential获取令牌失败问题
1. 确认Synapse工作区系统托管标识已启用
- 登录Azure门户,进入目标Synapse工作区,转到概述 -> 托管标识,验证“系统分配的托管标识”状态为已启用。若未启用,点击启用并保存配置。
2. 检查Spark池的托管标识配置
- 进入Synapse Studio,依次打开管理 -> Apache Spark池:
- 选中运行Notebook的目标Spark池,进入池设置 -> 高级
- 确认“启用托管标识”选项已勾选,并选择了正确的托管标识(系统分配或预先配置的用户分配标识)
3. 修正get_token的资源参数
- 调用
get_token时,传入的资源参数必须与目标REST API的Azure AD受众(audience)完全匹配,格式通常为API的应用ID URI或客户端ID加/.default后缀。示例代码:from azure.identity import ManagedIdentityCredential credential = ManagedIdentityCredential() # 替换为你的自定义API的正确资源标识符 token = credential.get_token("https://your-custom-api.azurewebsites.net/.default")
4. 配置托管标识对目标API的访问权限
- 在Azure AD的企业应用程序中找到Synapse的托管标识(名称与工作区一致):
- 转到权限 -> 添加权限,选择你的自定义REST API,添加对应应用权限(根据API认证要求)
- 若为应用权限,点击授予管理员同意完成权限激活
5. 调整Spark会话配置
- 在Notebook开头添加以下配置,确保Spark环境支持托管标识访问:
可先通过spark.conf.set("spark.mssparkutils.azureIdentity.enabled", "true")mssparkutils验证标识可用性,再使用ManagedIdentityCredential:import mssparkutils from azure.identity import ManagedIdentityCredential # 先验证令牌获取 mssparkutils.azure.getAccessToken("https://your-custom-api.azurewebsites.net/.default") # 再使用ManagedIdentityCredential credential = ManagedIdentityCredential() token = credential.get_token("https://your-custom-api.azurewebsites.net/.default")
6. 排查网络访问限制
- 若Synapse工作区部署在虚拟网络内,需确保Spark节点能访问托管标识元数据端点
http://169.254.169.254/metadata/identity/oauth2/token:- 检查虚拟网络NSG规则,允许出站访问该内部IP
- 确认无防火墙或代理阻止对该端点的请求
内容的提问来源于stack exchange,提问作者arpan desai
相关产品推荐
相关产品推荐

