使用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 # 禁止修改管理员角色,避免权限报错 }
最后验证执行
- 导入完跑
terraform plan,确认只有显示名称的变更计划,没有其他危险操作 - 执行
terraform apply,就能完成显示名称的修改,不会碰管理员的权限或者删除SPN
内容的提问来源于stack exchange,提问作者play_something_good
相关产品推荐
相关产品推荐

