You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Databricks模型服务端点使用服务主体调用返回403“Unauthorized access to workspace”权限问题求助

Databricks模型服务端点使用服务主体调用返回403“Unauthorized access to workspace”权限问题求助

看起来你遇到的核心问题是账号级的服务主体(SP)默认没有目标工作区的访问权限——虽然你给模型端点开了“所有工作区用户可查询”,但这个权限是针对“工作区用户”生效的,而你的SP还没被添加到工作区里,自然无法继承这个权限规则。下面是具体的解决步骤:

1. 先把服务主体关联到目标工作区

服务主体是账号级的资源,必须显式添加到你的目标工作区,才能访问工作区内的所有资源(包括模型服务端点):

  • 登录目标工作区的Databricks UI,点击右上角用户头像 → 选择「管理员设置」
  • 进入「身份管理」→「服务主体」页面,找到你用来调用的那个SP(通过client_id或者名称识别)
  • 点击SP右侧的「添加到工作区」按钮,完成关联(需要工作区管理员权限操作)

2. 给SP分配工作区基础权限

因为你端点的权限规则是“所有工作区用户可查询”,所以SP需要先获得「工作区用户」角色,才能触发这个规则:

  • 还是在管理员设置里,进入「权限」→「工作区权限」页面
  • 找到刚添加的SP,点击「分配权限」,选择「工作区用户」角色并保存(不需要更高的管理员权限,这个角色足够满足查询模型端点的需求)

3. (可选但推荐)优化Token获取方式

你当前用的是账号级的Token端点,虽然理论上只要SP在工作区有身份就能用,但换成工作区级的Token端点,获取的Token会直接绑定到目标工作区,能避免跨工作区的权限歧义:

def databricks_token():
    # 替换成你的工作区host
    token_url = f"https://{WORKSPACE_HOST}.cloud.databricks.com/oidc/v1/token"
    scope = "all-apis"
    data = {
        "grant_type": "client_credentials",
        "client_id": CLIENT_ID,
        "client_secret": CLIENT_SECRET,
        "scope": scope,
    }
    response = requests.post(token_url, data=data)
    token_data = response.json()
    access_token = token_data["access_token"]
    return access_token

4. 验证权限是否生效

完成上述步骤后,建议等1-2分钟让权限同步,再测试你的score_model()函数。如果还是有疑问,可以用Databricks CLI快速验证权限:

# 先配置CLI用SP的Token登录
databricks configure --token --host https://{WORKSPACE_HOST}.cloud.databricks.com
# 输入你获取的access_token
# 然后测试访问端点
databricks serving-endpoints get --name {MODEL_SERVING_ENDPOINT_NAME}

如果这个命令能正常返回端点信息,说明权限已经生效,再跑你的Python代码就应该能成功调用了。

排坑提醒

  • 确保你用的client_idclient_secret对应已经添加到工作区的那个SP,不要搞混账号下的其他SP
  • 不要给SP分配不必要的高权限,「工作区用户」+ 端点的“所有工作区用户可查询”完全满足需求
  • 刚操作完就测试可能会遇到权限同步延迟,等几分钟再试即可

做完这些步骤后,你的score_model()调用应该就能正常返回结果,403的权限问题也会解决。

火山引擎 最新活动