使用 Terraform 预配服务主体

注意

若要改用 Azure 门户 和 Azure Databricks 用户界面预配 Microsoft Entra ID 托管服务主体,请参阅管理服务主体

Microsoft Entra ID 托管服务主体不同于 Azure 资源托管标识,其也受 Azure Databricks 支持进行身份验证。 要了解如何使用 Azure 资源托管标识(而不是 Microsoft Entra ID 托管服务主体)进行 Azure Databricks 身份验证,请参阅设置和使用 Azure 托管标识身份验证以实现 Azure Databricks 自动化

服务主体是脚本、应用和 CI/CD 平台等自动化工具和系统的标识。 Databricks 建议使用服务主体及其 OAuth 令牌或个人访问令牌,而不是 Azure Databricks 用户帐户和个人访问令牌。 优势包括:

  • 授予和限制不受用户影响的资源访问权限。
  • 使用户能够更好地保护自己的访问令牌。
  • 在不影响其他用户的情况下禁用或删除服务主体。
  • 在用户离开组织时删除该用户,但不影响任何服务主体。

按照以下说明使用 Terraform 在 Azure 中创建 Microsoft Entra ID 托管服务主体,使用 Databricks Terraform 提供程序将 Microsoft Entra ID 服务主体链接到 Azure Databricks 工作区,然后根据需要为服务主体创建 Microsoft Entra ID 令牌或 Azure Databricks OAuth 令牌。

要求

第 1 步:创建服务主体

如果已有可用的 Microsoft Entra ID 托管服务主体,请跳到步骤 2。

  1. 在终端中,创建一个空目录,然后切换到该目录。 (每组单独的 Terraform 配置文件必须在其自己的目录中。)例如:mkdir terraform_azure_service_principal_demo && cd terraform_azure_service_principal_demo

    mkdir terraform_azure_service_principal_demo && cd terraform_azure_service_principal_demo
    
  2. 在此空目录中,创建一个名为 main.tf 的文件。 在此文件中添加以下内容,然后保存文件。

    variable "azure_service_principal_display_name" {
      description = "A display name for the <entra-service-principal>."
      type        = string
    }
    
    terraform {
      required_providers {
        azuread = {
          source  = "hashicorp/azuread"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
    resource "azuread_application" "this" {
      display_name = var.azure_service_principal_display_name
    }
    
    resource "azuread_service_principal" "this" {
      application_id = azuread_application.this.application_id
    }
    
    resource "time_rotating" "month" {
      rotation_days = 30
    }
    
    resource "azuread_service_principal_password" "this" {
      service_principal_id = azuread_service_principal.this.object_id
      rotate_when_changed  = { rotation = time_rotating.month.id }
    }
    
    output "azure_client_id" {
      description = "The Azure AD service principal's application (client) ID."
      value       = azuread_application.this.application_id
    }
    
    output "azure_client_secret" {
      description = "The Azure AD service principal's client secret value."
      value       = azuread_service_principal_password.this.value
      sensitive   = true
    }
    
  3. 在相同目录中,创建名为 terraform.tfvars 的文件。 在该文件中添加以下内容,替换以下值,然后保存文件:

    • azure_service_principal_display_name 值替换为 Microsoft Entra ID 服务主体的显示名称。
    azure_service_principal_display_name = "<A display name for the <entra-service-principal>>"
    
  4. 运行 terraform init 命令来初始化包含 main.tf 文件的工作目录。 有关详细信息,请查看 Terraform 网站上的命令:init

    terraform init
    
  5. 通过运行 terraform validate 命令检查配置中是否存在任何语法错误。 有关详细信息,请查看 Terraform 网站上的命令:validate

    terraform validate
    
  6. 运行 terraform apply 命令应用所需的更改来达到所需的配置状态。 有关详细信息,请查看 Terraform 网站上的命令:apply

    terraform apply
    

创建服务主体后,复制 azure_client_idazure_client_secret 输出值,因为稍后会用到这些值。

要获取 azure_client_secret 值,请查看 terraform.tfstate 文件中 outputs.client_secret.value 的值,该文件位于包含 main.tf 文件的工作目录中。

第 2 步:将服务主体添加到 Azure Databricks 工作区

注意

以下内容说明如何在 Azure Databricks 工作区级别添加服务主体。 如果 Azure Databricks 工作区启用了联合身份验证,则以下内容还会自动将服务主体同步到相关的 Azure Databricks 帐户。

  1. 在终端中,创建一个空目录,然后切换到该目录。 每组单独的 Terraform 配置文件必须在其自己的目录中。 例如: mkdir terraform_databricks_service_principal_demo && cd terraform_databricks_service_principal_demo

    mkdir terraform_databricks_service_principal_demo && cd terraform_databricks_service_principal_demo
    
  2. 在此空目录中,创建一个名为 main.tf 的文件。 在此文件中添加以下内容,然后保存文件。

    variable "databricks_host" {
      description = "The Azure Databricks workspace URL."
      type = string
    }
    
    variable "azure_client_id" {
      type        = string
      description = "The application (client) ID of the <entra-service-principal> to link to an Azure Databricks service principal. This application (client) ID will be the application ID of the Azure Databricks service principal."
    }
    
    variable "databricks_service_principal_display_name" {
      type        = string
      description = "A workspace display name for the Azure Databricks service principal."
    }
    
    terraform {
      required_providers {
        databricks = {
          source = "databricks/databricks"
        }
      }
    }
    
    provider "databricks" {
      host = var.databricks_host
    }
    
    resource "databricks_service_principal" "sp" {
      application_id = var.azure_client_id
      display_name   = var.databricks_service_principal_display_name
    }
    
    output "databricks_service_principal_application_id" {
      value       = databricks_service_principal.sp.application_id
      description = "Application ID of the Azure Databricks service principal."
    }
    
    output "databricks_service_principal_display_name" {
      value       = databricks_service_principal.sp.display_name
      description = "Workspace display name of the Azure Databricks service principal."
    }
    
    output "databricks_workspace_service_principal_id" {
      value       = databricks_service_principal.sp.id
      description = "Workspace ID of the Azure Databricks service principal. This ID is generated by Azure Databricks for this workspace."
    }
    

    注意

    若要将此服务主体添加到组,以及向此服务主体添加权利,请参阅 Terraform 网站上的 databricks_service_principal

  3. 在相同目录中,创建名为 terraform.tfvars 的文件。 在该文件中添加以下内容,替换以下值,然后保存文件:

    • databricks_host 值替换为 Azure Databricks 工作区的 URL。
    • azure_client_id 替换为步骤 1 中的值 azure_client_id
    • databricks_service_principal_display_name 值替换为 Azure Databricks 服务主体的工作区显示名称。
    databricks_host                           = "<The Azure Databricks workspace URL, starting with https://>"
    azure_client_id                           = "<The Azure client ID of the Azure Active AD service principal>"
    databricks_service_principal_display_name = "<A workspace display name for the Azure Databricks service principal>"
    
  4. 运行 terraform init 命令来初始化包含 main.tf 文件的工作目录。 有关详细信息,请查看 Terraform 网站上的命令:init

    terraform init
    
  5. 通过运行 terraform validate 命令检查配置中是否存在任何语法错误。 有关详细信息,请查看 Terraform 网站上的命令:validate

    terraform validate
    
  6. 运行 terraform apply 命令应用所需的更改来达到所需的配置状态。 有关详细信息,请查看 Terraform 网站上的命令:apply

    terraform apply
    

创建服务主体后,复制 databricks_service_principal_application_id 输出值,因为需要使用它创建服务主体的 Microsoft Entra ID 令牌。

(可选)步骤 3:为 Microsoft Entra ID 服务主体创建 Microsoft Entra ID 访问令牌

Databricks 不建议手动为 Microsoft Entra ID 服务主体创建 Microsoft Entra ID 令牌。 这是因为每个 Microsoft Entra ID 令牌的生存期很短,通常在一小时内就会过期。 在此时间之后,必须手动生成替换 Microsoft Entra ID 令牌。 请改用实现 Databricks 客户端统一身份验证标准的参与工具或 SDK 之一。 这些工具和 SDK 可以利用以下 Databricks 身份验证类型,自动生成并替换过期的 Microsoft Entra ID 令牌:

如果需要为 Microsoft Entra ID 服务主体手动创建 Microsoft Entra ID 令牌,请收集以下信息,然后按照使用 Microsoft 标识平台 REST API 获取 Microsoft Entra ID 访问令牌或使用 Azure CLI 获取 Microsoft Entra ID 访问令牌中的说明操作:

  • Microsoft Entra ID 服务主体的租户 ID,将在说明中用作租户 ID/目录(租户)ID / <tenant-id>
  • 步骤 2 中的 databricks_service_principal_application_id 值,将在说明中用作客户端 ID/应用程序(客户端)ID / <client-id>
  • 步骤 2 中的 azure_client_secret 值,将在说明中用作客户端机密/值 / <client-secret>

创建 Microsoft Entra ID 令牌后,复制 access_token 值,因为需要将其提供给脚本、应用程序或系统。

(可选)步骤 4:为 Microsoft Entra ID 服务主体创建 Azure Databricks OAuth 令牌

Databricks 不建议手动为 Microsoft Entra ID 托管服务主体创建 Azure Databricks OAuth 令牌。 这是因为每个 Azure Databricks OAuth 令牌的生存期很短,通常在一小时内就会过期。 在此时间之后,必须手动生成替换 Azure Databricks OAuth 令牌。 请改用实现 Databricks 客户端统一身份验证标准的参与工具或 SDK 之一。 这些工具和 SDK 可利用使用 OAuth (OAuth M2M) 通过服务主体对 Azure Databricks 的访问进行身份验证,自动生成和替换过期的 Azure Databricks OAuth 令牌。 如果需要为 Microsoft Entra ID 服务主体手动创建 Azure Databricks OAuth 令牌,请参阅手动生成和使用 OAuth M2M 身份验证的访问令牌