使用 Microsoft Entra ID 服務主體的執行作業
作業提供非互動式方式,以在 Azure Databricks 叢集中執行應用程式,例如,應該依排程執行的 ETL 作業或資料分析工作。 這些作業通常會以建立它們的使用者身分執行,但這可能會有一些限制:
- 建立和執行作業取決於具有適當權限的使用者。
- 只有建立作業的使用者才能存取作業。
- 使用者可能會從 Azure Databricks 工作區中移除。
使用服務帳戶—與應用程式,而不是特定使用者相關聯的帳戶—是解決這些限制的常見方法。 在 Azure 中,您可以藉由使用 Microsoft Entra ID 應用程式和服務主體,建立一個服務帳戶。
其中這很重要的範例是當服務主體控制 Azure Data Lake Storage Gen2 帳戶中所儲存資料的存取權時。 使用這些服務主體執行作業可讓作業存取記憶體帳戶中的資料,並提供資料存取範圍的控制權。
本教學課程說明如何建立 Microsoft Entra 應用程式和服務主體,並將該服務主體設為作業的擁有者。 您也將瞭解如何將作業執行權限授與其他不擁有作業的群組。 以下是本教學課程逐步解說的工作概觀:
- 在 Microsoft Entra 識別碼中建立服務主體。
- 在 Azure Databricks 建立個人存取權杖 (PAT)。 您將使用 PAT 對 Databricks REST API 進行驗證。
- 使用 Databricks SCIM API 將服務主體新增為非系統管理使用者至 Azure Databricks。
- 在 Azure Databricks 中建立 Azure Key Vault 支援的密碼範圍。
- 授與服務主體對密碼範圍的讀取權限。
- 在 Azure Databricks 中建立作業,並將作業叢集設定為從密碼範圍讀取密碼。
- 將作業的所有權變更為服務主體。
- 以服務主體身分執行來測試作業。
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶 。
注意
您無法使用已啟用認證傳遞的叢集來執行服務主體所擁有的作業。 如果您的作業需要服務主體存取 Azure 儲存體,請參閱連接到 Azure Data Lake Storage Gen2 和 Blob Storage。
需求
在此教學課程中,您將需要下列項目:
- 具有在 Microsoft Entra ID 租用戶中註冊應用程式所需之權限的使用者帳戶。
- 您將在 Azure Databricks 工作區中執行作業的系統管理權限。
- 向 Azure Databricks 提出 API 要求的工具。 本教學課程使用 cURL,但您可以使用任何可讓您提交 REST API 要求的工具。
在 Microsoft Entra 識別碼中建立服務主體
服務主體是 Microsoft Entra ID 應用程式的身分識別。 若要建立將用來執行作業的服務主體:
- 在 Azure 入口網站中,依序選取 [Microsoft Entra ID]、[應用程式註冊]、[新建註冊]。>> 為應用程式輸入唯一名稱,並按下 [註冊]。
- 移至 [憑證和密碼],按下 [新的用戶端密碼],並產生新的用戶端密碼。 將密碼複製並儲存在安全的地方。
- 移至 [概觀] 並記下 [應用程式 (用戶端) 識別碼] 與 [目錄 (租用戶) 識別碼]。
建立 Azure Databricks 個人存取權杖
您將使用 Azure Databricks 個人存取權杖 (PAT) 向 Databricks REST API 進行驗證。 若要建立可用於提出 API 要求的 PAT:
- 移至您的 Azure Databricks 工作區。
- 在螢幕右上角,按一下您的使用者名稱,然後按一下 [設定]。
- 按一下 [開發人員]。
- 在 [存取權杖] 旁,按一下 [管理]。
- 按一下 [產生新權杖]。
- 複製並儲存該權杖值。
提示
此範例會使用個人存取權杖,但您可以針對大多數 API 使用 Microsoft Entra ID 權杖。 最佳做法是 PAT 適用於系統管理設定工作,但生產工作負載偏好的是 Microsoft Entra ID 權杖。
您可以只針對安全性目的,將 PAT 的產生限制為系統管理員。 如需詳細資訊,請參閱 監視和撤銷個人存取令牌 。
將服務主體新增至 Azure Databricks 工作區
您可以使用 [服務主體 API],將 Microsoft Entra ID 服務主體新增至工作區。 您也必須授與服務主體權限,才能啟動自動化作業叢集。 您可以透過 allow-cluster-create
權限授與此權限。 開啟終端機,並使用 Databricks CLI 執行下列命令來新增服務主體,並授與必要的權限:
databricks service-principals create --json '{
"schemas":[
"urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal"
],
"applicationId":"<application-id>",
"displayName": "test-sp",
"entitlements":[
{
"value":"allow-cluster-create"
}
]
}'
以 Application (client) ID
取代 <application-id>
為 Microsoft Entra ID 應用程式註冊。
在 Azure Databricks 建立 Azure Key Vault 支援的密碼範圍
密碼範圍提供安全儲存和管理密碼。 您將與服務主體相關聯的密碼儲存在密碼範圍中。 您可以將密碼儲存在 Azure Databricks 密碼範圍或 Azure Key Vault 支援的密碼範圍。 這些指示說明 Azure Key Vault 支援的選項:
- 在 Azure 入口網站中建立 Azure Key Vault 執行個體。
- 建立由 Azure Key Vault執行個體支援的 Azure Databricks 密碼範圍。
步驟 1:建立 Azure Key Vault 執行個體
在 Azure 入口網站 中,選取 [金鑰保存庫 >+ 新增],並提供 金鑰保存庫 名稱。
按下 [檢閱 + 建立]。
驗證完成時,按一下 [建立]。
建立金鑰保存庫之後,請移至新金鑰保存庫 的 [屬性] 頁面。
複製並儲存 [保存庫 URI] 和 [資源識別碼]。
步驟 2:建立 Azure Key Vault 支援的密碼範圍
Azure Databricks 資源可以藉由建立金鑰保存庫支援的密碼範圍來參考儲存在 Azure Key Vault 中的密碼。 若要建立 Azure Databricks 密碼範圍:
移至位於
https://<per-workspace-url>/#secrets/createScope
的 [Azure Databricks 建立密碼範圍] 頁面。 針對您的 Azure Databricks 工作,,將per-workspace-url
取代為唯一的個別工作區網址。輸入 [範圍名稱]。
針對您在步驟 1:建立 Azure Key Vault 執行個體建立的 Azure Key Vault,輸入 [保存庫 URI] 和 [資源標識別碼] 。
按一下 [建立]。
在 Azure Key Vault 中儲存用戶端密碼
在 Azure 入口網站中,前往 [金鑰保存庫] 服務。
選取在步驟 1:建立 Azure Key Vault 執行個體中建立的金鑰保存庫。
在 [設定>密碼] 底下,按下 [產生/匯入]。
選取 [手動上傳] 選項,然後在 [值] 欄位中輸入用戶端密碼。
按一下 [建立]。
授與服務主體對密碼範圍的讀取權限
您已建立密碼範圍,並將服務主體的用戶端密碼儲存在該範圍中。 現在,您會提供服務主體存取權,以從密碼範圍讀取密碼。
開啟終端機並使用 Databricks CLI 執行下列命令,:
databricks secrets put-acl <scope-name> <application-id> READ
- 將
<scope-name>
取代為包含用戶端密碼的 Azure Databricks 密碼範圍名稱。 - 以
Application (client) ID
取代<application-id>
為 Microsoft Entra ID 應用程式註冊。
在 Azure Databricks 中建立作業,並將叢集設定為從密碼範圍讀取密碼
您現在已準備好建立可當做新服務主體執行的作業。 您將使用在 Azure Databricks UI 中建立的筆記本,並新增設定以允許作業叢集擷取服務主體的密碼。
移至您的 Azure Databricks 登陸頁面,並選取 [新增>筆記本]。 提供筆記本的名稱,然後選取 [SQL] 做為預設語言。
在筆記本的第一個儲存格中輸入
SELECT 1
。 這是一個簡單的命令,只要成功,就會顯示 1。 如果您已將服務主體存取權授與 Azure Data Lake Storage Gen 2 中的特定檔案或路徑,就可以改為從這些路徑讀取。移至 [工作流程],然後按下 [建立作業]。 為作業和工作指定名稱,按下 [選取筆記本],然後選取您剛才建立的筆記本。
按下 [叢集資訊] 旁的 [編輯]。
在 [設定叢集] 頁面上,按下 [進階選項]。
在 [Spark] 索引標籤上,輸入下列 Spark 組態:
fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net OAuth fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net <application-id> fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net {{secrets/<secret-scope-name>/<secret-name>}} fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net https://login.microsoftonline.com/<directory-id>/oauth2/token
- 將
<storage-account>
取代為包含資料的儲存體帳戶名稱。 - 將
<secret-scope-name>
取代為包含用戶端密碼的 Azure Databricks 密碼範圍名稱。 - 以
Application (client) ID
取代<application-id>
為 Microsoft Entra ID 應用程式註冊。 - 將
<secret-name>
取代為與密碼範圍中用戶端密碼值相關聯的名稱。 - 以
Directory (tenant) ID
取代<directory-id>
為 Microsoft Entra ID 應用程式註冊。
- 將
將作業的所有權變更為服務主體
一個作業只能有一個擁有者,因此必須將作業的所有權從您自己轉移到服務主體。 為了確保其他使用者可以管理作業,您也可以授與 CAN MANAGE 權限給群組。 在此範例中,我們使用權限 API 來設定這些權限。
開啟終端機並使用 Databricks CLI 執行下列命令,:
databricks permissions set jobs <job-id> --json '{
"access_control_list": [
{
"service_principal_name": "<application-id>",
"permission_level": "IS_OWNER"
},
{
"group_name": "admins",
"permission_level": "CAN_MANAGE"
}
]
}'
- 將
<job-id>
取代為作業的唯一識別碼。 若要尋找作業識別碼,請按下側邊欄中的 [工作流程],然後按下作業名稱。 作業 ID 就在 [作業詳細資料] 側面板中。 - 以
Application (client) ID
取代<application-id>
為 Microsoft Entra ID 應用程式註冊。
作業也需要對筆記本的讀取權限。 使用 Databricks CLI 執行下列命令來授與必要的權限:
databricks permissions set notebooks <notebook-id> --json '{
"access_control_list": [
{
"service_principal_name": "<application-id>",
"permission_level": "CAN_READ"
}
]
}'
- 將
<notebook-id>
取代為與作業相關聯的筆記本識別碼。 若要尋找識別碼,請移至 Azure Databricks 工作區中的筆記本,並尋找筆記本 URL 中在notebook/
之後的數字識別碼。 - 以
Application (client) ID
取代<application-id>
為 Microsoft Entra ID 應用程式註冊。
測試作業
您可以使用服務主體來執行作業,就像透過UI、API或 CLI 以使用者身分執行作業一樣。 若要使用 Azure Databricks UI 測試作業:
- 移至 Azure Databricks UI 中的工作流程,然後選取作業。
- 按下 [立即執行]。
如果一切正常執行,您就會看到作業的 [成功] 狀態。 您可以在 UI 中選取作業,以確認輸出:
深入了解
若要深入瞭解如何建立和執行作業,請參閱排程及協調工作流程。