使用Terraform配置Azure AD Databricks SCIM应用程序



我正在尝试创建和配置Azure Databricks SCIM配置连接器,这样我就可以从AAD在我的Databricks工作区中配置用户。

按照这些说明,我可以手动使其工作。也就是说,在Azure Portal中创建和设置应用程序是有效的,我选择的用户在Databricks中同步。(这个过程并不完全简单。在做任何事情之前,都需要对配置设置进行大量的篡改,我不记得了。(

当我试图将其转换为Terraform时,我并没有走多远:

  • 我可以使用Terraform创建应用程序,使用创建Databricks Workspace资源的相同服务主体:

    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 Portal中手动设置用户和配置,它似乎什么都不会做。我可能很不耐烦:"按需配置"按钮确实有效,但轮询的同步要么什么都不做,要么非常慢。(

(编辑:附带更新:自我写下这个问题以来,在Terraform管理的SCIM应用程序上手动设置的轮询配置已经运行了两次。在这段时间里,它没有同步我手动选择的用户,而是决定删除我之前创建的Databricks中的"按需配置"用户…(

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

关于1:根据我的理解,您可以通过MS Graph通过角色分配来分配用户和组。请参阅此处的第一个tf示例用于访问Microsoft Graph、的应用程序角色分配

并使用Microsoft Graph应用自动化SCIM配置中描述的配置,例如授予以下权限:

Application.ReadWrite.All
Application.ReadWrite.OwnedBy

关于2:似乎不可能以编程的方式将Workspace SCIM端点和令牌馈送到创建的Azure应用程序中;Azure Databricks SCIM Provisioning Connector";,因为这些似乎是画廊应用程序特定的配置参数。所以我担心这个选项需要手动干预。

根据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
}

最新更新