You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Databricks中Deny Assignment导致存储容器无法访问如何解决

解决Azure Databricks系统拒绝分配导致的存储容器访问权限问题

问题分析

你遇到的报错本质是:虽然拥有Microsoft.Storage/storageAccounts/listKeys/action权限,但Azure Databricks自动创建的**系统拒绝分配(Deny Assignment)**阻断了该操作。当你用%fs ls访问挂载的存储时,底层需要获取存储账户密钥生成授权签名,密钥获取失败直接导致身份验证错误。

可行解决方案

1. 改用服务主体(Service Principal)挂载存储(推荐)

这种方式不需要listKeys权限,完全绕开Deny Assignment的限制,步骤如下:

  • 在Azure AD中创建一个服务主体,为其分配目标存储容器的**Blob 数据参与者(Storage Blob Data Contributor)**角色(权限范围限定到容器即可,遵循最小权限原则)。
  • 在Databricks中使用服务主体信息挂载存储,建议用密钥保管库存储敏感信息:
    # 配置OAuth认证参数
    configs = {
        "fs.azure.account.auth.type": "OAuth",
        "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
        "fs.azure.account.oauth2.client.id": "<你的服务主体ID>",
        "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<密钥保管库范围名>", key="<存储服务主体密钥的密钥名>"),
        "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<你的租户ID>/oauth2/token"
    }
    
    # 执行挂载
    dbutils.fs.mount(
        source = "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/",
        mount_point = "/mnt/<你的挂载点>",
        extra_configs = configs
    )
    
  • 挂载完成后,再执行%fs ls /mnt/...即可正常访问。

2. 验证Deny Assignment的适用范围(仅特殊场景可用)

系统创建的Deny Assignment通常无法直接修改或删除,但可以检查其权限范围是否覆盖了你的存储账户:

  • 进入Azure门户的存储账户→访问控制(IAM)→拒绝分配,找到对应的Databricks系统拒绝规则。
  • 如果该规则的范围是整个Databricks工作区,尝试将存储账户的权限调整为仅针对特定容器,看是否能绕过限制(此方法不保证生效,因系统Deny Assignment优先级高于允许权限)。

关键说明

避免使用基于存储账户密钥的挂载方式,这类方式必须调用listKeys接口,而Deny Assignment直接阻断了该操作——这就是你上传文件成功(可能走了其他权限路径)但无法通过%fs访问的核心原因。

内容的提问来源于stack exchange,提问作者Baba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:56:23