分享方式:


使用 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 網站上的命令:驗證

    terraform validate
    
  6. 執行 terraform apply 命令,套用所需的變更以達到組態所需的狀態。 如需詳細資訊,請參閱 Terraform 網站上的命令:套用

    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 工作區的網址。
    • 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 網站上的命令:驗證

    terraform validate
    
  6. 執行 terraform apply 命令,套用所需的變更以達到組態所需的狀態。 如需詳細資訊,請參閱 Terraform 網站上的命令:套用

    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 權杖。 請改用其中一個參與的工具或 SDK 來實作 Databricks 用戶端統一驗證標準。 這些工具和 SDK 會自動為您產生並取代過期 Microsoft Entra ID 權杖,並利用下列 Databricks 驗證類型:

如果您需要手動為 Microsoft Entra ID 服務主體建立 Microsoft Entra ID 權杖,請收集下列資訊,然後遵循使用 Microsoft 身分識別平台 REST API 取得 Microsoft Entra ID 存取權杖使用 Azure CLI 取得 Microsoft Entra ID 存取權杖中的指令:

  • 您 Microsoft Entra ID 服務主體的租用戶 ID,您會在指令中將其用作租用戶識別碼/目錄 (租用戶) 識別碼 / <tenant-id>。 若要取得租用戶識別碼,請參閱在 Azure 入口網站中佈建服務主體
  • 步驟 2 中的 databricks_service_principal_application_id 值,您會在指令中將其用作用戶端識別碼/應用程式 (用戶端) 識別碼 / <client-id>
  • 步驟 1 中的 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 權杖。 請改用其中一個參與的工具或 SDK 來實作 Databricks 用戶端統一驗證標準。 這些工具和 SDK 會自動為您產生並取代過期的 Azure Databricks OAuth 權杖,利用使用 OAuth (OAuth M2M) 透過服務主體對 Azure Databricks 的存取進行驗證

如果您需要為 Microsoft Entra ID 服務主體手動建立 Azure Databricks OAuth 權杖,請參閱手動產生和使用 OAuth M2M 驗證的存取令牌。