Azure Databricks通过Key Vault访问Blob Storage遇权限拒绝问题求助
问题概述
在Azure Databricks Notebook(Python)中通过Azure Key Vault获取Blob Storage凭证时,触发权限拒绝错误:
(Forbidden) The user, group or application 'appid=-" ;iss=https://sts.windows.net//' does not have secrets get permission on key vault 'Key;location=eastus'.
Code: Forbidden
Message: The user, group or application 'appid=;oid=*****;iss=https://sts.windows.net/***/' does not have secrets get permission on key vault '****Key;location=eastus'.
Inner error: {
"code": "AccessDenied"
}
已在Databricks中配置Secret Scope,访问策略截图如下:
使用的Python代码:
from azure.identity import DefaultAzureCredential from azure.keyvault.secrets import SecretClient from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient import pandas as pd import io import pyspark.sql from datetime import datetime, timedelta # Key Vault配置 key_vault_name = '***key' secret_name = '******' credential = DefaultAzureCredential() secret_client = SecretClient(vault_url=f"https://{key_vault_name}.vault.azure.net/", credential=credential) # 获取Blob Storage凭证 storage_account_name = secret_client.get_secret('storage-account-name').value storage_account_access_key = secret_client.get_secret('storage-account-access-key').value container_name = '****' refined_container_name = '****' connection_string = secret_client.get_secret(secret_name).value print('storage_account_name = ',storage_account_name) print('storage_account_access_key = ',storage_account_access_key) print('connection_string = ', connection_string)
解决步骤
1. 为错误中的身份配置Key Vault访问权限
错误信息中的appid/oid是当前访问Key Vault的身份,需为其添加**机密读取(Get)**权限:
- 登录Azure门户,进入目标Key Vault
- 进入「访问策略」→「添加访问策略」
- 在「机密权限」中勾选「Get」(按需添加其他必要权限)
- 在「选择主体」中搜索错误里的
appid或oid对应的身份(可能是Databricks工作区服务主体或当前用户) - 保存配置
2. 验证Databricks Secret Scope配置
若使用的是Azure Key Vault-backed Secret Scope:
- 在Databricks工作区进入「管理控制台」→「Secret Scopes」
- 确认Scope关联的Key Vault名称、资源ID正确
- 检查Scope的权限设置,确保执行Notebook的身份有访问该Scope的权限
3. 改用Databricks内置方式获取凭证(推荐)
无需直接调用Key Vault SDK,通过dbutils直接读取Secret Scope中的凭证,简化权限管理:
# 替换为你的Secret Scope名称 scope_name = "your-secret-scope" storage_account_name = dbutils.secrets.get(scope=scope_name, key="storage-account-name") storage_account_access_key = dbutils.secrets.get(scope=scope_name, key="storage-account-access-key") connection_string = dbutils.secrets.get(scope=scope_name, key=secret_name)
4. 等待权限同步并验证
修改访问策略后,等待1-2分钟让Azure权限同步,重新运行Notebook确认问题是否解决。
内容的提问来源于stack exchange,提问作者Snooper_A

