如何用Terraform创建Databricks工作区级服务主体并获取密钥?
Terraform工作区级Databricks服务主体密钥输出解决方案
目前Terraform的Databricks Provider确实没有原生支持工作区级别服务主体的密钥创建与输出——databricks_service_principal_secret资源仅针对账户级操作,这也是你遇到的核心问题。下面提供两种可行的解决思路:
方案1:通过Databricks REST API手动创建并捕获密钥
利用Terraform的local-exec provisioner调用工作区的SCIM API创建密钥,然后将结果写入文件并输出:
resource "databricks_service_principal" "sp" { provider = databricks.workspace display_name = "My service principle" databricks_sql_access = true } # 用本地文件临时存储密钥(避免直接在控制台输出) resource "local_file" "sp_secret_store" { filename = "${path.module}/sp_secret.tmp" content = "" } provisioner "local-exec" { command = <<EOT # 调用SCIM API创建服务主体密钥 curl -s -X POST \ -H "Authorization: Bearer ${var.databricks_workspace_token}" \ -H "Content-Type: application/json" \ https://<你的工作区URL>/api/2.0/preview/scim/v2/ServicePrincipals/${databricks_service_principal.sp.id}/credentials \ -d '{"schemas":["urn:ietf:params:scim:schemas:core:2.0:Credential"],"type":"password"}' | \ jq -r '.value' > ${local_file.sp_secret_store.filename} EOT } # 输出密钥,标记为敏感信息防止泄露 output "service_principal_secret" { value = file(local_file.sp_secret_store.filename) sensitive = true }
使用时注意:
- 替换
<你的工作区URL>为实际的Databricks工作地址 - 确保环境中安装了
jq用于解析API返回的JSON结果 var.databricks_workspace_token需要是拥有服务主体管理权限的工作区令牌
方案2:切换为账户级别服务主体(若业务允许)
如果你的架构支持,将服务主体创建在账户级别,就能直接使用官方提供的databricks_service_principal_secret资源获取密钥:
resource "databricks_service_principal" "account_sp" { provider = databricks.account display_name = "Account-level Service Principal" } resource "databricks_service_principal_secret" "sp_secret" { provider = databricks.account service_principal_id = databricks_service_principal.account_sp.id } output "account_sp_secret" { value = databricks_service_principal_secret.sp_secret.secret_value sensitive = true }
这是官方推荐的标准流程,能完全通过Terraform管理密钥的生命周期,无需额外API调用。
额外提醒
- 密钥属于敏感数据,所有输出都要加上
sensitive = true,避免在Terraform执行日志或状态文件中泄露 - 方案1中通过API创建的密钥,Terraform不会自动管理其生命周期,销毁服务主体时需要手动清理,或在destroy阶段添加对应的API删除调用
内容的提问来源于stack exchange,提问作者Tim Harsch
相关产品推荐
相关产品推荐

