使用 Terraform 在 Azure Databricks 中通过 AAD 直通安装 ADLS gen2

Mounting ADLS gen2 with AAD passthrough in Azure Databricks with Terraform

我正在尝试使用 Databricks Terraform 提供程序通过 Azure Active Directory 直通将我的 ADLS gen2 存储容器装载到 DBFS 中。我正在按照说明进行操作 here and here,但是当 Terraform 尝试部署挂载资源时出现以下错误:

Error: Could not find ADLS Gen2 Token

我的 Terraform 代码如下所示(它与提供商文档中的示例非常相似)并且我正在使用 Azure 服务主体进行部署,它在同一模块中创建 Databricks 工作区:

provider "databricks" {
  host                        = azurerm_databricks_workspace.this.workspace_url
  azure_workspace_resource_id = azurerm_databricks_workspace.this.id
}

data "databricks_node_type" "smallest" {
  local_disk = true

  depends_on = [azurerm_databricks_workspace.this]
}

data "databricks_spark_version" "latest" {
  depends_on = [azurerm_databricks_workspace.this]
}

resource "databricks_cluster" "passthrough" {
  cluster_name            = "terraform-mount"
  spark_version           = data.databricks_spark_version.latest.id
  node_type_id            = data.databricks_node_type.smallest.id
  autotermination_minutes = 10
  num_workers             = 1

  spark_conf = {
    "spark.databricks.cluster.profile"                = "serverless",
    "spark.databricks.repl.allowedLanguages"          = "python,sql",
    "spark.databricks.passthrough.enabled"            = "true",
    "spark.databricks.pyspark.enableProcessIsolation" = "true"
  }

  custom_tags = {
    "ResourceClass" = "Serverless"
  }
}

resource "databricks_mount" "mount" {
  for_each = toset(var.storage_containers)

  name       = each.value
  cluster_id = databricks_cluster.passthrough.id
  uri        = "abfss://${each.value}@${var.sa_name}.dfs.core.windows.net"

  extra_configs = {
    "fs.azure.account.auth.type"                   = "CustomAccessToken",
    "fs.azure.account.custom.token.provider.class" = "{{sparkconf/spark.databricks.passthrough.adls.gen2.tokenProviderClassName}}",
  }

  depends_on = [
    azurerm_storage_container.data
  ]
}

(为了清楚起见,azurerm_storage_container.data 是一组名称来自 var.storage_containers 的存储容器,它们是在 azurerm_storage_account 中创建的,名称为 var.sa_name;因此URI.)

我觉得这个错误是我根本性的误解造成的,而不是简单的遗漏。我的基本假设是,我可以使用 AAD 直通为工作区安装存储容器,作为我部署整个基础结构时的便利。也就是说,每当用户开始使用工作区时,任何新的直通集群都可以零设置地使用这些挂载。

我可以按照 AAD 直通指令手动挂载存储容器:启动一个启用直通的高并发集群,然后使用 dbutils.fs.mount 挂载。这是在使用我的用户身份(而不是服务主体)登录到 Databricks 工作区时。这是问题的根源吗?服务主体是否不适合这项任务?

(有趣的是,如果我尝试使用未启用直通的集群访问手动创建的装载上的文件,Databricks 运行时会给我完全相同的错误。)

是的,这是由于为该操作使用服务主体而引起的问题。 Azure docs for credentials passthrough says:

You cannot use a cluster configured with ADLS credentials, for example, service principal credentials, with credential passthrough.