ネットワーク分離を使用してマネージド オンライン エンドポイントをセキュリティで保護する
適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)
この記事では、ネットワーク分離を使用して、マネージド オンライン エンドポイントをセキュリティで保護します。 セキュリティで保護された受信通信に Azure Machine Learning ワークスペースのプライベート エンドポイントを使用するマネージド オンライン エンドポイントを作成します。 また、デプロイに対して承認された送信通信のみを許可するマネージド仮想ネットワークを使用してワークスペースを構成します。 最後に、送信通信にワークスペースのマネージド仮想ネットワークのプライベート エンドポイントを使用するデプロイを作成します。
ネットワーク分離に従来の方法を使用する例については、azureml-examples GitHub リポジトリのデプロイ ファイル deploy-moe-vnet-legacy.sh (汎用モデルを使用したデプロイの場合) と 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 システムや Linux 用 Windows サブシステムなどです。
Azure リソース グループがあること、また、そのリソース グループにおける
Contributor
アクセス権が自分 (または使用するサービス プリンシパル) に割り当てられていることが必要です。 上記の記事に従ってml
拡張機能を構成していれば、そのようなリソース グループが得られます。ユーザー割り当てマネージド ID を使用してオンライン エンドポイントとオンライン デプロイを作成および管理する場合、ID には適切なアクセス許可が必要です。 必要なアクセス許可の詳細については、「サービス認証を設定する」を参照してください。 たとえば、ID に対する Azure Key Vault の適切な RBAC アクセス許可を割り当てる必要があります。
従来のネットワークの分離方法からワークスペース マネージド仮想ネットワークに移行する
以前にマネージド オンライン エンドポイントのネットワークの分離に従来の方法を使用しており、エンドポイントをセキュリティで保護するためにワークスペースのマネージド仮想ネットワークの使用に移行したい場合は、次の手順のようにして実現できます。
- 新しいワークスペースを作成し、マネージド仮想ネットワークを有効にします。 ワークスペースのマネージド ネットワークの構成方法の詳細については、「ワークスペースのマネージド仮想ネットワークの分離」を参照してください。
- (省略可能) ワークスペースに関連付けられているストレージ アカウント、Azure Key Vault、Azure Container Registry (ACR) (これらは既定で追加されます) 以外の追加のプライベート リソースにデプロイでアクセスする必要がある場合は、ワークスペース ネットワークの設定で、プライベート エンドポイントの種類を指定してアウトバウンド規則を追加します。
- (省略可能) Azure Machine Learning レジストリを使う場合は、レジストリ、そのストレージ アカウント、その Azure Container Registry へのアウトバウンド通信用に、プライベート エンドポイントを構成します。
- 新しいワークスペースにオンライン エンドポイントとデプロイを作成します。 Azure Machine Learning レジストリを利用して、そこから直接デプロイできます。 詳しくは、レジストリからのデプロイに関する記事をご覧ください。
- 新しいオンライン エンドポイントのスコアリング URI を使うように、エンドポイントを呼び出すアプリケーションを更新します。
- 検証の後で、古いワークスペースからオンライン エンドポイントを削除します。
古いワークスペースのコンピューティングや、オンライン エンドポイントとデプロイを維持して、ダウンタイムなしでサービスを提供する必要がない場合は、既存のワークスペース内のすべてのコンピューティングを単に削除し、ワークスペースを更新してワークスペースのマネージド仮想ネットワークを有効にできます。
制限事項
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
を CLI で使用するか、my_ml_client.workspace.get("my-workspace-name")
を SDK で使用するか、ワークスペースのcurl
を REST API で使用します。オンライン エンドポイントでネットワーク分離を使用する場合、ワークスペースのリソース グループとは異なるリソース グループの、ワークスペースに関連付けられたリソース (Azure Container Registry (ACR)、ストレージ アカウント、Key Vault、Application Insights) を使用できます。 ただし、これらのリソースはワークスペースと同じサブスクリプションとテナントに属している必要があります。
Note
この記事で説明するネットワーク分離は、データ プレーン操作、つまり、スコアリング要求 (またはモデルの提供) から生じる操作に適用されます。 コントロール プレーン操作 (認証キーの作成、更新、削除、または取得の要求) は、パブリック ネットワーク経由で Azure Resource Manager に送信されます。
システムを準備する
この例で使われる環境変数を作成するには、次のコマンドを実行します。
<YOUR_WORKSPACE_NAME>
をワークスペースに使用する名前に置き換えます。<YOUR_RESOURCEGROUP_NAME>
をワークスペースが含まれているリソース グループに置き換えます。ヒント
新しいワークスペースを作成する前に、それを含む Azure リソース グループを作成する必要があります。 詳細については、Azure リソース グループの管理に関する記事を参照してください。
export RESOURCEGROUP_NAME="<YOUR_RESOURCEGROUP_NAME>" export WORKSPACE_NAME="<YOUR_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
新しいワークスペースを作成する方法、または管理された仮想ネットワークを使用するように既存のワークスペースをアップグレードする方法の詳細については、「インターネット送信を許可するようにマネージド仮想ネットワークを構成する」 を参照してください。
ワークスペースがプライベート エンドポイントで構成されている場合、プライベート エンドポイント経由のアクセスを許可するには、ワークスペースの Azure Container Registry を Premium レベル用に構成する必要があります。 詳細については、「Azure Container Registry サービス階層」を参照してください。 また、デプロイの作成にはイメージのビルドが含まれるので、ワークスペースは
image_build_compute
プロパティで設定する必要があります。 詳細については、「イメージのビルドを構成する」を参照してください。重要
ワークスペースのマネージド仮想ネットワークがワークスペースに対して初めて設定された場合、ネットワークはまだプロビジョニングされていません。 オンライン デプロイの作成に進む前に、マネージド ネットワークの手動プロビジョニングに関するガイドラインに従って、ネットワークをプロビジョニングします。 マネージド ネットワークがプロビジョニングされるまで、オンライン デプロイの作成は拒否されます。
ワークスペースとリソース グループの値を複数回渡さないように、CLI の既定値を構成します。
az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME
サンプル リポジトリを複製してエンドポイントとデプロイのサンプル ファイルを取得し、リポジトリの
/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
に設定して受信通信を制御します。 その後、エンドポイントは、受信通信にワークスペースのプライベート エンドポイントを使用する必要があります。
ワークスペースはマネージド仮想ネットワークを持つよう構成されているため、エンドポイントのすべてのデプロイでは、送信通信のためにマネージド仮想ネットワークのプライベート エンドポイントが使用されます。
エンドポイントの名前を設定します。
export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
受信トラフィックをブロックするには、
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
ワークスペースマネージド仮想ネットワークにデプロイを作成します。
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
CLI を使用して、スコアリング要求でエンドポイントをテストします。
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>
トラブルシューティング
V1LegacyMode == true メッセージでオンライン エンドポイントの作成が失敗する
Azure Machine Learning ワークスペースを v1_legacy_mode
で構成して、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
ではない場合は、「Azure Key Vault のネットワーク設定を構成する」のガイダンスを使って、それを AzureServices
に設定します。
イメージのダウンロード エラーでオンライン デプロイが失敗する
Note
この問題は、マネージド オンライン エンドポイントに従来のネットワークの分離方法を使用する場合に当てはまります。この方法では、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'].{Name:name, status:privateLinkServiceConnectionState.status}"
応答コードで、
status
フィールドがApproved
に設定されていることを確認します。 設定されていない場合は、次のコマンドを使用して承認します。<private-endpoint-name>
は、前のコマンドから返された名前に置き換えます。az network private-endpoint-connection approve -n <private-endpoint-name>
スコアリング エンドポイントを解決できない
スコアリング要求を発行しているクライアントが、Azure Machine Learning ワークスペースにアクセスできる仮想ネットワークであることを確認します。
エンドポイントのホスト名に対して
nslookup
コマンドを使用して、IP アドレスの情報を取得します。次に例を示します。nslookup endpointname.westcentralus.inference.ml.azure.com
応答には、仮想ネットワークによって提供される範囲内にある必要があるアドレスが含まれています。
Note
- Kubernetes オンライン エンドポイントの場合、エンドポイントのホスト名は、Kubernetes クラスターで指定されている CName (ドメイン名) である必要があります。
- エンドポイントが HTTP の場合、IP アドレスはエンドポイント URI に含まれ、スタジオ UI から取得できます。
- エンドポイントの IP アドレスを取得する他の方法については、「セキュリティで保護された Kubernetes オンライン エンドポイント」を参照してください。
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 endpointname.westcentralus.inference.ml.azure.com
Kubernetes オンライン エンドポイント
Kubernetes クラスターの DNS 構成を確認します。
また、次のコマンドを使用して、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 上のプライベート リンクの条件付きフォワーダーのトラブルシューティングを行います。
オンライン 展開をスコアリングできない
デプロイが正常に行われたかどうかを確認するには、次のコマンドを使用します。
az ml online-deployment show -e <endpointname> -n <deploymentname> --query '{name:name,state:provisioning_state}'
デプロイが正常に完了した場合、
state
の値はSucceeded
になります。デプロイが成功した場合は、次のコマンドを使って、トラフィックがデプロイに割り当てられていることを確認します。
<endpointname>
は、お使いのエンドポイントの名前に置き換えます。az ml online-endpoint show -n <endpointname> --query traffic
このコマンドからの応答では、デプロイに割り当てられているトラフィックの割合の一覧が示されるはずです。
ヒント
このデプロイをターゲットにするために要求で
azureml-model-deployment
ヘッダーを使用している場合、この手順は必要ありません。トラフィックの割り当てまたはデプロイ ヘッダーが正しく設定されている場合は、次のコマンドを使用してエンドポイントのログを取得します。
<endpointname>
はエンドポイントの名前に、<deploymentname>
はデプロイに置き換えます。az ml online-deployment get-logs -e <endpointname> -n <deploymentname>
ログを調べて、デプロイに要求を送信したときに、スコアリング コードの実行で問題が発生しているかどうかを確認します。