サーバーレス エグレス制御のネットワーク ポリシーを管理する

このページでは、Azure Databricksのサーバーレス ワークロードからの送信ネットワーク接続を制御するネットワーク ポリシーを構成および管理する方法について説明します。

イングレス制御については、 コンテキストベースのイングレス制御に関するページを参照してください。

必要条件

Azure

  • Azure Databricks ワークスペースは Premium レベルである必要があります。

Azure China

  • Azure Databricks ワークスペースは Premium レベルである必要があります。
  • サーバーレス エグレス制御は、中国北部 3 リージョンでのみサポートされます。 ワークスペースは中国北部 3 にある必要があります。
  • Azure China アカウント コンソール(accounts.databricks.azure.cn)からネットワーク ポリシーにアクセスできます。
  • ネットワーク ポリシーを管理するためのアクセス許可は、アカウント管理者に制限されます。

ネットワーク ポリシーへのアクセス

アカウントでネットワーク ポリシーを作成、表示、更新するには:

  1. アカウント コンソールで、[セキュリティ] をクリックします。
  2. [ネットワーク] タブ クリックします。
  3. [ ポリシー] で、[ コンテキストベースのイングレスおよびエグレス制御] をクリックします。

ネットワーク ポリシーを作成する

  1. [新しいネットワーク ポリシー作成] をクリックします。

  2. ポリシー名を入力します。

  3. [ エグレス ] タブをクリックします。

    イングレス ルールを設定するには、「 イングレス ルールの設定」を参照してください。

  4. ネットワーク アクセス モードを選択します。

    • すべての宛先へのアクセスを許可する: 無制限の送信インターネット アクセス。 [フル アクセス] を選択した場合、送信インターネット アクセスは制限されません。
    • 特定の宛先への制限付きアクセス: 送信アクセスは、指定された宛先に制限されます。

ネットワーク ポリシーの詳細。

ネットワーク ポリシーを構成する

次の手順では、制限付きアクセス モードのオプション設定の概要を示します。

エグレス ルールを設定する

エグレス ルールを設定する前に、次の点に注意してください。

  • メタストアで S3 バケットを使用する場合は、 REST API を使用して、アクセスを成功させるためにエグレス許可リストにバケットを明示的に追加する必要があります。
  • サポートされている宛先の最大数は 2500 です。
  • 追加できるストレージ宛先 (allowed_storage_destinations) の数は、ポリシーごとに 100 に制限されます。
  • 許可されるドメインとして追加できる FQDN の数は、ポリシーごとに 100 に制限されます。
  • ロード バランサーのPrivate Link エントリとして追加されたドメインは、ネットワーク ポリシーで暗黙的に許可リストされます。 ドメインが削除された場合、またはプライベート エンドポイントが削除された場合、ネットワーク ポリシー制御によって変更が完全に適用されるまでに最大 24 時間かかる場合があります。 VNet 内のリソースへのプライベート接続を構成するを参照してください
  • OpenSharing バケットは、ネットワーク ポリシーで暗黙的に許可リストに登録されます。

Unity カタログ接続の暗黙的な許可リストは非推奨になりました。 非推奨になる前に暗黙的な許可リストを使用していたワークスペースを含むアカウントの場合、この動作は限られた移行期間に有効なままです。

  1. サーバーレス コンピューティングに追加のドメインへのアクセス権を付与するには、[許可されたドメイン] の一覧の上にある [宛先の追加] をクリックします。

    インターネットの宛先を追加します。

    FQDN フィルターを使用すると、同じ IP アドレスを共有しているすべてのドメインにアクセスできます。

    プロビジョニングされたスループット エンドポイントを提供するモデルでは、きめ細かな FQDN フィルター処理はサポートされていません。 ネットワーク アクセスを制限に設定すると、これらのエンドポイントのすべてのインターネット アクセスがブロックされます。

  2. ワークスペースが追加のAzureストレージ アカウントにアクセスできるようにするには、許可されたストレージの宛先 リストの上にある 宛先を追加 ボタンをクリックします。

    ストレージの宛先を追加します。

REPL や UDF などのユーザー コード コンテナーからクラウド ストレージ サービスへの直接アクセスは、既定では許可されません。 このアクセスを有効にするには、ポリシーの [許可されたドメイン] の下にストレージ リソースの FQDN を追加します。 ストレージ リソースのベース ドメインのみを追加すると、リージョン内のすべてのストレージ リソースへのアクセス権が誤って付与される可能性があります。

ポリシーの適用

ドライラン モードを使用すると、リソースへのアクセスを中断することなく、ポリシー構成をテストし、送信接続を監視できます。 ドライラン モードが有効になっている場合、ポリシーに違反する要求はログに記録されますが、ブロックされません。 選択できるオプションには、以下のものがあります。

  1. Databricks SQL: Databricks SQL ウェアハウスはドライラン モードで動作します。

  2. AI モデル サービス: モデル サービス エンドポイントはドライラン モードで動作します。

  3. すべての製品: すべてのAzure Databricks サービスがドライラン モードで動作し、他のすべての選択がオーバーライドされます。

    ネットワーク ポリシーのドライ ラン モード。

Azure中国では、個々の製品に対してドライラン モードを有効にすることはできません。 [ すべての製品 ] オプションのみを使用できます。すべての製品がドライラン モードで実行されるか、すべての製品にポリシーが適用されます。

インターネットの宛先をブロックする

この機能はパブリック プレビュー段階にあり、SEG 対象ワークスペースで使用できます。 まだ SEG 対象ではない Premium レベルのワークスペースの場合、ネットワーク アクセスが [フル アクセス] に設定されている場合、ブロックされた宛先は既定のポリシーでのみサポートされます。

サーバーレス ワークロードから特定のインターネット宛先をブロックします。 ブロックされた宛先は、全体的な強制モードを切り替えることなく、既知の無効なドメインをブロックするための 制限付きアクセス モードの軽量な代替手段として使用します。

ネットワーク ポリシー REST API を使用して、ブロック先を構成します。 API には、アカウント管理者の OAuth トークンが必要です。 アカウント レベルの API では、個人用アクセス トークンはサポートされていません。

OAuth マシン間認証を参照してください。

ブロックされた宛先は次のように動作します。

  • 各エントリは、destination(完全修飾ドメイン名、つまり FQDN)と internet_destination_typeDNS_NAME を指定します。
  • IP 範囲とストレージの宛先はサポートされていません。
  • ブロックされた宛先は、ポリシーのネットワーク アクセス モードに関係なく、常に適用されます。
  • ブロックされた宛先は、許可された宛先よりも優先されます。
  • この API は、許可された宛先がブロックされた宛先のサブドメインである構成を拒否します。 ただし、「広く許可し、狭くブロックする」パターンは許可されます(たとえば、example.com を許可し、api.example.com をブロックする)。

ネットワーク アクセスが system.access.outbound_network] に設定されている場合でも、拒否は Unity カタログの テーブルに記録されます。 拒否ログの確認を参照してください。

インターネットの宛先をブロックするには:

  1. ネットワーク ポリシーを取得します。 次のコマンドを実行します。

    <ACCOUNT_HOST>accounts.azuredatabricks.netに置き換えます。

    curl --location --request GET \
      'https://<ACCOUNT_HOST>/api/2.0/accounts/<ACCOUNT_ID>/network-policies/<NETWORK_POLICY_ID>' \
      --header 'Authorization: Bearer <OAUTH_TOKEN>'
    

    応答本文を network-policy.jsonとして保存します。

  2. network-policy.jsonを編集して、blocked_internet_destinationsの下にegress.network_accessを追加します。 次の例では、 フル アクセス モードで 1 つのドメインをブロックします。

    {
      "network_policy_id": "my-policy",
      "account_id": "...",
      "egress": {
        "network_access": {
          "restriction_mode": "FULL_ACCESS",
          "blocked_internet_destinations": [
            {
              "destination": "malicious-domain.example.com",
              "internet_destination_type": "DNS_NAME"
            }
          ]
        }
      }
    }
    
  3. 次のコマンドを使用して、 PUT 要求を含む更新されたポリシーを同じエンドポイントに送信します。 PUT本文には、完全なネットワーク ポリシーが含まれている必要があります。 省略したフィールドはすべてクリアされます。

    curl --location --request PUT \
      'https://<ACCOUNT_HOST>/api/2.0/accounts/<ACCOUNT_ID>/network-policies/<NETWORK_POLICY_ID>' \
      --header 'Content-Type: application/json' \
      --header 'Authorization: Bearer <OAUTH_TOKEN>' \
      --data @network-policy.json
    

databricks account network-policies update-network-policy-rpcを使用するか、Terraform databricks_account_network_policy リソースを使用して、Databricks CLI を使用してネットワーク ポリシーを管理することもできます。 コマンド グループaccount network-policies参照してください。

既定のポリシーを更新する

各Azure Databricks アカウントには、既定のポリシーが含まれています。 既定のポリシーは、新しく作成されたワークスペースを含め、明示的なネットワーク ポリシーの割り当てを持たないすべてのワークスペースに関連付けられます。 このポリシーは変更できますが、削除することはできません。

既定のポリシーは、Premium レベル以上のワークスペースにのみ適用されます。

ネットワーク ポリシーをワークスペースに関連付ける

追加の構成で既定のポリシーを更新した場合、既存のネットワーク ポリシーがないワークスペースに自動的に適用されます。

ワークスペースは Premium レベルである必要があります。

ワークスペースを別のポリシーに関連付けるには、次の操作を行います。

  1. ワークスペースを選択します。
  2. ネットワーク ポリシー で、[ネットワーク ポリシーを更新 ] をクリックします。
  3. 一覧から目的のネットワーク ポリシーを選択します。
  4. [ ポリシーの適用] をクリックします。

ネットワーク ポリシーを更新します。

ネットワーク ポリシーの変更を適用する

ほとんどのネットワーク構成の更新プログラムは、10 分以内にサーバーレス コンピューティングに自動的に反映されます。 これには、次のものが含まれます。

  • 新しい Unity カタログの外部の場所または接続を追加する。
  • ワークスペースを別のメタストアにアタッチする。
  • 許可されているストレージまたはインターネットの宛先の変更。

インターネット アクセスまたはドライラン モードの設定を変更する場合は、コンピューティングを再起動する必要があります。

サーバーレス ワークロードを再起動または再デプロイする

更新する必要があるのは、インターネット アクセス モードを切り替える場合、またはドライラン モードを更新する場合のみです。

適切な再起動プロシージャを決定するには、製品別に次のリストを参照してください。

  • Databricks ML Serving: ML サービス エンドポイントを再デプロイします。 「カスタム モデル サービス エンドポイントの作成」を参照してください
  • パイプライン: 実行中の Lakeflow パイプラインを停止してから再起動します。 「パイプラインの更新を実行する」を参照してください。
  • サーバーレス SQL ウェアハウス: SQL ウェアハウスを停止して再起動します。 SQL ウェアハウスの管理を参照してください。
  • Lakeflow ジョブ: ネットワーク ポリシーの変更は、新しいジョブの実行がトリガーされるか、既存のジョブの実行が再起動されたときに自動的に適用されます。
  • ノートブック:
    • ノートブックが Spark と対話しない場合は、サーバーレス コンピューティングを終了してから再アタッチして、ネットワーク ポリシーを更新できます。
    • ノートブックが Spark と対話すると、サーバーレス リソースが更新され、変更が自動的に検出されます。 ほとんどの変更は 10 分で更新されますが、インターネット アクセス モードの切り替え、ドライラン モードの更新、または適用の種類が異なる添付ポリシー間の変更には最大 24 時間かかることがあります。 これらの特定の種類の変更を迅速に更新するには、関連付けられているすべてのノートブックとジョブをオフにします。

宣言型オートメーション バンドルの UI 依存関係

サーバーレス エグレス制御で制限付きアクセス モードを使用する場合、宣言型オートメーション バンドルの UI 機能では、特定の外部ドメインへのアクセスが必要になります。 送信アクセスが完全に制限されている場合、宣言型オートメーション バンドルを使用すると、ワークスペース インターフェイスにエラーが表示されることがあります。

制限付きネットワーク ポリシーで動作する宣言型オートメーション バンドル UI 機能を維持するには、ポリシーの 許可されたドメイン に次のドメインを追加します。

  • github.com
  • objects.githubusercontent.com
  • release-assets.githubusercontent.com
  • checkpoint-api.hashicorp.com
  • releases.hashicorp.com
  • registry.terraform.io

ネットワーク ポリシーの適用を確認する

異なるサーバーレス ワークロードから制限されたリソースにアクセスしようとすると、ネットワーク ポリシーが正しく適用されていることを検証できます。 検証プロセスは、サーバーレス製品によって異なります。

Lakeflow パイプライン

  1. Python ノートブックを作成します。 Lakeflow パイプライン Wikipedia Python チュートリアルで提供されているノートブックの例を使用できます。
  2. パイプラインを作成します。
    1. ワークスペースで、[ワークフロー] アイコンをクリックします。サイドバーのジョブとパイプライン
    2. [ 作成]、[ ETL パイプライン] の順にクリックします。
    3. 次の設定でパイプラインを構成します。
      • パイプライン モード: サーバーレス
      • ソース コード: 作成したノートブックを選択します。
      • ストレージ オプション: Unity カタログ。 目的のカタログとスキーマを選択します。
    4. [ 作成] をクリックします。
  3. パイプラインを実行します。
  4. パイプライン ページで、[ 開始] をクリックします。
  5. パイプラインが完了するまで待ちます。
  6. 結果を確認する
    • 信頼された宛先: パイプラインは正常に実行され、データが宛先に書き込まれます。
    • 信頼されていない宛先: パイプラインは、ネットワーク アクセスがブロックされていることを示すエラーで失敗します。

Databricks SQL (ダタブリックス SQL)

Databricks SQL を使用して検証する

  1. SQL ウェアハウスを作成します。

  2. ネットワーク ポリシーによって制御されるリソースへのアクセスを試みるテスト クエリを SQL エディターで実行します。

  3. 結果を確認します。

    • 信頼できる宛先: クエリは成功します。
    • 信頼されていない宛先: ネットワーク アクセス エラーでクエリが失敗します。
  4. 標準の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!"
    $$;
    

Model Serving

モデル サービスを使用して検証する

開始する前に

エンドポイントを提供するモデルが作成されると、モデルを提供するためにコンテナー イメージが構築されます。 このビルド ステージでは、ネットワーク ポリシーが適用されます。 ネットワーク ポリシーでサービスを提供するモデルを使用する場合は、次の点を考慮してください。

  • Dependency access: PyPI からのPython パッケージ、conda-forge、基本コンテナー イメージ、モデルの環境で指定された外部 URL またはモデルの環境で必要な Docker コンテキストからのファイルなどの外部ビルドの依存関係は、ネットワーク ポリシーで許可されている必要があります。
    • たとえば、モデルで、ビルド中にダウンロードする必要がある特定のバージョンの scikit-learn が必要な場合、ネットワーク ポリシーはパッケージをホストするリポジトリへのアクセスを許可する必要があります。
  • ビルドエラー: ネットワーク ポリシーで必要な依存関係へのアクセスがブロックされている場合、コンテナー ビルドを提供するモデルは失敗します。 これにより、サービス エンドポイントが正常にデプロイされるのを防ぎ、正常に格納または機能できなくなる可能性があります。 拒否ログの確認を参照してください。
  • 拒否のトラブルシューティング: ビルド フェーズ中のネットワーク アクセス拒否がログに記録されます。 これらのログには、値がnetwork_source_typeされたML Build フィールドが含まれています。 この情報は、ビルドが正常に完了できるように、ネットワーク ポリシーに追加する必要がある特定のブロックされたリソースを識別するために重要です。

ランタイム ネットワーク アクセスを検証する

次の手順では、デプロイされたモデルのネットワーク ポリシーを、特に推論中に外部リソースへのアクセスが試みられる場合に、実行時にどのように検証するかを示します。 これは、モデル サービス コンテナーが正常にビルドされていることを前提としています。つまり、ビルド時の依存関係がネットワーク ポリシーで許可されています。

  1. テスト モデルを作成する

    1. Python ノートブックで、ファイルのダウンロードや API 要求の作成など、推論時にパブリック インターネット リソースへのアクセスを試みるモデルを作成します。

    2. このノートブックを実行して、テスト ワークスペースにモデルを生成します。 次に例を示します。

      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 serverless network policy applies.
          mlflow.pyfunc.log_model(
              artifact_path="internet_access_ml_model",
              python_model=wrappedModel,
              registered_model_name="internet-http-access"
          )
      
  2. サービス エンドポイントを作成する

    1. ワークスペースのナビゲーションで、[ AI/ML] を選択します。
    2. [ サービス ] タブをクリックします。
    3. [ サービス エンドポイントの作成] をクリックします。
    4. 次の設定でエンドポイントを構成します。
      • サービス エンドポイント名: わかりやすい名前を指定します。
      • エンティティの詳細: モデル レジストリ モデルを選択します。
      • モデル: 前の手順で作成したモデルを選択します (internet-http-access)。
    5. [ 確認] をクリックします。 この段階で、コンテナー ビルド プロセスを提供するモデルが開始されます。 ML Buildのネットワーク ポリシーが適用されます。 依存関係のネットワーク アクセスがブロックされたためにビルドが失敗した場合、エンドポイントの準備は完了しません。
    6. サービス エンドポイントが 準備完了 状態になるまで待ちます。 準備に失敗した場合は、拒否ログで network_source_type: ML Build エントリを確認します。 拒否ログの確認を参照してください。
  3. エンドポイントのクエリを実行します。

    1. サービス エンドポイント ページの [クエリ エンドポイント ] オプションを使用して、テスト要求を送信します。

      { "dataframe_records": [{ "host": "[https://www.google.com](https://www.google.com)" }] }
      
  4. 実行時アクセスの結果を確認します。

    • 実行時に有効になっているインターネット アクセス: クエリは成功し、 200などの状態コードを返します。
    • 実行時に制限されたインターネット アクセス: 接続タイムアウトまたはホスト解決エラーを示す、モデル コードの try-except ブロックからのエラー メッセージなど、ネットワーク アクセス エラーでクエリが失敗します。

ネットワーク ポリシーを更新する

ネットワーク ポリシーは、作成後にいつでも更新できます。 ネットワーク ポリシーを更新するには:

  1. アカウント コンソール内のネットワーク ポリシーの詳細ページで、ポリシーを変更します。
    • ネットワーク アクセス モードを変更します。
    • 特定のサービスのドライラン モードを有効または無効にします。
    • FQDN またはストレージの宛先を追加または削除します。
  2. [ 更新] をクリックします。
  3. 更新プログラムが既存のワークロードに適用されることを確認するには、 ネットワーク ポリシーの変更を適用する を参照してください。

拒否ログを確認する

拒否ログは、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
ORDER BY event_time DESC;

ドライラン モードと外部 AI モデルの場合、次のことが当てはまります。

  • ネットワーク ポリシーで必要な依存関係へのアクセスがブロックされている場合は、まず、 system.access.outbound_networkの拒否ログを確認します。 さらに、モデル サービス コンテナーのビルド ログによって、ブロックされたドメインに関する有用な情報が提供される場合があります。
  • コンテナー ビルドを提供するモデルが失敗した場合は、 system.access.outbound_network の拒否ログを確認して、ブロックされたドメインを特定します。
  • モデル サービスを使用した外部モデル アクセスの適用は、ドライラン モードでも続行されます。

アクセス時間と拒否ログが表示される時間の間には、許容できる待機時間が発生する可能性があります。

制限事項

  • 成果物のアップロード サイズ: dbfs:/databricks/mlflow-tracking/<experiment_id>/<run_id>/artifacts/<artifactPath> 形式で MLflow の内部 Databricks ファイル システムを使用する場合、成果物のアップロードは、 log_artifactlog_artifacts、および log_model API で 5 GB に制限されます。
  • 有効期間の短いガベージ コレクション (GC) ワークロードの拒否ログ配信: 有効期間が 120 秒未満の GC ワークロードからの拒否ログは、ログの遅延のためにノードが終了する前に配信されない場合があります。 アクセスは引き続き適用されますが、対応するログ エントリが見つからない可能性があります。
  • Databricks SQL ユーザー定義関数 (UDF) のネットワーク接続: Databricks SQL でネットワーク アクセスを有効にするには、Databricks アカウント チームにお問い合わせください。
  • パイプライン eventhook ログ: 別のワークスペースを対象とする Lakeflow パイプラインの eventhook はログに記録されません。 リージョン間ワークスペースおよび同じリージョン内のワークスペースの両方に構成されたEventhookに適用されます。
  • Unity カタログ ワークスペース のバインドの変更: Unity カタログ ワークスペースバインドの変更が有効になるまでに最大 24 時間かかることがあります。 このプロセスを迅速化するには、ストレージ バケットをネットワーク ポリシーに追加します。 ワークスペース カタログのバインドを参照してください。
  • クラウド間のネットワーク アクセス: Unity カタログの外部の場所に使用される S3 バケットを使用するAzure ワークスペースは、サーバーレス ネットワーク ポリシーでは現在許可されていません。

次のステップ

  • コンテキストベースのイングレス制御の構成: ID、要求の種類、ネットワーク ソースに基づいて受信アクセス ポリシーを定義し、ワークスペース アクセスをセキュリティで保護します。 コンテキストベースのイングレス制御を参照してください。
  • プライベート エンドポイント ルールの管理: セキュリティ強化のために接続を許可または拒否する特定の規則を定義して、プライベート エンドポイントとの間のネットワーク トラフィックを制御します。 プライベート エンドポイント ルールを管理するを参照してください。
  • サーバーレス コンピューティング アクセス用のファイアウォールを構成する: サーバーレス コンピューティング環境の受信および送信ネットワーク接続を制限してセキュリティで保護するファイアウォールを実装します。 「サーバーレス コンピューティング アクセス用のファイアウォールの構成」を参照してください。
  • データ転送と接続のコストを理解する: サーバーレス ワークロードのネットワーク セキュリティ制御とプライベート接続を実装するときのコストへの影響について説明します。 Databricks のネットワーク コストを理解するを参照してください。