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
相关产品推荐
相关产品推荐

