共用方式為


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

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

本文說明如何使用網路隔離來改善 Azure Machine Learning 受控在線端點的安全性。 網路隔離有助於保護端點的輸入和輸出通訊。

為了協助保護輸入通訊,您可以建立使用 Azure Machine Learning 工作區私人端點的受控在線端點。 若要只允許已核准的部署輸出通訊,您可以使用受控虛擬網路來設定工作區。 本文說明如何採取這些步驟來改善端點安全性。 它也會示範如何建立部署,以使用工作區受控虛擬網路的私人端點進行輸出通訊。

如果您想要使用舊版方法進行網路隔離,請參閱 azureml-examples GitHub 存放庫中的下列部署檔案範例:

必要條件

  • Azure 訂用帳戶。 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶

  • Azure CLI 和 Azure CLI ml 擴充功能,已安裝並設定。 如需詳細資訊,請參閱 安裝和設定 CLI (v2)

    提示

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

    az extension update -n ml
    
  • Bash 殼層或相容的殼層,例如 Linux 系統上的殼層或 Windows 子系統 Linux 版 (部分內容可能是機器或 AI 翻譯)。 本文中的 Azure CLI 範例假設您使用這種類型的終端機。

  • 您或服務主體所使用的 Azure 資源群組具有參與者存取權。 如需建立資源群組的指示,請參閱 設定

  • 如果您想使用受控識別來建立和管理在線端點和在線部署,則需要使用擁有適當許可權的 使用者指派的受控識別。 如需必要許可權的詳細資訊,請參閱 設定 Azure Machine Learning 與其他服務之間的驗證。 例如,您必須為 Azure Key Vault 授與受控識別特定的 Azure 角色型存取控制 (Azure RBAC) 許可權。

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

如果您使用 舊版方法 進行受控在線端點的網路隔離,而且您想要移轉至受控虛擬網路來保護端點,請遵循下列步驟:

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

如果您不需要避免在移轉期間停機,您可以採取更直接的方法。 如果您不需要在舊工作區中維護計算實例、在線端點和部署,您可以刪除計算實例,然後更新工作區以啟用受控虛擬網路。

限制

  • v1_legacy_mode 標必須設定為 , false 才能關閉 Azure Machine Learning 工作區上的 v1 舊版模式。 如果開啟此設定,您就無法建立受控在線端點。 如需詳細資訊,請參閱 Azure Resource Manager 上的新 API 平台的網路隔離變更

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

    提示

    若要查看工作區的建立日期,您可以檢查工作區屬性。

    1. 在 Azure Machine Learning Studio 中,移至右上角,然後選取工作區的名稱。
    2. 在 Directory + Subscription + Workspace 視窗中,選擇 Azure 入口網站中檢視所有屬性
    3. 在 Azure 入口網站 [概觀] 頁面中,移至右上角,然後選取 [JSON 檢視]。
    4. 在 [資源 JSON] 視窗的 [API 版本] 下,選取最新的 API 版本。
    5. 在 JSON 程式碼的properties段中,檢查creationTime值。

    或者,使用下列其中一種方法:

    • Python SDKWorkspace.get(name=<workspace-name>, subscription_id=<subscription-ID>, resource_group=<resource-group-name>).get_details()
    • REST APIcurl https://management.azure.com/subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>/providers/Microsoft.MachineLearningServices/workspaces/?api-version=2023-10-01 -H "Authorization:Bearer <access-token>"
    • PowerShellGet-AzMLWorkspace -Name <workspace-name> -ResourceGroupName <resource-group-name>
  • 當您使用網路隔離來協助保護線上端點時,您可以使用與工作區資源群組不同的資源群組中的工作區相關聯資源。 不過,這些資源必須屬於與您的工作區域相同的訂用帳戶和租用戶。 與工作區相關聯的資源包括 Azure Container Registry、Azure 記憶體、Azure Key Vault 和 Application Insights。

注意

本文說明適用於數據平面作業的網路隔離。 這些作業是由評分要求或模型服務產生的。 控制平面作業,例如建立、更新、刪除或擷取驗證密鑰的要求,會透過公用網路傳送至 Azure Resource Manager。

準備您的系統

  1. 執行下列命令來建立環境變數。 以工作區的資源群組取代 <resource-group-name> 。 將 <workspace-name> 換成您的工作區名稱。

    export RESOURCEGROUP_NAME="<resource-group-name>"
    export WORKSPACE_NAME="<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
    

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

  3. 布建受控虛擬網路。 如需指示和詳細資訊,請參閱 手動布建受控 VNet

    重要

    當您第一次為工作區設定受控虛擬網路時,系統並不會佈建網路。 在布建受控網路之前,您無法建立在線部署。

  4. 設定與工作區相關聯的容器登錄,以使用進階定價方案。 需要此設定,才能透過私人端點提供登錄的存取權。 如需詳細資訊,請參閱 Azure Container Registry 服務層級

  5. 將您的工作區設定為使用計算叢集或計算實例來建置映像。 您可以針對此目的使用 image_build_compute 屬性。 如需詳細資訊和指示,請參閱 設定映像組建

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

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

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

本文中的命令位於 cli 目錄中的 deploy-managed-online-endpoint-workspacevnet.sh 檔案中。 YAML 組態檔位於 endpoints/online/managed/sample/ 子目錄中。

建立安全的受控線上端點

若要建立安全的受控在線端點,您可以在工作區中建立端點。 然後將端點 public_network_access 的值設定為 disabled ,以控制輸入通訊。

此設定會強制在線端點使用工作區的私人端點進行輸入通訊。 叫用在線端點的唯一方法是使用私人端點來存取您虛擬網路中的工作區。 如需詳細資訊,請參閱 保護輸入評分要求設定 Azure Machine Learning 工作區的私人端點

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

  1. 設定端點的名稱:

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    
  2. 建立端點,將 public_network_access 設定為 disabled 以封鎖入站流量。

    注意

    所引用的腳本使用來自複製儲存庫的 YAML 設定檔。 複製存放庫後,請確保您位於正確的目錄 (CLI),或提供完整的 YAML 檔案路徑。 在 Azure Cloud Shell 裡,執行指令前先確認檔案是否能在你的雲端儲存中存取。

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

    相反地,如果您想要允許端點從網際網路接收評分要求,請取消註解下列程式碼並改為加以執行:

    # az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

測試端點

  1. 在工作區的受控虛擬網路中建立部署:

    az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
    

    如果您收到授權失敗的錯誤,請檢查工作區記憶體帳戶的網路設定。 您可能必須調整公用網路存取設定,以授與工作區對記憶體帳戶的存取權。

  2. 獲取部署狀態:

    az ml online-endpoint show -n $ENDPOINT_NAME
    
  3. 發出評分要求來測試端點:

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

    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    

清理資源

  1. 如果您不再需要端點,請執行下列命令來刪除它。

    az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
    
  2. 如果您不再需要工作區、其相關聯的資源,以及資源群組中的其他資源,請將其刪除。 將 <resource-group-name> 替換為包含您工作區的資源群組名稱。

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

疑難排解

在線端點建立失敗,並出現關於 v1 舊版模式的訊息

受控在線端點是 Azure Machine Learning v2 API 平臺的功能。 如果您的 Azure Machine Learning 工作區已設定為 v1 舊版模式,受控在線端點將無法運作。 具體而言,如果 v1_legacy_mode 工作區設定為 true,則會開啟 v1 舊版模式,且不支援 v2 API。

若要查看如何關閉 v1 舊版模式,請參閱 Azure Resource Manager 上的新 API 平臺的網路隔離變更

重要

在設定 v1_legacy_modefalse之前,請先洽詢您的網路安全小組,因為可能會因為原因而開啟 v1 舊版模式。

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

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

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

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

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

如果的值 bypass 不是 AzureServices,請使用設定 Azure Key Vault 網路設定 中的指引將其設定為 AzureServices

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

注意

當您 針對受控在線端點使用舊版網路隔離方法時,就會發生此問題。 在此方法中,Azure Machine Learning 會針對端點下的每個部署建立受控虛擬網路。

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

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

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

    在回應碼中,確認 status 欄位已設定為 Approved。 如果值不是 Approved,請使用下列命令來核准連線。 將 <private-endpoint-connection-ID> 替換為上述命令返回的 ID。

    az network private-endpoint-connection approve --id <private-endpoint-connection-ID> --description "Approved"
    

無法解析評分端點

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

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

    nslookup <endpoint-name>.<endpoint-region>.inference.ml.azure.com
    

    例如,您的命令看起來可能類似下列命令:

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

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

    注意

    • 針對 Kubernetes 在線端點,端點主機名稱應該是您在 Kubernetes 叢集中指定的 CNAME(域名)。
    • 如果端點使用 HTTP,IP 位址會包含在端點 URI 中,您可以從 Studio UI 取得。
    • 如需取得端點 IP 位址的詳細資訊,請參閱 使用 FQDN 更新 DNS
  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 <endpoint-name>.<endpoint-region>.inference.ml.azure.com
    

Kubernetes 線上端點

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

  2. 檢查 Azure Machine Learning 推斷路由器 azureml-fe是否如預期般運作。 若要執行這項檢查,請執行下列步驟:

    1. azureml-fe Pod 中執行下列命令:

      kubectl exec -it deploy/azureml-fe -- /bin/bash
      
    2. 執行下列其中一個命令:

      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 HTTPS 命令失敗或逾時,但 HTTP 命令可運作,請檢查憑證是否有效。

  4. 如果上述程式無法解析為 A 記錄,請使用下列命令來驗證解析是否可從 Azure DNS 虛擬公用 IP 位址 168.63.129.16 運作:

    dig @168.63.129.16 <endpoint-name>.<endpoint-region>.inference.ml.azure.com
    
  5. 如果上述命令成功,請針對自定义 DNS 的 Azure Private Link 條件式轉寄器進行疑難排解。

無法對線上部署進行評分

  1. 執行下列命令以檢視無法評分的部署狀態:

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

    欄位 Succeeded 的值 state 表示部署成功。

  2. 若要成功部署,請使用下列命令來檢查是否已將流量指派給部署:

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

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

    提示

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

  3. 如果流量指派或部署標頭已正確設定,請使用下列命令來取得端點的記錄:

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