【问题标题】:Configuring the Azure AD Databricks SCIM application with Terraform使用 Terraform 配置 Azure AD Databricks SCIM 应用程序
【发布时间】:2022-02-02 19:56:50
【问题描述】:

我正在尝试创建和配置 Azure Databricks SCIM Provisioning Connector,以便我可以从 AAD 在我的 Databricks 工作区中配置用户。

按照these instructions,我可以让它手动工作。也就是说,在 Azure 门户中创建和设置应用程序有效,并且我选择的用户在 Databricks 中同步。 (这个过程并不完全简单。在它做任何事情之前需要进行很多摆弄,我不记得了,需要配置设置。)

当我尝试将其转换为 Terraform 时,我并没有走得太远:

  • 我可以使用创建 Databricks 工作区资源的同一服务主体通过 Terraform 创建应用程序:

    data "azuread_application_template" "scim" {
      display_name = "Azure Databricks SCIM Provisioning Connector"
    }
    
    resource "azuread_application" "scim" {
      display_name = "${var.name}-scim"
      template_id  = data.azuread_application_template.scim.template_id
    
      feature_tags {
        enterprise = true
        gallery    = true
      }
    }
    

    同样,我可以非常轻松地为我的服务主体创建 Databricks 访问令牌:

    resource "databricks_token" "scim" {
      comment = "SCIM Integration"
    }
    
  • 现在我被困住了:

    1. 如何在 Terraform 中定义企业应用程序的用户和组?我没有看到任何看起来合适的 azuread 资源。
    2. 同样,如何在 Terraform 中为企业应用程序配置供应(即,使用 SCIM 端点 URL 和 Databricks 令牌等)?

(旁白:我注意到,在我的 Terraform 创建的应用程序中,如果我继续在 Azure 门户中手动设置用户和配置,它似乎没有做任何事情。我可能不耐烦:“配置on Demand”按钮确实有效,但轮询同步要么什么都不做,要么真的很慢。)

(编辑:旁边的更新:轮询配置——在 Terraform 管理的 SCIM 应用程序上手动设置——自从我写这个问题以来,它现在已经运行了两次。在这一次,它没有同步我的用户手动选择,但决定删除我之前创建的 Databricks 中的“按需供应”用户...)

【问题讨论】:

  • 您的最终目标是什么 - 提供用户?如果是,应该多快?
  • 我的理解是 Databricks SCIM 应用程序将配置用户/组并定期运行以将 Databricks 与您从 AAD 中选择的内容同步。 (如果我错了,请纠正我。)或者,例如,在 Terraform 中读取 AAD 组,然后将这些成员配置为 Databricks 用户,这很简单。但是,如果没有我必须构建的额外机器,这将是一次运行,因此会失去未来 AAD 组成员资格更改的任何自动同步。
  • 您可以简单地触发相同 terraform 的执行(例如在 Azure DevOps 上,其他地方)& 它会配置新用户,删除已删除。这就是我们正在做的事情。您只需要将状态保存在某处,例如在 ADLS 上

标签: azure azure-active-directory terraform azure-databricks scim


【解决方案1】:

我正在尝试自己解决这个难题。

On 1:据我了解,您可以通过 MS Graph 的角色分配来分配用户和组。在此处查看第一个 tf 示例App role assignment for accessing Microsoft Graph

并应用来自Automate SCIM provisioning using Microsoft Graph 的描述配置,例如授予这些权限:

Application.ReadWrite.All
Application.ReadWrite.OwnedBy

第 2 点:似乎无法以编程方式将 Workspace SCIM 端点和令牌馈送到创建的 Azure 应用程序“Azure Databricks SCIM 配置连接器”,因为这些似乎是库应用程序特定的配置参数。因此,恐怕该选项需要手动干预。

根据 Databricks 的说法,AAD SCIM 的完全配置自动化是不可能的。但是 Terraform SCIM 方法将是完全自动化的。示例见:

// define which groups have access to a particular workspace
variable "groups" {
  default = {
    "AAD Group A" = {
      workspace_access      = true
      databricks_sql_access = false
    },
    "AAD Group B" = {
      workspace_access      = false
      databricks_sql_access = true
    }
  }
}

// read group members of given groups from AzureAD every time Terraform is started
data "azuread_group" "this" {
  for_each     = toset(keys(var.groups))
  display_name = each.value
}

// create or remove groups within databricks - all governed by "groups" variable
resource "databricks_group" "this" {
  for_each              = data.azuread_group.this
  display_name          = each.key
  external_id           = each.value.id
  workspace_access      = var.groups[each.key].workspace_access
  databricks_sql_access = var.groups[each.key].databricks_sql_access
}

// read users from AzureAD every time Terraform is started
data "azuread_user" "this" {
  for_each  = toset(flatten([for g in data.azuread_group.this : g.members]))
  object_id = each.value
}

// all governed by AzureAD, create or remove users from databricks workspace
resource "databricks_user" "this" {
  for_each     = data.azuread_user.this
  external_id  = each.value.id
  user_name    = each.value.user_principal_name
  display_name = each.value.display_name
  active       = each.value.account_enabled
}

// put users to respective groups
resource "databricks_group_member" "this" {
  for_each = toset(flatten(
    [
      for group_name in keys(var.groups) :
      [
        for member_id in data.azuread_group.this[group_name].members :
        jsonencode({
          user : member_id,
          group : group_name
        })
      ]
  ]))
  group_id  = databricks_group.this[jsondecode(each.value).group].id
  member_id = databricks_user.this[jsondecode(each.value).user].id
}

【讨论】:

  • 你让它工作了吗,@crypto?我自己对此很感兴趣
猜你喜欢
  • 2022-08-07
  • 2018-07-04
  • 1970-01-01
  • 2019-07-17
  • 2021-10-24
  • 1970-01-01
  • 2015-03-07
  • 2022-07-26
  • 2019-08-12
相关资源
最近更新 更多