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

Terraform部署Azure Databricks全局初始化脚本首次出现HTTP503凭证缺失错误

解决Azure Databricks全局初始化脚本部署的503凭证缺失问题

问题场景

通过Terraform部署带专用端点的Azure Databricks工作区,使用现有服务主体认证,全局初始化脚本已配置depends_on依赖工作区和专用端点,但首次执行terraform apply时,创建初始化脚本返回503错误:

< HTTP/2.0 503 Service Unavailable
< {
<   "error_code": "TEMPORARILY_UNAVAILABLE",
<   "message": "Missing credentials to access Azure container"
< }

等待数分钟后再次执行terraform apply即可成功,推测是Azure内部权限传播延迟导致。

解决方案

1. 添加工作区就绪检查

通过null_resource结合local-exec编写轮询脚本,确认Databricks内部权限同步完成后再部署初始化脚本。由于使用专用端点,需强制请求指向专用IP:

resource "null_resource" "wait_for_databricks_ready" {
  depends_on = [azurerm_databricks_workspace.main, azurerm_private_endpoint.databricks]

  provisioner "local-exec" {
    command = <<EOT
      PRIVATE_IP="${azurerm_databricks_workspace.main.private_endpoint_connection[0].private_ip_address}"
      WORKSPACE_URL="${azurerm_databricks_workspace.main.workspace_url}"
      
      # 轮询Databricks工作区状态API,直到返回成功
      until curl -s -f \
        --connect-to ::${PRIVATE_IP}:443 \
        --header "Authorization: Bearer $(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --query accessToken -o tsv)" \
        https://${WORKSPACE_URL}/api/2.0/workspace-status; do
        echo "等待Databricks权限同步完成... 30秒后重试"
        sleep 30
      done
    EOT
  }
}

# 全局初始化脚本依赖就绪检查
resource "databricks_global_init_script" "main" {
  depends_on = [null_resource.wait_for_databricks_ready]
  
  enabled = true
  name = "the-init-script.sh"
  position = 0
  script = base64encode(file("${path.module}/the-init-script.sh"))
}

注:2ff814a6-3304-4ab8-85cb-cd0e6f879c1d是Databricks服务的固定资源ID,用于获取合法认证令牌。

2. 显式依赖存储容器权限分配

如果服务主体被分配了Databricks关联存储容器的角色(如Storage Blob Data Contributor),需确保角色分配完全生效后再部署脚本:

# 服务主体对存储容器的角色分配
resource "azurerm_role_assignment" "databricks_storage_access" {
  scope                = azurerm_storage_container.databricks_init_scripts.id
  role_definition_name = "Storage Blob Data Contributor"
  principal_id         = var.sp_object_id
  
  depends_on = [azurerm_databricks_workspace.main]
}

# 初始化脚本同时依赖角色分配和专用端点
resource "databricks_global_init_script" "main" {
  depends_on = [azurerm_role_assignment.databricks_storage_access, azurerm_private_endpoint.databricks]
  
  # 其他配置...
}

3. 配置Databricks Provider自动重试

在Databricks Provider中增加重试参数,让Provider自动处理临时的503错误:

provider "databricks" {
  host                          = azurerm_databricks_workspace.main.workspace_url
  azure_workspace_resource_id   = azurerm_databricks_workspace.main.id
  client_id                     = var.sp_client_id
  client_secret                 = var.sp_client_secret
  tenant_id                     = var.tenant_id
  
  # 配置重试策略
  retry_max                     = 12  # 最多重试12次
  retry_wait_min                = 30  # 每次重试间隔30秒
  retry_wait_max                = 60
}

原因说明

Terraform的depends_on仅检查资源是否完成创建,无法感知Azure内部的权限同步延迟。Databricks工作区创建后,后台需要将服务主体的权限同步到关联的存储容器(用于存储全局初始化脚本),这个过程通常需要2-5分钟,首次部署时脚本触发过早就会出现凭证缺失的503错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:20:30