適用対象:Azure CLI ml extension v2 (現行)
Python SDK azure-ai-ml v2 (現行)
この記事では、ネットワーク分離を使用して、Azure Machine Learning マネージド オンライン エンドポイントのセキュリティを向上させる方法について説明します。 ネットワーク分離は、エンドポイントとの間の受信および送信の通信をセキュリティで保護するのに役立ちます。
受信通信をセキュリティで保護するために、Azure Machine Learning ワークスペースのプライベート エンドポイントを使用するマネージド オンライン エンドポイントを作成できます。 デプロイに対して承認された送信通信のみを許可するには、マネージド仮想ネットワークを使用してワークスペースを構成します。 この記事では、これらの手順を実行してエンドポイントのセキュリティを向上させる方法について説明します。 また、送信通信にワークスペースのマネージド仮想ネットワークのプライベート エンドポイントを使用するデプロイを作成する方法についても説明します。
従来の方法を使用してネットワークを分離する場合は、 azureml-examples GitHub リポジトリの次のデプロイ ファイルの例を参照してください。
- 汎用モデルを使用するデプロイの場合: deploy-moe-vnet-legacy.sh
- MLflow モデルを使用するデプロイの場合: deploy-moe-vnet-mlflow-legacy.sh
前提条件
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 システム上のシェルや Linux 用 Windows サブシステムなど)。 この記事の Azure CLI の例では、この種類のシェルを使用することを前提としています。
自分または使用するサービス プリンシパルが共同作成者アクセス権を持つ Azure リソース グループ。 リソース グループを作成する手順については、「 設定」を参照してください。
マネージド ID を使用してオンライン エンドポイントとオンライン デプロイを作成および管理する場合は、適切なアクセス許可を持つ ユーザー割り当てマネージド ID。 必要なアクセス許可の詳細については、「 Azure Machine Learning と他のサービス間の認証を設定する」を参照してください。 たとえば、マネージド ID 固有の Azure ロールベースのアクセス制御 (Azure RBAC) アクセス許可を Azure Key Vault に付与する必要があります。
従来のネットワーク分離方法からワークスペースマネージド仮想ネットワークに移行する
マネージド オンライン エンドポイントのネットワーク分離に 従来の方法 を使用していて、エンドポイントをセキュリティで保護するためにマネージド仮想ネットワークに移行する場合は、次の手順に従います。
- 新しいワークスペースを作成し、マネージド仮想ネットワークを有効にします。 ワークスペースのマネージド ネットワークを構成する方法の詳細については、「 ワークスペースのマネージド仮想ネットワークの分離」を参照してください。
- (省略可能)デプロイが Azure Storage、Key Vault、Azure Container Registry 以外のプライベート リソースにアクセスする場合は、ワークスペースのネットワーク設定に送信規則を追加します。 具体的には、ネットワークは、既定で Azure Storage、Key Vault、および Container Registry の規則で構成されます。 使用する他のプライベート リソースのプライベート エンドポイントを含むルールを追加します。
- (省略可能)Azure Machine Learning レジストリを使用する場合は、レジストリ、そのストレージ アカウント、および Container Registry のインスタンスへの送信通信用にプライベート エンドポイントを構成します。
- 新しいワークスペースにオンライン エンドポイントとデプロイを作成します。 Azure Machine Learning レジストリを使用する場合は、そこからコンポーネントを直接デプロイできます。 詳細については、「 ワークスペース内のレジストリからオンライン エンドポイントにモデルをデプロイする」を参照してください。
- エンドポイントを呼び出すアプリケーションを更新して、アプリケーションが新しいオンライン エンドポイントのスコア付け URI を使用するようにします。
- 新しいエンドポイントを検証したら、古いワークスペース内のオンライン エンドポイントを削除します。
移行中にダウンタイムを回避する必要がない場合は、より簡単なアプローチを採用できます。 古いワークスペースでコンピューティング インスタンス、オンライン エンドポイント、デプロイを維持する必要がない場合は、コンピューティング インスタンスを削除し、ワークスペースを更新してマネージド仮想ネットワークを有効にすることができます。
制限事項
azure Machine Learning ワークスペースで v1 レガシ モードをオフにするには、
v1_legacy_mode
フラグをfalse
に設定する必要があります。 この設定が有効になっている場合、マネージド オンライン エンドポイントを作成することはできません。 詳細については、 Azure Resource Manager の新しい API プラットフォームによるネットワーク分離の変更に関するページを参照してください。Azure Machine Learning ワークスペースに 2022 年 5 月 24 日より前に作成されたプライベート エンドポイントがある場合は、プライベート エンドポイントを使用するようにオンライン エンドポイントを構成する前に、そのプライベート エンドポイントを再作成する必要があります。 ワークスペースのプライベート エンドポイントの作成の詳細については、「 Azure Machine Learning ワークスペースのプライベート エンドポイントを構成する」を参照してください。
ヒント
ワークスペースの作成日を確認するには、ワークスペースのプロパティを確認します。
- Azure Machine Learning Studio で、右上隅に移動し、ワークスペースの名前を選択します。
- [ディレクトリ + サブスクリプション + ワークスペース] ウィンドウで、[Azure Portal ですべてのプロパティを表示する] を選択します。
- Azure portal の [概要] ページで、右上隅に移動し、[ JSON ビュー] を選択します。
- [リソース JSON] ウィンドウの [ API バージョン] で、最新の API バージョンを選択します。
- JSON コードの
properties
セクションで、creationTime
値を確認します。
または、次のいずれかの方法を使用します。
- Python SDK:
Workspace.get(name=<workspace-name>, subscription_id=<subscription-ID>, resource_group=<resource-group-name>).get_details()
- REST API:
curl 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>"
- PowerShell:
Get-AzMLWorkspace -Name <workspace-name> -ResourceGroupName <resource-group-name>
ネットワーク分離を使用してオンライン エンドポイントをセキュリティで保護する場合は、ワークスペース リソース グループとは異なるリソース グループのワークスペース関連リソースを使用できます。 ただし、これらのリソースはワークスペースと同じサブスクリプションとテナントに属している必要があります。 ワークスペースに関連付けられているリソースには、Azure Container Registry、Azure Storage、Azure Key Vault、Application Insights が含まれます。
注
この記事では、データ プレーン操作に適用されるネットワーク分離について説明します。 これらの操作は、スコアリング要求またはモデルサービングに起因します。 認証キーの作成、更新、削除、取得の要求などのコントロール プレーン操作は、パブリック ネットワーク経由で Azure Resource Manager に送信されます。
システムを準備する
次のコマンドを実行して環境変数を作成します。
<resource-group-name>
をワークスペースのリソース グループに置き換えます。<workspace-name>
は、ワークスペースの名前に置き換えます。export RESOURCEGROUP_NAME="<resource-group-name>" export WORKSPACE_NAME="<workspace-name>"
ワークスペースを作成します。
-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
新しいワークスペースを作成する方法、またはマネージド仮想ネットワークを使用するように既存のワークスペースをアップグレードする方法の詳細については、「 インターネット送信を許可するようにマネージド仮想ネットワークを構成する」を参照してください。
マネージド仮想ネットワークをプロビジョニングします。 手順と詳細については、「 マネージド VNet を手動でプロビジョニングする」を参照してください。
重要
ワークスペースのマネージド仮想ネットワークを初めて設定した場合、ネットワークはプロビジョニングされません。 マネージド ネットワークをプロビジョニングするまで、オンラインデプロイを作成することはできません。
Premium 価格プランを使用するように、ワークスペースに関連付けられているコンテナー レジストリを構成します。 この設定は、プライベート エンドポイント経由でレジストリへのアクセスを提供するために必要です。 詳細については、「Azure Container Registry サービス階層」を参照してください。
コンピューティング クラスターまたはコンピューティング インスタンスを使用してイメージを構築するようにワークスペースを構成します。 この目的には、
image_build_compute
プロパティを使用できます。 詳細と手順については、「 イメージ ビルドの構成」を参照してください。ワークスペースとリソース グループの値を複数回渡さないように、Azure CLI の既定値を構成します。
az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME
サンプル リポジトリを複製してエンドポイントとデプロイのサンプル ファイルを取得し、リポジトリの 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 ワークスペースのプライベート エンドポイントを構成する」を参照してください。
ワークスペースはマネージド仮想ネットワークを持つよう構成されているため、すべてのエンドポイント デプロイでは、送信通信にマネージド仮想ネットワークのプライベート エンドポイントが使用されます。
エンドポイントの名前を設定します。
export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
設定を
public_network_access
disabled
にして、受信トラフィックをブロックするエンドポイントを作成します。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
エンドポイントをテストする
ワークスペースのマネージド仮想ネットワークにデプロイを作成します。
az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
承認エラーに関するエラーが発生した場合は、ワークスペース ストレージ アカウントのネットワーク構成を確認します。 ワークスペースにストレージ アカウントへのアクセス権を付与するために、パブリック ネットワーク アクセス設定を調整する必要がある場合があります。
デプロイの状態を取得します。
az ml online-endpoint show -n $ENDPOINT_NAME
スコアリング要求を発行してエンドポイントをテストします。
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
デプロイ ログを取得します。
az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
リソースをクリーンアップする
エンドポイントが不要になった場合は、次のコマンドを実行して削除します。
az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
ワークスペース、関連付けられているリソース、およびリソース グループ内の他のリソースが不要になった場合は、それらを削除します。
<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_mode
を false
に設定する前に、ネットワーク セキュリティ チームに確認してください。理由により、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 によって、エンドポイントの下にデプロイごとにマネージド仮想ネットワークが作成されます。
egress-public-network-access
フラグの値がデプロイのdisabled
かどうかを確認します。 このフラグが有効で、コンテナー レジストリの可視性がプライベートである場合、この失敗が予想されます。プライベート エンドポイント接続の状態を調べるには、次のコマンドを使います。
<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"
スコアリング エンドポイントを解決できない
スコアリング要求を発行しているクライアントが、Azure Machine Learning ワークスペースにアクセスできる仮想ネットワークであることを確認します。
エンドポイント ホスト名の
nslookup
コマンドを使用して、IP アドレス情報を取得します。nslookup <endpoint-name>.<endpoint-region>.inference.ml.azure.com
たとえば、コマンドは次のようになります。
nslookup endpointname.westcentralus.inference.ml.azure.com
応答には、仮想ネットワークによって提供される範囲内にある必要があるアドレスが含まれています。
注
- Kubernetes オンライン エンドポイントの場合、エンドポイント ホスト名は、Kubernetes クラスターで指定されている CName (ドメイン名) である必要があります。
- エンドポイントが HTTP を使用する場合、IP アドレスはエンドポイント URI に含まれ、スタジオ UI から取得できます。
- エンドポイントの IP アドレスを取得するその他の方法については、「 FQDN を使用して DNS を更新する」を参照してください。
nslookup
コマンドでホスト名が解決されない場合は、次のいずれかのセクションのアクションを実行します。
マネージド オンライン エンドポイント
次のコマンドを使用して、仮想ネットワークのプライベート ドメイン ネーム システム (DNS) ゾーンに A レコードが存在するかどうかを確認します。
az network private-dns record-set list -z privatelink.api.azureml.ms -o tsv --query [].name
結果に、
*.<GUID>.inference.<region>
のようなエントリが含まれている必要があります。推論値が返されない場合は、ワークスペースのプライベート エンドポイントを削除してから、再作成します。 詳しくは、プライベート エンドポイントを構成する方法に関するページをご覧ください。
プライベート エンドポイントを持つワークスペースで カスタム DNS サーバーが使用されている場合は、次のコマンドを実行して、カスタム DNS サーバーからの解決が正しく動作することを確認します。
dig <endpoint-name>.<endpoint-region>.inference.ml.azure.com
Kubernetesのオンラインエンドポイント
Kubernetes クラスターの DNS 構成を確認します。
Azure Machine Learning 推論ルーター (
azureml-fe
) が期待どおりに動作するかどうかを確認します。 このチェックを実行するには、次の手順を実行します。azureml-fe
ポッドで次のコマンドを実行します。kubectl exec -it deploy/azureml-fe -- /bin/bash
次のいずれかのコマンドを実行します。
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 HTTPS コマンドが失敗するかタイムアウトしても HTTP コマンドが機能する場合は、証明書が有効かどうかを確認します。
上記のプロセスで A レコードへの解決に失敗した場合は、次のコマンドを使用して、解決が Azure DNS 仮想パブリック IP アドレス 168.63.129.16 から機能するかどうかを確認します。
dig @168.63.129.16 <endpoint-name>.<endpoint-region>.inference.ml.azure.com
上記のコマンドが成功した場合は、カスタム DNS での Azure Private Link の条件付きフォワーダーのトラブルシューティングを行います。
オンライン デプロイをスコアリングできない
次のコマンドを実行して、スコア付けできないデプロイの状態を確認します。
az ml online-deployment show -e <endpoint-name> -n <deployment-name> --query '{name:name,state:provisioning_state}'
Succeeded
フィールドの値state
は、デプロイが成功したことを示します。デプロイを成功させるには、次のコマンドを使用して、トラフィックがデプロイに割り当てられていることを確認します。
az ml online-endpoint show -n <endpoint-name> --query traffic
このコマンドからの応答では、各デプロイに割り当てられているトラフィックの割合を一覧表示する必要があります。
ヒント
このデプロイをターゲットにするために要求で
azureml-model-deployment
ヘッダーを使用している場合、この手順は必要ありません。トラフィックの割り当てまたはデプロイ ヘッダーが正しく設定されている場合は、次のコマンドを使用してエンドポイントのログを取得します。
az ml online-deployment get-logs -e <endpoint-name> -n <deployment-name>
デプロイに要求を送信するときにスコア付けコードの実行に問題があるかどうかを確認するには、ログを確認します。