我正在尝试创建和配置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" }
-
现在我被卡住了:
- 如何在Terraform中定义企业应用程序的用户和组?我看不到任何看起来合适的
azuread
资源 - 同样,我如何在Terraform中配置企业应用程序的供应(即,使用SCIM端点URL和Databricks令牌等(
- 如何在Terraform中定义企业应用程序的用户和组?我看不到任何看起来合适的
(此外:我注意到,在我的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
}