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

使用Terraform导入Azure服务主体至Databricks状态遇权限及导入错误

问题分析与解决办法

先搞懂俩问题根源

  • 账户管理员SPN是Databricks的特殊权限账号,Terraform的force=true参数尝试隐式导入时,会触发移除角色的操作,直接触发权限拒绝——毕竟不能动管理员的核心权限。
  • 你用的terraform import命令语法错了:for_each的索引必须是字面量字符串/数字,不能直接塞动态生成的ID,shell会解析出错。

先把导入命令改对

首先找到你local.all_spns里对应这个管理员SPN的each.key(也就是你设的external_id),假设这个key是"7bd75d0e-3305-44a0-xxxx",那导入命令得这么写:

terraform import 'module.gg.module.databricks_groups["groups"].databricks_service_principal.sp["7bd75d0e-3305-44a0-xxxx"]' "479791-xxxx"

注意点:

  • 整个资源路径要用单引号包起来,防止shell把双引号解析乱了
  • 方括号里的字符串必须是local.all_spns里的真实key(就是你定义的external_id值)
  • 最后面的"479791-xxxx"是Databricks里这个SPN的对象ID,不是Azure AD的应用ID

再调整Terraform配置

导入成功后,改资源配置避免后续踩坑:

  • 删掉force=true,管理员SPN不需要强制导入,反而容易搞出危险操作
  • 把display_name改成带环境标识的,比如拼上dev/prd/shd:display_name = "${local.all_spns[each.key]["display_name"]}-${var.environment}"
  • 加个skip_role_assignment = true(只要你的databricks provider版本支持),让Terraform别碰管理员的角色权限

调整后的代码示例:

resource "databricks_service_principal" "sp" {
  provider       = databricks.azure_account
  for_each       = local.all_spns
  application_id = local.all_spns[each.key]["application_id"]
  display_name   = "${local.all_spns[each.key]["display_name"]}-${var.environment}"
  active         = local.all_spns[each.key]["account_enabled"]
  external_id    = each.key
  skip_role_assignment = true # 禁止修改管理员角色,避免权限报错
}

最后验证执行

  1. 导入完跑terraform plan,确认只有显示名称的变更计划,没有其他危险操作
  2. 执行terraform apply,就能完成显示名称的修改,不会碰管理员的权限或者删除SPN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:22:43