在Azure上部署多个数据块工作区时如何配置Terraform数据块提供程序

hc2pp10m  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(146)

对于我当前的项目,我已经使用Terraform在Azure上部署了一个Databricks工作区,并且我正在尝试创建一个额外的工作区。我的代码存储库基于几个模块,并且我希望使用Terraform向我的Azure订阅添加额外的工作区。但是,事情并没有按照我希望的方式发展,因为我无法为不同的工作空间创建集群。创建数据块工作空间不是问题,创建相关的数据块提供程序资源才是问题。
目录结构(我有其他模块,但没有包括在内,因为它们与此问题无关):

.
 |-config
 | |-dev.tfvars
 |-main.tf
 |-outputs.tf
 |-providers.tf
 |-variables.tf
 |-modules
 | |-db-cluster
 | | |-main.tf
 | | |-outputs.tf
 | | |-variables.tf
 | |-dbw
 | | |-main.tf
 | | |-outputs.tf
 | | |-variables.tf
 | |-network
 | | |-main.tf
 | | |-outputs.tf
 | | |-variables.tf

利用这些模块,我使用main.tf根文件夹中的www.example.com文件来确定模块,然后这些模块将创建(基于诸如count之类的东西)相关的资源。
例如,在下面的main.tf文件中,我们确定了数据块工作区模块(dbw)和数据块集群模块(db-cluster)。

# ./main.tf file in the root module
# Databricks workspace
module "dbw-default" {
  count                                 = length(var.dbw-names)
  source                                = "./modules/dbw"
  dbw-name                              = var.dbw-names[count.index]
  dbw-project                           = var.project
  dbw-env                               = var.env
  dbw-resource-group-name               = module.rg-default[index(var.rg-names, "databricks")].name
  dbw-location                          = var.location
  dbw-sku                               = var.dbw-sku
  dbw-tags                              = merge(var.tags, { "purpose" = "databricks", "env" = var.env })
}
# Databricks Cluster
module "db-cluster-default" {
  source             = "./modules/db-cluster"
  db-cluster-name    = var.db-cluster-name
  db-cluster-env     = var.env
  db-cluster-project = var.db-cluster-project

  db-cluster-tags                    = merge(var.tags, { "purpose" = "databricks", "env" = var.env })
  db-cluster-min-workers             = var.db-cluster-min-workers
  db-cluster-max-workers             = var.db-cluster-max-workers
  db-cluster-autotermination-minutes = var.db-cluster-autotermination-minutes

}

这与main.tfdbw模块中的www.example.com(如下所述)一起使用azure_rm提供程序创建了databricks工作区。

# ./modules/dbw/main.tf
resource "azurerm_databricks_workspace" "default" {
  name                = format("dbw-%s-%s-%s", var.dbw-name, var.dbw-project, var.dbw-env)
  resource_group_name = var.dbw-resource-group-name
  location            = var.dbw-location
  sku                 = var.dbw-sku
  tags = var.dbw-tags
}

最后是databricks集群模块,其中再次指定了provider。

# ./modules/db-cluster/main.tf
terraform {
  required_providers {
    databricks = {
      source  = "databricks/databricks"
      version = "~> 1.6"
    }
  }
}

resource "databricks_cluster" "shared_autoscaling" {
  cluster_name            = format("db-cluster-%s-%s", var.db-cluster-project, var.db-cluster-env)
  spark_version           = data.databricks_spark_version.latest_lts.id
  node_type_id            = data.databricks_node_type.smallest.id
  autotermination_minutes = var.db-cluster-autotermination-minutes
  autoscale {
    min_workers = var.db-cluster-min-workers
    max_workers = var.db-cluster-max-workers
  }
}

这与根模块中的providers块相关:

# ./providers.tf
# providers and versions
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.29"
    }
    databricks = {
      source  = "databricks/databricks"
      version = "~> 1.6"
    }
  }

  backend "azurerm" {
    #   environment variables are available from YAML pipeline to authenticate using service principal.
  }
}

provider "azurerm" {
  features {}
}

provider "databricks" {
  azure_workspace_resource_id = module.dbw-default.id
}

所以当我在module.dbw-default.id这个provider块中把www.example.com改成module.dbw-default[0].id的时候,我没有成功。完全忽略这里的引用,只在db-cluster模块级别使用它也没有成功。我得到了下面的错误信息:

Error: cannot read cluster: cannot configure azure-client-secret auth: cannot get workspace: please set `azure_workspace_resource_id` provider argument.

首先我尝试引用module.dbw-default[0].id,并尝试了几种不同的方法,但都不起作用。此外,我尝试将数据库的terraform提供程序块移到db-cluster模块,并将dbw-id传递到提供程序中引用。但这也不起作用。我将非常感谢任何帮助!我想强调的是,当使用单个工作空间时,这一切都工作得很好,但不再使用多个工作空间。
一开始我试着引用模块.dbw-default[0].id并尝试了几种变体,但都不起作用。此外,我试着将数据块的terraform提供程序块移到db-cluster模块,但也不起作用。

xoefb8l8

xoefb8l81#

好吧,这让我有点困惑。简短的回答是,不可能动态地设置提供者。这意味着使用for_each指定数据库工作区意味着您不能为这些工作区动态地创建集群(或为它们配置其他任何东西)。这与Terraform的配置方式有关。有关详细信息,请参阅GitHub问题here
现在该如何前进:如果工作空间的数量有限,我们可以通过简单地复制根文件www.example.com中的代码块来显式定义它们(例如dbw-default-firstdbw-default-second)main.tf。然后在providers.tf文件中,我们可以使用不同的别名列出数据库提供程序的多个副本:

provider "databricks" {
  alias                       = "first"
  azure_workspace_resource_id = module.dbw-default-first.id
}

provider "databricks" {
  alias                       = "second"
  azure_workspace_resource_id = module.dbw-default-second.id
}

然后,在www.example.com文件中配置群集或其他数据库设置时main.tf,我们添加特定的提供程序:

providers = {
  databricks = databricks.first
}

类似地,也将其添加到第二个数据块集群中。这种解决方案的不幸之处在于,我们必须对每个副本进行硬编码,这是一个丑陋的解决方案。不幸的是,这是唯一可行的选择,因为我们不能动态地指定它。

相关问题