Azure ML计算集群系统托管身份训练作业无法获取令牌求助
解决Azure ML计算集群托管身份无法获取Key Vault令牌的问题
问题背景
- 通过Terraform创建Azure ML计算集群(配置系统分配托管身份),已通过Azure门户为该身份分配Azure Key Vault的Get权限
- 使用依赖:
azure-identity==1.12.0、azure-keyvault-secrets==4.6.0,Python 3.9 - 运行自定义
GetCredentials函数时出现令牌获取失败错误,但相同流程在其他Azure资源环境可正常运行
排查与解决步骤
1. 修正令牌请求的资源URI
你的代码中请求的资源URI是https://management.core.windows.net/.default,这是Azure管理平面的地址,而访问Key Vault需要使用Key Vault专属的资源URI:https://vault.azure.net/.default。错误的URI会导致获取的令牌不具备访问Key Vault的权限。
修改后的代码:
def GetCredentials(): cred = DefaultAzureCredential( additionally_allowed_tenants=['*'], logging_enable=True, exclude_visual_studio_code_credential=True, exclude_shared_token_cache_credential=True ) # 替换为Key Vault的正确资源URI cred.get_token("https://vault.azure.net/.default") return cred
2. 验证托管身份的权限配置
- 确认Key Vault访问策略中,已为集群的系统分配托管身份添加密钥权限下的
Get操作,且权限范围未限制到特定密钥(可先测试全范围权限) - 若Key Vault启用了RBAC权限模型,需确保该托管身份被分配
Key Vault Secrets User或对应权限的角色,避免访问策略与RBAC冲突
3. 确认集群的托管身份配置正确性
- 检查Terraform代码中是否正确启用系统分配身份,示例配置:
resource "azurerm_machine_learning_compute_cluster" "cluster" { # 其他必要配置... identity { type = "SystemAssigned" } }
- 核对Azure门户中集群“标识”页的对象ID,与Key Vault访问策略中添加的身份ID完全一致
4. 锁定DefaultAzureCredential的凭据来源
进一步排除不需要的凭据类型,强制使用托管身份凭据,避免其他凭据源干扰:
def GetCredentials(): cred = DefaultAzureCredential( additionally_allowed_tenants=['*'], logging_enable=True, exclude_visual_studio_code_credential=True, exclude_shared_token_cache_credential=True, exclude_environment_credential=True, exclude_cli_credential=True, exclude_interactive_browser_credential=True ) cred.get_token("https://vault.azure.net/.default") return cred
5. 利用日志定位深层问题
通过logging_enable=True输出的详细日志,查看具体是哪个凭据类型失败,以及失败的具体原因(如身份未被识别、权限不足等),进一步缩小排查范围
内容的提问来源于stack exchange,提问作者jackc
相关产品推荐
相关产品推荐

