无法通过Terraform设置Databricks账户管理员问题求助
我需要为服务主体设置账户管理员权限,以创建Unity Catalog元存储,使用的Terraform代码如下:
data "databricks_service_principal" "application" { count = var.environment == "dev" ? 1 : 0 application_id = "00000000-0000-0000-0000-000000000000" } resource "databricks_service_principal_role" "account_admin" { count = var.environment == "dev" ? 1 : 0 service_principal_id = data.databricks_service_principal.application[0].id role = "account_admin" }
执行后Terraform返回错误:Error: cannot read service principal role: Service Principal has no role。此外,使用databricks_user_role资源为用户分配account_admin角色时,也会出现类似的User has no role错误。
相关环境:
- Databricks Terraform Provider v1.21(最新版本)
- Databricks工作区部署在Azure上
我查看了Provider源码找到错误信息的位置,但无法理解ReadContext部分的执行逻辑,急需解决该问题以启用Unity Catalog元存储。
1. 确保Provider配置指向账户级别端点
databricks_service_principal_role是账户级别资源,必须保证Terraform Provider配置的是账户级别的端点,而非工作区端点。如果配置指向工作区URL,会导致无法操作账户级别的角色分配。
调整Provider配置为账户级地址:
provider "databricks" { host = "https://accounts.azuredatabricks.net" # Azure账户级别端点 token = var.databricks_account_token }
注意:账户级令牌与工作区令牌不同,需使用拥有账户管理员权限的令牌。
2. 验证服务主体的账户级存在性
确认data.databricks_service_principal.application能正确获取到服务主体ID。可先执行terraform plan查看该数据源的输出,确认ID有效。若服务主体是在工作区而非账户级别创建的,将无法分配账户角色——Unity Catalog元存储要求使用账户级服务主体。
3. 临时规避Provider Read阶段问题
若确认是Provider的ReadContext逻辑bug,可通过lifecycle块跳过Read阶段(仅临时方案,建议后续跟进Provider更新):
resource "databricks_service_principal_role" "account_admin" { count = var.environment == "dev" ? 1 : 0 service_principal_id = data.databricks_service_principal.application[0].id role = "account_admin" lifecycle { ignore_changes = all } }
或执行terraform apply -refresh=false跳过刷新阶段,强制应用配置。
4. 调整Provider版本
尽管使用的是最新版,但部分版本可能存在已知bug。可尝试降级到v1.20或升级至最新预发布版本,验证问题是否解决。
5. 手动分配角色后让Terraform接管
先通过Databricks账户控制台手动为服务主体分配account_admin角色,再执行terraform plan。若此时无报错,说明是创建角色的逻辑问题,可先手动创建角色,再交由Terraform管理。
内容的提问来源于stack exchange,提问作者Niklas Letz

