このドキュメントでは、Azure Databricks でサーバーレス ワークロードからの送信ネットワーク接続を制御するためのネットワーク ポリシーを構成および管理する方法について説明します。
必要条件
- Azure Databricks ワークスペースは Premium レベルである必要があります。
- ネットワーク ポリシーを管理するためのアクセス許可は、アカウント管理者に制限されます。
ネットワーク ポリシーへのアクセス
アカウントでネットワーク ポリシーを作成、表示、更新するには:
- アカウント コンソールで、[クラウド リソース] をクリックします。
- [ ネットワーク ] タブをクリックします。
新しいネットワーク ポリシーを作成する
[新しいネットワーク ポリシー
作成] をクリックします。 ネットワーク アクセス モードを選択します。
- フル アクセス: 無制限の送信インターネット アクセス。 [フル アクセス] を選択した場合、送信インターネット アクセスは制限されません。
- 制限付きアクセス: 送信アクセスは、指定された宛先に制限されます。 詳細については、「 ネットワーク ポリシーの概要」を参照してください。
ネットワーク ポリシーを構成する
次の手順では、制限付きアクセス モードのオプションの設定の概要を示します。
エグレス ルールを設定する
サーバーレス コンピューティングに追加のドメインへのアクセス権を付与するには、[許可されたドメイン] の一覧の上にある [宛先の追加] をクリックします。
FQDN フィルターを使用すると、同じ IP アドレスを共有しているすべてのドメインにアクセスできます。 エンドポイント全体でプロビジョニングされたモデル サービングは、ネットワーク アクセスが制限付きに設定されている場合にインターネット アクセスを遮断します。 ただし、FQDN フィルター処理を使用した詳細な制御はサポートされていません。
ワークスペースで追加の Azure ストレージ アカウントへのアクセスを許可するには、[許可されているストレージ アカウント] 一覧の上にある [
ターゲット の追加] ボタンクリックします。
注
REPL や UDF などのユーザー コード コンテナーからクラウド ストレージ サービスへの直接アクセスは、既定では許可されません。 このアクセスを有効にするには、ストレージ リソースの FQDN を 許可ドメイン としてポリシーに追加します。 ストレージ リソースのベース ドメインのみを追加すると、リージョン内のすべてのストレージ リソースへのアクセス権が誤って付与される可能性があります。
エグレス ルールを設定する場合は、次の点に注意してください。
- UC 外部の場所のメタストアと Azure ストレージ アカウントのバケットが異なるリージョンにある場合は、アクセスを成功させるために、エグレス許可リストにバケットを明示的に追加する必要があります。
- サポートされている宛先の最大数は 2500 です。
- ロード バランサーの Private Link エントリとして追加されたドメインは、ネットワーク ポリシーで暗黙的に許可リストされます。 ドメインが削除されるか、プライベート エンドポイントが削除されると、ネットワーク ポリシー制御によって変更が完全に適用されるまでに最大 24 時間かかることがあります。 VNet 内のリソースへのプライベート接続を構成するを参照してください。
注
Unity カタログ接続の暗黙的な許可リストは非推奨になりました。 非推奨になる前に暗黙的な許可リストを使用していたワークスペースを含むアカウントの場合、この動作は限られた移行期間に有効なままです。
ポリシーの適用
ドライラン モードを使用すると、リソースへのアクセスを中断することなく、ポリシー構成をテストし、送信接続を監視できます。 ドライラン モードが有効になっている場合、ポリシーに違反する要求はログに記録されますが、ブロックされません。 選択できるオプションには、以下のものがあります。
Databricks SQL: Databricks SQL ウェアハウスはドライラン モードで動作します。
AI モデル サービス: モデル サービス エンドポイントはドライラン モードで動作します。
すべての製品: すべての Azure Databricks サービスはドライラン モードで動作し、他のすべての選択をオーバーライドします。
既定のポリシーを更新する
各 Azure Databricks アカウントには 、既定のポリシーが含まれています。 既定のポリシーは、新しく作成されたワークスペースを含め、明示的なネットワーク ポリシーの割り当てを持たないすべてのワークスペースに関連付けられます。 このポリシーは変更できますが、削除することはできません。
既定のポリシーは、Premium レベル以上のワークスペースにのみ適用されます。
ネットワーク ポリシーをワークスペースに関連付ける
追加の構成で既定のポリシーを更新した場合、既存のネットワーク ポリシーがないワークスペースに自動的に適用されます。
ワークスペースは Premium レベルである必要があります。
ワークスペースを別のポリシーに関連付けるには、次の操作を行います。
- ワークスペースを選択します。
- ネットワーク ポリシー で、[ネットワーク ポリシーを更新 ] をクリックします。
- 一覧から目的のネットワーク ポリシーを選択します。
ネットワーク ポリシーの変更を適用する
ほとんどのネットワーク構成の更新プログラムは、10 分以内にサーバーレス コンピューティングに自動的に反映されます。 これには、次のものが含まれます。
- 新しい Unity カタログの外部の場所または接続を追加する。
- ワークスペースを別のメタストアにアタッチする。
- 許可されているストレージまたはインターネットの宛先の変更。
注
インターネット アクセスまたはドライラン モードの設定を変更する場合は、コンピューティングを再起動する必要があります。
サーバーレス ワークロードを再起動または再デプロイする
更新する必要があるのは、インターネット アクセス モードを切り替える場合、またはドライラン モードを更新する場合のみです。
適切な再起動プロシージャを決定するには、製品別に次のリストを参照してください。
- Databricks ML Serving: ML サービス エンドポイントを再デプロイします。 「カスタム モデル サービス エンドポイントの作成」を参照してください
- パイプライン: 実行中の Lakeflow 宣言型パイプラインを停止してから再起動します。 「Lakeflow 宣言パイプラインで更新を実行する」を参照してください。
- サーバーレス SQL ウェアハウス: SQL ウェアハウスを停止して再起動します。 SQL ウェアハウスの管理を参照してください。
- Lakeflow ジョブ: ネットワーク ポリシーの変更は、新しいジョブの実行がトリガーされるか、既存のジョブの実行が再起動されたときに自動的に適用されます。
- ノートブック:
- ノートブックが Spark と対話しない場合は、新しいサーバーレス クラスターを終了してアタッチして、ノートブックに適用されているネットワーク構成を更新できます。
- ノートブックが Spark と対話すると、サーバーレス リソースが更新され、変更が自動的に検出されます。 ほとんどの変更は 10 分で更新されますが、インターネット アクセス モードの切り替え、ドライラン モードの更新、または適用の種類が異なる添付ポリシー間の変更には最大 24 時間かかることがあります。 これらの特定の種類の変更を迅速に更新するには、関連付けられているすべてのノートブックとジョブをオフにします。
ネットワーク ポリシーの適用を確認する
異なるサーバーレス ワークロードから制限されたリソースにアクセスしようとすると、ネットワーク ポリシーが正しく適用されていることを検証できます。 検証プロセスは、サーバーレス製品によって異なります。
Lakeflow 宣言パイプラインを使用して検証する
- Python ノートブックを作成します。 Lakeflow 宣言パイプラインの Wikipedia Python チュートリアルで提供されているサンプル ノートブックを使用できます。
- パイプラインを作成します。
- ワークスペースで、[ワークフロー] アイコンをクリック
サイドバーのジョブとパイプライン。
- [ 作成]、[ ETL パイプライン] の順にクリックします。
- 次の設定でパイプラインを構成します。
- パイプライン モード: サーバーレス
- ソース コード: 作成したノートブックを選択します。
- ストレージ オプション: Unity カタログ。 目的のカタログとスキーマを選択します。
- [ 作成] をクリックします。
- ワークスペースで、[ワークフロー] アイコンをクリック
- パイプラインを実行します。
- パイプライン ページで、[ 開始] をクリックします。
- パイプラインが完了するまで待ちます。
- 結果を確認する
- 信頼された宛先: パイプラインが正常に実行され、データが宛先に書き込まれます。
- 信頼されていない宛先: パイプラインは、ネットワーク アクセスがブロックされていることを示すエラーで失敗する必要があります。
Databricks SQL を使用して検証する
SQL Warehouse を作成します。
ネットワーク ポリシーによって制御されるリソースへのアクセスを試みるテスト クエリを SQL エディターで実行します。
結果を確認します。
- 信頼できる宛先: クエリは成功するはずです。
- 信頼されていない宛先: ネットワーク アクセス エラーでクエリが失敗します。
標準の Python ライブラリを使用して UDF からネットワークに接続するには、次の UDF 定義を実行します。
CREATE OR REPLACE TEMPORARY FUNCTION ping_google(value DOUBLE) RETURNS STRING LANGUAGE python AS $$ import requests url = "https://www.google.com" response = requests.get(url, timeout=5) if response.status_code == 200: return "UDF has network!" else: return "UDF has no network!" $$;
モデル サービスを使用して検証する
開始する前に
エンドポイントを提供するモデルが作成されると、モデルを提供するためにコンテナー イメージが構築されます。 このビルド ステージでは、ネットワーク ポリシーが適用されます。 ネットワーク ポリシーでサービスを提供するモデルを使用する場合は、次の点を考慮してください。
- 依存関係アクセス: PyPI からの Python パッケージや conda-forge、基本コンテナー イメージ、モデルの環境で指定された外部 URL のファイル、またはモデルの環境で必要な Docker コンテキストなどの外部ビルドの依存関係は、ネットワーク ポリシーによって許可されている必要があります。
- たとえば、モデルで、ビルド中にダウンロードする必要がある特定のバージョンの scikit-learn が必要な場合、ネットワーク ポリシーはパッケージをホストするリポジトリへのアクセスを許可する必要があります。
- ビルドエラー: ネットワーク ポリシーで必要な依存関係へのアクセスがブロックされている場合、コンテナー ビルドを提供するモデルは失敗します。 これにより、サービス エンドポイントが正常にデプロイされるのを防ぎ、正常に保存または機能できなくなる可能性があります。
拒否ログの確認を参照してください。
- 拒否のトラブルシューティング: ビルド フェーズ中のネットワーク アクセス拒否がログに記録されます。 これらのログには、値が
network_source_type
されたML Build
フィールドが表示されます。 この情報は、ビルドが正常に完了できるように、ネットワーク ポリシーに追加する必要がある特定のブロックされたリソースを識別するために重要です。
ランタイム ネットワーク アクセスを検証する
次の手順では、デプロイされたモデルのネットワーク ポリシーを、特に推論中に外部リソースへのアクセスが試みられる場合に、実行時にどのように検証するかを示します。 これは、モデル サービス コンテナーが正常にビルドされていることを前提としています。つまり、ビルド時の依存関係がネットワーク ポリシーで許可されています。
テスト モデルを作成する
Python ノートブックで、ファイルのダウンロードや API 要求の作成など、推論時にパブリック インターネット リソースへのアクセスを試みるモデルを作成します。
このノートブックを実行して、テスト ワークスペースにモデルを生成します。 次に例を示します。
import mlflow import mlflow.pyfunc import mlflow.sklearn import requests class DummyModel(mlflow.pyfunc.PythonModel): def load_context(self, context): # This method is called when the model is loaded by the serving environment. # No network access here in this example, but could be a place for it. pass def predict(self, _, model_input): # This method is called at inference time. first_row = model_input.iloc[0] try: # Attempting network access during prediction response = requests.get(first_row['host']) except requests.exceptions.RequestException as e: # Return the error details as text return f"Error: An error occurred - {e}" return [response.status_code] with mlflow.start_run(run_name='internet-access-model'): wrappedModel = DummyModel() # When this model is deployed to a serving endpoint, # the environment will be built. If this environment # itself (e.g., specified conda_env or python_env) # requires packages from the internet, the build-time SEG policy applies. mlflow.pyfunc.log_model( artifact_path="internet_access_ml_model", python_model=wrappedModel, registered_model_name="internet-http-access" )
サービス エンドポイントを作成する
- ワークスペースのナビゲーションで、[ AI/ML] を選択します。
- [ サービス ] タブをクリックします。
- [ サービス エンドポイントの作成] をクリックします。
- 次の設定でエンドポイントを構成します。
- サービス エンドポイント名: わかりやすい名前を指定します。
- エンティティの詳細: モデル レジストリ モデルを選択します。
- モデル: 前の手順で作成したモデルを選択します (
internet-http-access
)。
- [ 確認] をクリックします。
この段階で、コンテナー ビルド プロセスを提供するモデルが開始されます。
ML Build
のネットワーク ポリシーが適用されます。 依存関係のネットワーク アクセスがブロックされたためにビルドが失敗した場合、エンドポイントの準備は完了しません。 - サービス エンドポイントが 準備完了 状態になるまで待ちます。 準備に失敗した場合は、拒否ログで
network_source_type: ML Build
エントリを確認します。
拒否ログの確認を参照してください。
エンドポイントのクエリを実行します。
サービス エンドポイント ページの [クエリ エンドポイント ] オプションを使用して、テスト要求を送信します。
{ "dataframe_records": [{ "host": "[https://www.google.com](https://www.google.com)" }] }
実行時アクセスの結果を確認します。
- 実行時に有効になっているインターネット アクセス: クエリは成功し、
200
などの状態コードを返す必要があります。 - 実行時に制限されたインターネット アクセス: 接続タイムアウトまたはホスト解決エラーを示す、モデル コードの
try-except
ブロックからのエラー メッセージなど、ネットワーク アクセス エラーでクエリが失敗する必要があります。
- 実行時に有効になっているインターネット アクセス: クエリは成功し、
ネットワーク ポリシーを更新する
ネットワーク ポリシーは、作成後にいつでも更新できます。 ネットワーク ポリシーを更新するには:
- アカウント コンソール内のネットワーク ポリシーの詳細ページで、ポリシーを変更します。
- ネットワーク アクセス モードを変更します。
- 特定のサービスのドライラン モードを有効または無効にします。
- FQDN またはストレージの宛先を追加または削除します。
- [ 更新] をクリックします。
- 更新プログラムが既存のワークロードに適用されることを確認するには、 ネットワーク ポリシーの変更を適用する
を参照してください。
拒否ログを確認する
拒否ログは、Unity カタログの system.access.outbound_network
テーブルに格納されます。 これらのログは、送信ネットワーク要求が拒否されたときに追跡します。 拒否ログにアクセスするには、Unity カタログメタストアでアクセス スキーマが有効になっていることを確認します。 システム テーブルへのアクセスを参照してください。
拒否イベントを表示するには、次のような SQL クエリを使用します。 ドライラン ログが有効になっている場合、クエリは拒否ログとドライラン ログの両方を返します。このログは、access_type
列を使用して区別できます。 拒否ログには DROP 値があり、ドライラン ログにはDRY_RUN_DENIALが表示 されます。
次の例では、過去 2 時間のログを取得します。
select * from system.access.outbound_network
where event_time >= current_timestamp() - interval 2 hour
sort by event_time desc
ドライラン モードと外部のジェネレーティブ AI モデルの場合、次のことが当てはまります。
- ネットワーク ポリシーで必要な依存関係へのアクセスがブロックされている場合は、まず、
system.access.outbound_network
の拒否ログを確認します。 さらに、モデル サービス コンテナーのビルド ログによって、ブロックされたドメインに関する有用な情報が提供される場合があります。 - コンテナー ビルドを提供するモデルが失敗した場合は、
system.access.outbound_network
の拒否ログを確認して、ブロックされたドメインを特定します。 - モザイク AI サービスを介した外部モデル アクセスの適用は、ドライラン モードでも続行されます。
注
アクセス時間と拒否ログが表示される時間の間には、許容できる待機時間が発生する可能性があります。
制限事項
- 成果物のアップロード サイズ:
dbfs:/databricks/mlflow-tracking/<experiment_id>/<run_id>/artifacts/<artifactPath>
形式で MLflow の内部 Databricks ファイルシステムを使用する場合、成果物のアップロードは、log_artifact
、log_artifacts
、およびlog_model
API で 5 GB に制限されます。 - モデル サービス: モデル サービス用のイメージを構築する場合、エグレス 制御は適用されません。
- 有効期間の短いガベージ コレクション (GC) ワークロードの拒否ログ配信: 有効期間が 120 秒未満の GC ワークロードからの拒否ログは、ログの遅延のためにノードが終了する前に配信されない場合があります。 アクセスは引き続き適用されますが、対応するログ エントリが見つからない可能性があります。
- Databricks SQL ユーザー定義関数 (UDF) のネットワーク接続: Databricks SQL でネットワーク アクセスを有効にするには、Databricks アカウント チームにお問い合わせください。
- DLT Eventhook ログ: 別のワークスペースを対象とする Lakeflow 宣言パイプライン Eventhook はログに記録されません。 リージョン間ワークスペースおよび同じリージョン内のワークスペースの両方に構成されたEventhookに適用されます。
- クラウド間のネットワーク アクセス: Unity カタログの外部の場所に使用される S3 バケットを使用する Azure ワークスペースは、現在、サーバーレス ネットワーク ポリシーでは許可されていません。