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

適用於: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 訂用帳戶、CLI 或 SDK 與 Azure Machine Learning 工作區和相關實體互動,以及正確的權限。

  • 如要使用 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 權限。

限制

  • 您必須在 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。 網路安全性小組可能基於某個原因而加以啟用。

如需如何停用 v1_legacy_mode 的詳細資訊,請參閱 v2 的網路隔離

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

使用下列命令來列出工作區的 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 旗標。 如果已啟用此旗標,且容器登錄的可見度為私人,則預期會發生此失敗。

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

    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 中。 如需取得端點 IP 位址的其他方式,請參閱保護 Kubernetes 線上端點

  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 伺服器使用工作區),請使用下列命令驗證自訂 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"
      

    如果 curl HTTP 失敗 (例如逾時),但 HTTP 運作正常,請檢查憑證是否有效。

    如果無法解析為 A 記錄,請確認是否可從 Azure DNS (168.63.129.16) 進行解析。

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

    如果可以,請為自訂 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> 
    

    瀏覽記錄,以查看當您提交要求至部署時,是否發生執行評分程式碼的問題。

下一步