使用 Terraform 在 Azure Databricks 中通过 AAD 直通安装 ADLS gen2
Mounting ADLS gen2 with AAD passthrough in Azure Databricks with Terraform
-
azure-active-directory
-
terraform
-
azure-databricks
-
azure-data-lake-gen2
-
terraform-provider-databricks
我正在尝试使用 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.
azure-active-directory
terraform
azure-databricks
azure-data-lake-gen2
terraform-provider-databricks
我正在尝试使用 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.