在 Azure Batch 帳戶或集區中使用受控識別
本文說明如何在Microsoft Azure Batch 帳戶或批次集區中使用受控識別。 本文討論何時應該在批次帳戶中設定受控識別與批次集區。 它也概述不同的行為案例,因為受控識別的使用可能會導致某些失敗情況的混淆。
必要條件
設定您的記憶體帳戶以搭配您的批次帳戶使用
如果您想要在批次帳戶中設定受控識別,您必須先設定記憶體帳戶,使其用來作為批次帳戶自動記憶體。 這個自動記憶體可用來儲存應用程式套件和工作資源檔。 若要設定自動記憶體,您必須將記憶體帳戶連結至批次帳戶。 您也必須將自動記憶體帳戶設定為使用批次帳戶受控識別作為其驗證模式。
若要完成此設定,請遵循下列步驟:
在 Azure 入口網站 中,搜尋並選取 [Batch 帳戶]。
在批次帳戶清單中,選取批次帳戶的名稱。
在批次帳戶的瀏覽窗格中,找出 [ 設定 ] 標題,然後選取 [ 儲存體帳戶]。
在 [ 記憶體帳戶資訊] 區段底下,選取 [ 選取記憶體帳戶]。
選取記憶體帳戶之後,請返回 [記憶體帳戶資訊] 區段,並將 [驗證模式] 欄位變更為 [Batch 帳戶受控識別]。
在您的批次帳戶中設定受控識別
注意
本節所討論的互動是在批次帳戶與 Azure 儲存體 或 Azure 金鑰保存庫 之間。 如需批次節點與其他 Azure 資源之間的互動,請參閱下一節(在您的批次集區中設定受控識別)。
藉由在批次帳戶上設定受控識別,您可以授與批次帳戶只向其他服務驗證的許可權。 此設定不會讓您向批次節點或批次集區虛擬機 (VM) 進行驗證。
當您在批次帳戶中設定受控識別時,有兩個選項:啟用系統指派的受控識別,或 為批次帳戶建立個別的使用者指派受控識別 。
若要在您的批次帳戶中設定受控識別,請遵循下列步驟:
在 Azure 入口網站 中,搜尋並選取 [Batch 帳戶]。
在批次帳戶清單中,選取批次帳戶的名稱。
在批次帳戶的瀏覽窗格中,找出 [ 設定 ] 標題,然後選取 [ 身分識別]。
在 [ 身分識別類型 ] 標題中,選取 [ 系統指派 ] 或 [使用者指派的受控識別] 或 [使用者指派 的受控識別]。
完成此設定之後,請返回批次帳戶的概觀頁面。 在頁面的 [ 基本資訊] 區段中,選取 [ JSON 檢視]。 受控識別的 JSON 表示會以下列其中一種格式顯示:
系統指派的受控識別
"identity": { "principalId": "<principal-guid>", "tenantId": "<tenant-guid>", "type": "SystemAssigned" }
使用者指派的受控識別
"identity": { "type": "UserAssigned", "userAssignedIdentities": { "/subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name>": { "principalId": "<principal-guid>", "clientId": "<client-guid>" } } }
使用受控識別來存取您的自動記憶體帳戶
批次帳戶的受控識別功能將用於特定工作,例如將應用程式套件上傳至您的批次帳戶。 若要上傳應用程式套件,請移至 Azure 入口網站 中的批次帳戶概觀頁面,選取 [應用程式>新增],然後依照入口網站指示完成上傳。 Azure Batch 會將應用程式套件儲存在其自動記憶體帳戶中。 因為您先前將批次帳戶的驗證模式設定為 Batch 帳戶受控識別,因此系統會從批次帳戶的受控識別擷取認證,以存取自動記憶體帳戶。
您可能需要檢查受控識別是否具有自動記憶體帳戶的足夠許可權。 若要檢查這些許可權,請遵循下列步驟:
在 Azure 入口網站 中,搜尋並選取 [記憶體帳戶]。
在記憶體帳戶清單中,選取自動記憶體帳戶的名稱。
在記憶體帳戶的瀏覽窗格中,選取 [存取控制 [IAM]。
在 [存取控制 (IAM) 頁面上,選取 [檢查存取權] 按鈕。
在 [ 檢查存取] 窗格中,選取 [ 受控識別 ] 選項。
在 [ 受控識別 ] 字段中,選取您要檢視許可權的受控識別。
在 [ 目前角色指派] 索引標籤中 ,檢查是否有指派的角色有足夠的許可權可上傳應用程式套件。 如果沒有這類角色指派,當您嘗試將應用程式套件上傳至批次帳戶時,下列錯誤訊息會出現在 Azure 入口網站 通知中:
上傳套件名稱>的錯誤<.zip
檔案上傳在上傳期間發生非預期的錯誤。
如果您遇到此上傳錯誤,請檢查上傳要求的 HTTP 封存 (.har) 檔案。 將會有一個 POST 要求,其中包含 名稱前置 batch
詞 (例如 batch?api-version=2020-06-01
),您會看到 HTTP 狀態為 200。 在承載中,您會注意到傳送至批次帳戶的實際 PUT 要求。 PUT 要求的回應會顯示 HTTP 狀態 409。 完整的錯誤回應會類似下列文字:
{responses: [{name: "<response-guid>", httpStatusCode: 409,...}]}
{responses: [{name: "<response-guid>", httpStatusCode: 409,...}]}
0: {name: "<response-guid>", httpStatusCode, 409,...}
content: {error: {code: "AutoStorageNoPermission",...}}
error: {code: "AutoStorageNoPermission",...}
code: "AutoStorageNoPermission"
message: "The managed identity does not have permission to access auto storage account. Please use Azure RBAC to assign the managed identity access to auto storage."
target: "BatchAccount"
contentLength: 318
此錯誤表示批次帳戶中系統指派或使用者指派的受控識別沒有足夠的許可權可對自動記憶體帳戶採取動作。
使用受控識別來存取金鑰保存庫
如需如何使用受控識別來存取 Azure 金鑰保存庫 的相關信息,請參閱使用 Azure 金鑰保存庫 和受控識別設定 Azure Batch 帳戶的客戶自控密鑰。
在您的批次集區中設定受控識別
注意
本節所討論的互動位於批次節點與其他 Azure 資源之間。 如需批次帳戶與 Azure 儲存體 或 Azure 金鑰保存庫 之間的互動,請參閱上一節(在您的批次帳戶中設定受控識別)。
如果您想要允許 Azure Batch 節點存取其他 Azure 資源,請使用在 Azure Batch 集區中設定的受控識別。
如果自動記憶體帳戶的驗證模式設定為 Batch 帳戶受控識別,Azure Batch 節點會收到受控識別令牌。 節點會使用受控識別令牌,透過使用 Azure 實例元數據服務 (IMDS) Microsoft Entra 驗證進行驗證。
Azure 批次集區僅支持使用者指派的受控識別版本。 因此,您必須 在與 Azure Batch 帳戶相同的租使用者中建立使用者指派的受控識別 。 此外,您必須將記憶體數據平面的許可權(例如,透過記憶體 Blob 數據擁有者)授與使用者指派的受控識別。
將受控識別與存取自動記憶體帳戶的節點產生關聯
針對計算節點用來存取自動記憶體的使用者指派身分識別,您必須將此身分識別參考指派給具有需要自動記憶體存取之計算節點的集區。 (有關此需求的詳細數據,請參閱 的 REST API 中所述Batch 帳戶 - 属性中的 nodeIdentityReference
Update AutoStorageBaseProperties。因此,您必須在 Azure 入口網站 的兩個位置設定節點身分識別參考:
批次帳戶自動記憶體帳戶中的節點身分識別參考
批次集區中使用者指派的受控識別
重要
您可以在集區身分識別中定義多個使用者指派的受控識別。 不過,節點身分識別參考中定義的節點識別參考也必須在集區身分識別中定義。
設定自動記憶體帳戶的節點身分識別參考
若要在 autostorage 帳戶中設定節點身分識別參考,請遵循下列步驟:
在 Azure 入口網站 中,搜尋並選取 [Batch 帳戶]。
在批次帳戶清單中,選取批次帳戶的名稱。
在批次帳戶的瀏覽窗格中,找出 [ 設定 ] 標題,然後選取 [ 儲存體帳戶]。
在 [ 記憶體帳戶資訊] 區段底下,選取 [ 選取記憶體帳戶],然後選取您的自動記憶體帳戶。
移至 [節點身分識別參考 ] 標題,然後選取 [ 新增]。
完成新增使用者指派節點識別參考的程式。
設定批次集區的使用者指派受控識別
若要在您的批次集區中設定使用者指派的受控識別,請遵循下列步驟:
在 Azure 入口網站 中,搜尋並選取 [Batch 帳戶]。
在批次帳戶清單中,選取批次帳戶的名稱。
在批次帳戶的瀏覽窗格中,找出 [ 功能 ] 標題,然後選取 [ 集區]。
在批次集區頁面中,選取 [ 新增]。
在 [ 新增集區] 頁面中,輸入集 區標識符。 在 [ 身分識別] 欄位中,選取 [ 使用者指派]。
找出 [ 用戶指派的受控識別] 標題,然後選取 [ 新增]。
完成將您先前建立的節點識別參考新增至批次集區的程式。
批次節點中受控識別的使用案例
您可以使用不同方式在批次節點內使用受控識別,例如下列功能:
- 從批次集區下載應用程式套件
- 從批次集區下載工作資源檔
從批次集區下載應用程式套件
當您建立批次集區時,可以在集區層級指定應用程式套件。 應用程式套件將會從 autostorage 帳戶下載,並安裝在此集區的所有節點中。 如需詳細資訊,請參閱 上傳和管理應用程式。 在建立批次集區期間參考應用程式套件之前,請先將應用程式套件上傳至批次帳戶。 若要將應用程式套件新增至批次集區,請移至 批次帳戶的 [新增集 區] 頁面,找出 [選擇性設定 ] 標題,然後選取 [應用程式套件]。
行為案例
本節概述下列受控識別參數的應用程式套件下載狀態和節點作業狀態:
節點身分識別參考中是否提供受控識別
受控識別在自動記憶體帳戶中是否有足夠的許可權
批次集區是使用相同的受控識別還是不同的受控識別來建立
在 Azure 入口網站 中,您可以在批次節點的 [概觀] 頁面中找到節點和套件下載狀態。 若要前往此頁面,請找出 批次集區瀏覽窗格的 [一般 ] 標題,選取 [節點],然後選取您想要查看的節點名稱。
下表概述四個涉及批次集區內受控識別和應用程式套件的行為案例。
案例編號 | 受控識別使用方式 | 自動記憶體帳戶中的受控識別許可權 | 集區建立規格 | 節點狀態 | 套件下載狀態 |
---|---|---|---|---|---|
1 | 在節點身分識別參考中提供 | 足夠的許可權 | 使用相同的受控識別在集區中建立 | 已成功啟動 | 下載至根/應用程式目錄中的節點 |
2 | 在節點身分識別參考中提供 | 權限不足 | 使用相同的受控識別在集區中建立 | 已成功啟動,但處於 閑置 狀態 | 未下載至節點 |
3 | 節點身分識別參考中未指定 | 足夠或沒有足夠的許可權 | 使用相同或不同的受控識別在集區中建立 | 無限期停滯在 [開始 ] 狀態 | 未下載至節點 |
4 | 在節點身分識別參考中提供 | 足夠或沒有足夠的許可權 | 使用不同的受控識別在集區中建立 | 無法使用 狀態 | 未下載至節點 |
在案例 3 中,當 Azure Batch 服務嘗試啟動節點時,節點身分識別參考會變成 Null。 這會導致節點維持在 [開始 ] 狀態。 若要確認此狀態,請移至批次集區節點 [概觀 ] 頁面,然後選取 [上傳批次記錄 ] 以將批次記錄上傳至記憶體容器。 在 [上傳批次記錄] 窗格中,選取您的 Azure 儲存體 容器,選取 [挑選記憶體容器] 按鈕,然後從記憶體容器選取並下載agent-debug.log檔案。 記錄檔將包含多個專案,其中含有「集區尚未完全聯結,health=Status.TvmJoinPoolInProgress」訊息。
在案例 4 中,您可以在建立批次集區時定義多個受控識別。 如果在節點身分識別參考中定義的受控識別未新增至集區身分識別,該怎麼辦? 在此情況下,Azure Batch 服務找不到與節點參考中定義的受控識別相符的正確受控識別。 相反地,服務會顯示下列節點錯誤訊息:
節點有1個錯誤(秒)。
節點上發生錯誤
程序代碼: ApplicationPackageError
訊息:
針對集區指定的一或多個應用程式套件無效
從批次集區下載工作資源檔
當您建立工作時,可以指定要在工作中使用的資源檔。 執行工作命令之前,這些檔案會自動從 autostorage 帳戶下載到節點。 如需詳細資訊,請參閱 Azure Batch 中的工作。 若要指定工作資源檔,請遵循下列步驟:
在 Azure 入口網站 中,搜尋並選取 [Batch 帳戶]。
在批次帳戶清單中,選取批次帳戶的名稱。
在批次帳戶的瀏覽窗格中,找出 [ 功能 ] 標題,然後選取 [ 作業]。
在 [ 作業] 頁面中,選取 [ 新增]。
填寫 [ 新增作業 ] 窗格中的必要字段,然後選取 [ 確定]。
在批次作業的瀏覽窗格中,找出 [ 一般 ] 標題,然後選取 [ 工作]。
在 [工作] 頁面上,選取 [新增]。
在 [ 新增工作] 窗格中,填寫任何必要的欄位。 然後,找出 [ 進階設定] 標題,然後選取 [資源檔]。
您可以使用下表所述的方法來指定資源檔案。
方法 | 注意 |
---|---|
自動儲存容器 | 身分識別參考會顯示為 None,且無法修改。 節點會存取 autostorage 帳戶以擷取資源檔。 |
容器 URL 或 HTTP URL | 如果已在該 Azure 儲存體 帳戶中針對身分識別參考設定足夠的許可權,且身分識別已新增至批次集區,則可以定義另一個 Azure 儲存體 帳戶的 URL。 |
如果您需要自動記憶體帳戶的存取權,則必須在節點身分識別參考和集區身分識別中定義身分識別。
當您指定資源檔案定義時, Blob 前置 詞和 檔案路徑 參數是選擇性的。 Blob 前置詞是用來篩選特定 Blob。 檔案路徑是用來在節點中建立子資料夾來儲存 Blob 檔案。 如果未定義檔案路徑,檔案將會儲存在每個工作的路徑中(root/wd)。
資源檔案類型 | 值 | Blob 前置詞 | 檔案路徑 | 檔案模式 (僅限 Linux) | 身分識別參考 |
---|---|---|---|---|---|
AutoStorageContainerName | <應用程式名稱> | mypath1 | |||
StorageContainerUrl | <https:// account-name.blob.core.windows.net/con> | mypath2 | /subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name> | ||
HttpUrl | <https:// account-name.blob.core.windows.net/con/api.crt> | mypath3 | /subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name> |
行為案例
下表概述使用受控識別建立批次集區時可能發生的四種行為案例,然後建立具有資源檔的工作,以從自動記憶體容器擷取 Blob。
案例編號 | 受控識別使用方式 | 自動記憶體帳戶中的受控識別許可權 | 集區建立規格 | 結果 |
---|---|---|---|---|
1 | 在節點身分識別參考中提供 | 足夠的許可權 | 使用相同的受控識別在集區中建立 | Blob 檔案已成功下載到根目錄/wd/<file-path> 目錄中的節點,如工作概觀頁面所示 |
2 | 在節點身分識別參考中提供 | 權限不足 | 使用相同的受控識別在集區中建立 | 工作 因為 ResourceContainerAccessDenied 錯誤而失敗,錯誤訊息「拒絕其中一個指定 Azure Blob 容器的存取」 |
3 | 節點身分識別參考中未指定 | 足夠或沒有足夠的許可權 | 使用相同或不同的受控識別在集區中建立 | 工作 因為 ResourceContainerAccessDenied 錯誤而失敗,錯誤訊息「拒絕其中一個指定 Azure Blob 容器的存取」 |
4 | 在節點身分識別參考中提供 | 足夠或沒有足夠的許可權 | 使用不同的受控識別在集區中建立 | 工作 因為 ResourceContainerListMiscError 錯誤而失敗,錯誤訊息「列出其中一個指定的 Azure Blob 容器時發生其他錯誤」 |
在 Blob 擷取工作失敗的案例中,移至 Azure 入口網站 的 [工作] 頁面,然後選取錯誤碼旁出現的工作名稱。 然後,在工作頁面的瀏覽窗格中,找出 [ 一般 ] 標題,選取 [屬性],然後選取 [ Json 檢視]。 屬性的 JSON 顯示會顯示對應的錯誤訊息,以及失敗工作的其他詳細數據。 例如,在案例 4 中 ,ResourceContainerListMiscError 錯誤因為「HTTP 400 不正確的要求」錯誤而失敗。 這是因為節點身分識別參考中定義的受控識別不符合集區身分識別組態中定義的任何受控識別。
確認受控識別可以存取 Azure 資源
若要在 Windows 中確認指派 Azure Batch 節點的受控識別有足夠的許可權可存取 Azure 資源(例如記憶體帳戶),請遵循下列步驟:
注意
此程式會模擬您需要執行的最後一個步驟,以取得具有有效身分識別標識符的令牌,以存取記憶體帳戶,並檢查是否有足夠的許可權。 如果未在節點身分識別參考中定義身分識別,則節點無法取得識別標識碼。 在此情況下,您必須先封鎖整個進程,才能執行最後一個步驟。 執行此程式之前,請先確認已在節點身分識別參考中定義身分識別。
使用遠端桌面通訊協定 (RDP) 連線到節點。
在 Postman 中,將包含標頭的
Metadata: true
GET 要求傳送至下列 URL:http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://storage.azure.com/&mi_res_id=/subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name>
169.254.169.254
IP 位址也稱為 Azure 實例元數據服務 (IMDS)。 IMDS 提供 VM 實例的相關信息。 如果您有此 VM 實例資訊,您可以使用 VM 來要求受控識別的令牌。mi_res_id
URL 中的參數值是粗體。 這是您在集區身分識別中定義之使用者指派受控識別的資源識別碼。 若要尋找該資源識別碼,以及用戶端識別碼和主體識別碼,請遵循下列步驟:在 Azure 入口網站 中,搜尋並選取 [Batch 帳戶]。
在批次帳戶清單中,選取批次帳戶的名稱。
在批次帳戶的瀏覽窗格中,找出 [ 功能 ] 標題,然後選取 [ 集區]。
在批次集區清單中,選取批次集區的名稱。
在批次集區的瀏覽窗格中,找出 [ 一般 ] 標題,然後選取 [ 屬性]。
在集區屬性頁面上,選取 [ Json 檢視]。
在 JSON 文字中
identity
/userAssignedIdentities
,找出清單。 針對您使用的使用者指派受控識別,複製下列屬性的值:resourceId
clientId
(GUID)principalId
(GUID)
在 Postman 中傳送 URL 之後, JSON 回應的本文 將包含
access_token
專案(長文字字串,也稱為持有人令牌)和client_id
(GUID)。client_id
回應值應該符合clientId
您從批次集區屬性頁面複製的值。複製完整的持有人令牌,然後從您的 autostorage 帳戶擷取 Blob,以在 Postman 中測試它。 在此範例中,受控識別沒有存取記憶體的許可權。 因此,自動記憶體帳戶會傳回 HTTP 403 錯誤來回應 (AuthorizationPermissionMismatch 錯誤,訊息「此要求未獲授權使用此許可權執行這項作業」。
注意
需要 x-ms-version 標頭才能擷取 Blob。 如需詳細資訊,請參閱取得 Blob API Azure 儲存體。
協力廠商資訊免責聲明
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。
協力廠商連絡資訊免責聲明
Microsoft 提供協力廠商連絡資訊,以協助您尋找有關此主題的其他資訊。 此連絡資訊可能會變更而不另行通知。 Microsoft 不保證協力廠商連絡資訊的準確性。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。