分享方式:


使用網路隔離來保護受控線上端點

適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)

在本文中,您將使用網路隔離來保護受控線上端點。 您將建立受控線上端點,以使用 Azure Machine Learning 工作區的私人端點進行安全輸入通訊。 您也會使用受控虛擬網路來設定工作區,該虛擬網路只允許針對部署核准的輸出通訊。 最後,您將建立部署,以使用工作區受控虛擬網路的私人端點進行輸出通訊。

如需使用舊版方法進行網路隔離的範例,請參閱 azureml-examples GitHub 存放庫中的部署檔案 deploy-moe-vnet-legacy.sh (for deployment using a generic model) 和 deploy-moe-vnet-mlflow-legacy.sh (使用 MLflow 模型進行部署)。

必要條件

  • 如要使用 Azure Machine Learning,您必須擁有 Azure 訂閱。 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。 立即試用免費或付費版本的 Azure Machine Learning

  • 安裝並設定 Azure CLI 與 Azure CLI ml 延伸模組。 如需詳細資訊,請參閱安裝、設定和使用 CLI (v2)

    提示

    Azure Machine Learning 受控虛擬網路於 2023 年 5 月 23 日推出。 如果您有舊版的 ml 延伸模組,您可能需要更新它,本文中的範例才能運作。 若要更新延伸模組,請使用下列 Azure CLI 命令:

    az extension update -n ml
    
  • 本文中的 CLI 範例假設您使用 Bash (或相容的) 殼層。 例如,從 Linux 系統或 Windows 子系統 Linux 版

  • 您必須有 Azure 資源群組,在其中您 (或您使用的服務主體) 必須擁有 Contributor 存取權。 如果您已設定 ml 延伸模組,您就會有這類資源群組。

  • 如果您想要使用使用者指派的受控識別建立和管理線上端點和線上部署,則身分識別應該具有適當的權限。 如需必要權限的詳細資訊,請參閱設定服務驗證。 例如,您必須為身分識別上的 Azure Key Vault 指派適當的 RBAC 權限。

從舊版網路隔離方法遷移至工作區受控虛擬網路

如果您先前已使用舊版方法受控線上端點的網路隔離,而您想要移轉至使用工作區受控虛擬網路來保護端點的安全,您可以遵循下列步驟:

  1. 建立新的工作區並啟用受控虛擬網路。 如需如何為工作區設定受控網路的詳細資訊,請參閱工作區受控虛擬網路隔離
  2. (選擇性) 在工作區網路設定上,如果您的部署需要存取儲存體帳戶、Azure Key Vault 及與工作區相關聯的 Azure Container Registry (ACR) 以外的其他私人資源,請新增具有私人端點類型的輸出規則 (預設為新增)。
  3. (選擇性) 如果您想要使用 Azure Machine Learning 登錄,請設定私人端點,以便與登錄、其儲存體帳戶及 Azure Container Registry 進行輸出通訊。
  4. 在新工作區中建立線上端點/部署。 您可以利用 Azure Machine Learning 登錄直接從它們進行部署。 如需詳細資訊,請參閱從登錄部署
  5. 更新叫用端點的應用程式,以使用新線上端點的評分 URI。
  6. 驗證之後,從舊工作區刪除線上端點。

如果您不需要維護計算或保留舊工作區中的線上端點和部署,而不需停機,您可以直接刪除現有工作區中的所有計算,並更新工作區以啟用工作區受控虛擬網路。

限制

  • 您必須在 Azure Machine Learning 工作區上停用 v1_legacy_mode 旗標 (false)。 如果啟用此旗標,您就無法建立受控線上端點。 如需詳細資訊,請參閱 v2 API 的網路隔離

  • 如果您的 Azure Machine Learning 工作區具有 2022 年 5 月 24 日之前建立的私人端點,您就必須先重新建立工作區的私人端點,才能將線上端點設定為使用私人端點。 如需為您的工作區建立私人端點的詳細資訊,請參閱如何針對 Azure Machine Learning 工作區設定私人端點

    提示

    若要確認建立工作區的時間,您可以檢查工作區屬性。

    在 Studio 中,移至 Directory + Subscription + Workspace 區段 (Studio 的右上方),然後選取 View all properties in Azure Portal。 從 [概觀] 頁面的右上角選取 JSON 檢視,然後選擇最新的 API 版本。 您可以從此頁面檢查 properties.creationTime 的值。

    或者,使用 az ml workspace show 搭配 CLImy_ml_client.workspace.get("my-workspace-name") 搭配 SDK,或者工作區上的 curl 搭配 REST API

  • 當您搭配線上端點使用網路隔離時,可以從與工作區不同的資源群組使用工作區相關聯的資源 (Azure Container Registry (ACR)、儲存體帳戶、Key Vault 和 Application Insights)。 不過,這些資源必須屬於與工作區相同的訂用帳戶和租用戶。

注意

本文所述的網路隔離適用於資料平面作業,也就是評分要求所產生的作業 (或模型服務)。 控制平面作業 (例如建立、更新、刪除或擷取驗證金鑰的要求) 會透過公用網路傳送至 Azure Resource Manager。

準備您的系統

  1. 建立此範例所使用的環境變數,執行下列命令。 將 <YOUR_WORKSPACE_NAME> 取代為要用於工作區的名稱。 將 <YOUR_RESOURCEGROUP_NAME> 換成您的工作區所在的資源群組。

    提示

    在建立新的工作區之前,您必須建立 Azure 資源群組以包含該工作區。 如需詳細資訊,請參閱管理 Azure 資源群組

    export RESOURCEGROUP_NAME="<YOUR_RESOURCEGROUP_NAME>"
    export WORKSPACE_NAME="<YOUR_WORKSPACE_NAME>"
    
  2. 建立您的工作區。 -m allow_only_approved_outbound 參數會設定工作區的受控虛擬網路,並封鎖已核准目的地以外的輸出流量。

    az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_only_approved_outbound
    

    或者,如果您想要允許部署將輸出流量傳送至網際網路,請取消註解下列程式代碼並改為執行。

    # az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_internet_outbound
    

    如需如何建立新工作區或升級現有工作區以使用受控虛擬網路的詳細資訊,請參閱 設定受控虛擬網路以允許網際網路輸出。

    當工作區設定為私人端點時,工作區 Azure Container Registry 必須針對進階層進行設定,才能允許透過私人端點存取。 如需詳細資訊,請參閱 Azure Container Registry 服務層級。 此外,應該使用 image_build_compute 屬性來設定工作區,因為部署建立牽涉到建置映像。 如需詳細資訊,請參閱設定映像組建

    重要

    第一次為工作區設定工作區受控虛擬網路時,尚未佈建網路。 在繼續建立線上部署之前,請遵循手動佈建受控網路的指導方針來佈建網路。 建立線上部署將會遭到拒絕,直到佈建受控網路為止。

  3. 設定 CLI 的預設值,讓您可以避免多次傳入工作區和資源群組的值。

    az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME
    
  4. 複製範例存放庫以取得端點和部署的範例檔案,然後移至存放庫的 /cli 目錄。

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd /cli
    

本教學課程中的命令位於 cli 目錄的檔案 deploy-managed-online-endpoint-workspacevnet.sh中,而 YAML 組態檔則位於 endpoints/online/managed/sample/ 子目錄。

建立安全的受控線上端點

若要建立安全的受控線上端點,請在工作區中建立端點,並將端點 public_network_access 設定為 disabled 以控制輸入通訊。 接著,端點必須使用工作區的私人端點進行輸入通訊。

由於工作區已設定為具有受控虛擬網路,因此端點的任何部署都會使用受控虛擬網路的私人端點進行輸出通訊。

  1. 設定端點的名稱。

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    
  2. 建立已停用的端點 public_network_access 以封鎖輸入流量。

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml --set public_network_access=disabled
    

    如果您停用端點的公用網路存取,叫用端點的唯一方式是使用私人端點來存取虛擬網路中的工作區。 如需詳細資訊,請參閱保護輸入評分要求設定 Azure Machine Learning 工作區的私人端點

    或者,如果您想要允許端點從網際網路接收評分要求,請取消註解下列程式代碼並改為執行。

    # az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    
  3. 在工作區受控虛擬網路中建立部署。

    az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
    
  4. 取得部署的狀態。

    az ml online-endpoint show -n $ENDPOINT_NAME
    
  5. 使用 CLI 以評分要求測試端點。

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
    
  6. 取得部署記錄。

    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    
  7. 如果您不再需要端點,請刪除端點。

    az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
    
  8. 刪除本文中建立的全部資源。 將 <resource-group-name> 取代為此範例中使用的資源群組名稱:

    az group delete --resource-group <resource-group-name>
    

疑難排解

線上端點建立失敗,出現 V1LegacyMode == true 訊息

您可以為 v1_legacy_mode 設定 Azure Machine Learning 工作區,這會停用 v2 API。 受控線上端點是 v2 API 平台的功能,如果工作區已啟用 v1_legacy_mode,將無法運作。

若要停用 v1_legacy_mode,請參閱使用 v2 的網路隔離

重要

在停用 v1_legacy_mode 之前,請先檢查您的網路安全性小組,因為它們可能出於某種原因而啟用了它。

使用金鑰型驗證建立線上端點失敗

使用下列命令來列出工作區的 Azure Key Vault 網路規則。 將 <keyvault-name> 取代為金鑰保存庫的名稱:

az keyvault network-rule list -n <keyvault-name>

此命令的回應類似於下列 JSON 程式碼:

{
    "bypass": "AzureServices",
    "defaultAction": "Deny",
    "ipRules": [],
    "virtualNetworkRules": []
}

如果 bypass 的值不是 AzureServices,請使用設定金鑰保存庫網路設定中的指引,將它設定為 AzureServices

線上部署失敗,發生映像下載錯誤

注意

使用適用於受控線上端點的舊版網路隔離方法時,便會發生此問題,該方法中,Azure Machine Learning 會在端點下為每個部署建立一個受控虛擬網路。

  1. 檢查 egress-public-network-access 旗標是對部署 disabled。 如果已啟用此旗標,且容器登錄的可見度為私人,則預期會發生此失敗。

  2. 使用下列命令來檢查私人端點連線的狀態。 用您工作區的 Azure Container Registry 名稱取代 <registry-name>:

    az acr private-endpoint-connection list -r <registry-name> --query "[?privateLinkServiceConnectionState.description=='Egress for Microsoft.MachineLearningServices/workspaces/onlineEndpoints'].{Name:name, status:privateLinkServiceConnectionState.status}"
    

    在回應碼中,驗證 status 欄位已設定為 Approved。 如果未設定,請使用下列命令來核准它。 以上一個命令傳回的名稱取代 <private-endpoint-name>

    az network private-endpoint-connection approve -n <private-endpoint-name>
    

無法解析評分端點

  1. 驗證發出評分要求的用戶端是可存取 Azure Machine Learning 工作區的虛擬網路。

  2. 使用端點主機名稱上的 nslookup 命令來擷取 IP 位址資訊,例如:

    nslookup endpointname.westcentralus.inference.ml.azure.com
    

    回應包含應位於虛擬網路所提供的範圍內的位址。

    注意

    • 針對 Kubernetes 線上端點,端點主機名稱應該是已在 Kubernetes 叢集中指定的 CName (網域名稱)。
    • 若端點為 HTTP,則 IP 位址會包含在您可以直接在工作室 UI 中取得的端點 URI 中。
    • 您可以在 [安全 Kubernetes 線上端點] 中找到更多方法來取得端點的 IP 位址。
  3. 如果 nslookup 命令無法解析主機名稱,請採取下列動作:

受控線上端點

  1. 使用下列命令來檢查虛擬網路的私人網域名稱伺服器 (DNS) 區域中是否存在 A 記錄。

    az network private-dns record-set list -z privatelink.api.azureml.ms -o tsv --query [].name
    

    結果應該包括類似 *.<GUID>.inference.<region> 的項目。

  2. 如果未傳回任何推斷值,請刪除並重新建立工作區的私人端點。 如需詳細資訊,請參閱如何設定私人端點

  3. 如果具有私人端點的工作區使用自訂 DNS 伺服器,請執行下列命令來確認來自自訂 DNS 的解析是否正常運作。

dig endpointname.westcentralus.inference.ml.azure.com

Kubernetes 線上端點

  1. 檢查 Kubernetes 叢集中的 DNS 設定。

  2. 此外,您可以使用下列命令來檢查 azureml-fe 是否如預期般運作:

    kubectl exec -it deploy/azureml-fe -- /bin/bash
    (Run in azureml-fe pod)
    
    curl -vi -k https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
    "Swagger not found"
    

    針對 HTTP,請使用下列命令:

     curl https://localhost:<port>/api/v1/endpoint/<endpoint-name>/swagger.json
    "Swagger not found"
    
  3. 如果 curl HTTP 失敗或逾時,但 HTTP 可運作,請檢查憑證是否有效。

  4. 如果上述流程無法解析為 A 記錄,請確認解析是否可從 Azure DNS (168.63.129.16) 運作。

    dig @168.63.129.16 endpointname.westcentralus.inference.ml.azure.com
    
  5. 如果上述命令成功,請為自訂 DNS 上私人連結的條件轉寄站進行疑難排解。

無法對線上部署進行評分

  1. 執行下列命令以查看是否已成功部署:

    az ml online-deployment show -e <endpointname> -n <deploymentname> --query '{name:name,state:provisioning_state}' 
    

    如果部署順利完成,則 state 的值將會是 Succeeded

  2. 如果部署成功,請使用下列命令來檢查是否已將流量指派給部署。 使用您的端點名稱取代 <endpointname>

    az ml online-endpoint show -n <endpointname>  --query traffic
    

    此命令的回應應該會列出指派給部署的流量百分比。

    提示

    如果您正在使用要求中的 azureml-model-deployment 標頭來鎖定此部署,則不需要此步驟。

  3. 如果已正確設定流量指派或部署標頭,請使用下列命令來取得端點的記錄。 用端點的名稱取代 <endpointname>,並將 <deploymentname> 取代為部署。

    az ml online-deployment get-logs  -e <endpointname> -n <deploymentname> 
    
  4. 檢閱記錄以查看當您提交要求至部署時,是否發生執行評分程式碼的問題。

下一步