ファイアウォールを使用してワークスペースのネットワークエグレスを制限する

デフォルトにより、Google クラウドはVPCからのすべての下り(外向き)トラフィックを許可します。 必要に応じて、組織に必要な重要なサービスと送信先のみに出力を制限するようにワークスペースを構成することもできます。 重要なサービスを許可するには、Google クラウド ネットワーク ( VPC ) と、 Databricksがワークスペース用に作成するファイアウォールを変更する必要があります。 一部のサービスでは、プライベート IP アドレス経由で Google と通信するための プライベート Google アクセス を設定できます。APIs

これらの Google クラウド機能の仕組みに関する最新情報については、 Google クラウドのドキュメントを参照してください。

Databricks Web アプリケーションに接続するように企業ドメイン名ファイアウォールを構成する場合は、代わりに「 ドメイン名ファイアウォール規則の構成」を参照してください。

クラシック コンピュート プレーンとコントロール プレーンの定義を含むDatabricksアーキテクチャの概要については、 Databricksアーキテクチャの概要」を参照してください。

ファイアウォール構成の概要

従来のコンピュート プレーンからの出力を制限する場合は、通常はブロックされる必要な接続を許可するために、次の 2 種類の一般的な構成を行う必要があります。

  • GCR と GCS の限定公開の Google アクセス: 既定では、Databricks クラスター ノードなどのコンピュート エンジン仮想マシン (VM) にネットワーク インターフェイスに割り当てられた外部 (パブリック) IP アドレスがない場合、他の内部 IP アドレスの宛先にのみパケットを送信できます。 VM のネットワークAPIs インターフェースが使用するサブネットで 限定公開の Google アクセス(PGA) を有効にすることで、これらの VM が Google の やサービスで使用される一連の外部 IP アドレスに接続できるようにすることができます。PGA では、Databricks コンピュート プレーンとこれらの Google サービス間の直接通信は、パブリック インターネットではなく Google の内部ネットワークを使用します。 これは、コンピュートプレーンからの次の発信接続に影響します。

    • 従来のコンピュート プレーンは、Google Container Registry (GCR)を使用してDatabricksイメージを取得します。

    • 従来のコンピュート プレーンはGoogle Cloud Storage ( GCS )を使用して、ワークスペースのヘルスチェック ログと使用状況ログを書き込みます。

  • コントロール プレーン サービスのファイアウォール規則: 組み込みのファイアウォールを変更してエグレスをブロックした後、新しいファイアウォール規則を追加して、いくつかの重要なサービスを許可する必要があります。

    • ポート 443 上の Web アプリケーションおよび REST APIsへの出力。

    • ポート 443 の セキュア・クラスター接続 リレーへの出力。

    • デフォルトへのエグレスは、ポート 3306 で Hive metastore します。 独自の外部メタストアを展開する場合は、未使用のデフォルト メタストアにネットワーク ルールを追加する必要はありません。

    • ポート 8443 から 8451 のエグレスは、今後の機能をサポートします。

    Web アプリケーション、安全なクラスター接続リレー、およびデフォルトのHive metastoreの IP アドレス範囲は、リージョンによって異なります。 リージョンの値については、「 IP アドレスとドメイン」の表を参照してください。

この記事では、 gcloud コマンドライン インターフェース(CLI)を使用した Google クラウドの設定例を紹介します。 これらの例を使用するには、 Google クラウド SDK をインストールする必要があります。

コントロール プレーン サービス エンドポイントの IP アドレス (リージョン別)

エグレスをブロックするようにファイアウォールを構成する場合は、新しい VPC エグレス ファイアウォール ルールとルートを定義して、Databricks コントロール プレーンでホストされている重要なサービスを許可する必要があります。 エンドポイントの IP アドレスは、Databricks ワークスペースの Google クラウド リージョンによって異なります。 「IP アドレスとドメイン」の表を使用して、ワークスペースの Google クラウド リージョンのコントロール プレーン イングレスのポート と IP アドレス を取得します。

ステップ 1: ネットワークのサイジングを計画する

大規模なクラスターまたは多数のワークスペースを使用する予定の場合は、 ネットワーク サイジング計算ツールを使用して GKE サブネット範囲を計算し、Databricks ジョブを実行するのに十分な IP スペースがワークスペースにあることを確認します。

Databricks ワークスペースで使用される GKE サブネットは、ワークスペースのデプロイ後に変更できないため、正確に構成してください。 Databricks サブネットのアドレス範囲が小さすぎると、ワークスペースの IP 空間が使い果たされ、Databricks ジョブが失敗します。 必要なアドレス範囲のサイズを決定するために、Databricks には Microsoft Excel スプレッドシートの形式で計算ツールが用意されています。 「 新しいワークスペースのサブネット サイズを計算する」を参照してください。

ステップ 2: ワークスペースを作成する

  1. アカウントコンソールにログインします

  2. 新しい Databricks ワークスペースを作成します

    • ワークスペースを作成するフォームの [ Advanced Configuration ] セクションで、[ Enable private cluster] のデフォルト設定を使用して、ワークスペースでプライベート GKE クラスターを使用する必要があります。 プライベート GKE クラスターの場合、Databricks コンピュート インスタンスにはパブリック IP アドレスがありません。

    • ワークスペースの作成時に [ 詳細構成 ] セクションに表示されるすべての IP サブネット設定を書き留めます。 デフォルトはありますが、上書きできます。 詳しくは、 アカウントコンソールを使用したワークスペースの作成をご覧ください。

      ファイアウォール サブネット
  3. Google アカウントの Databricks VPC とサブネットで Private Google Access (PGA) が有効になっていることを確認します。

    ファイアウォールPGA

ステップ 3: VPC ファイアウォール ルールを追加する

ここで、Databricks が新しいワークスペース用に作成したファイアウォールにファイアウォール規則を追加する必要があります。

  1. VPC 名を取得します。 Databricks は、ワークスペース作成の一環として、この VPC を Google アカウントに作成しました。

    1. アカウントコンソールのワークスペースページで、ワークスペースをクリックして起動します。

    2. ?o=の後の URL の数値部分をコピーします。たとえば、ワークスペース URL が https://1676665108650415.5.gcp.databricks.com/?o=1676665108650415#の場合、ワークスペース ID は 1676665108650415 です。

    3. ワークスペースの VPC の名前は databricks-managed-<workspace-ID>です。 たとえば、 databricks-managed-1676665108650415です。 この値を書き留めて、CLI コマンドで使用できるようにします。

  2. Google コンソールを使用してファイアウォール ルールを追加する場合:

    1. Google クラウドコンソールの VPC ページに移動します。

    2. ワークスペースの VPC 名と一致するネットワークの VPC 名をクリックします。

    3. ファイアウォールルール 」タブをクリックします。

  3. 0.0.0.0/0へのエグレスをブロックするルールを追加します。これは、すべての外部 IP アドレスを意味する特殊な構文です。

    デフォルトでは、Google クラウドは VPC からのすべての下り(外向き)トラフィックを許可します。 このトラフィックをブロックするルールを作成する必要があります。 このルールの優先度が大きな数値に設定されていることを確認します。 目的は、Google クラウドが他のすべてのルールを実行した後に、このルールを適用することです。 たとえば、このルールを優先度1100に設定し、後でエグレス・ルールの優先度を1000〜1099の範囲で設定できます。

    重要

    このルールに低い優先度の値を誤って使用すると、Google クラウドは重要な Databricks サービスと GKE サービスへのネットワーク トラフィックを拒否し、ワークスペースが使用できなくなります。

    この規則により、内部 IP 空間 (10.0.0.0/8、172.16.0.0/20、192.168.0.0/16) に向かうトラフィックには、クラスターがそれらの IP アドレスに到達できるようにするための追加のエグレス規則が必要です。

    次の gcloud CLI コマンドを使用して、このルールを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。

     gcloud compute firewall-rules create deny-egress
     --action DENY
     --rules all
     --destination-ranges 0.0.0.0/0
     --direction EGRESS
     --priority 1100
     --network <vpc-name>
    
  4. Google ヘルスチェックからのイングレスを許可するルールを追加します。

    次の gcloud CLI コマンドを使用して、このルールを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。

    gcloud compute firewall-rules create from-gcp-healthcheck \
    --action ALLOW \
    --rules tcp:80,tcp:443 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 \
    --direction INGRESS \
    --priority 1010 \
    --network <vpc-name>
    
  5. Google ヘルスチェックへの下り(外向き)を許可するルールを追加します。

    次の gcloud CLI コマンドを使用して、このルールを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。

    gcloud compute firewall-rules create to-gcp-healthcheck \
    --action ALLOW \
    --rules tcp:80,tcp:443 \
    --destination-ranges 130.211.0.0/22,35.191.0.0/16 \
    --direction EGRESS \
    --priority 1000 \
    --network <vpc-name>
    
  6. 制限付き APIs (restricted.googleapis.com)へのエグレスを許可するルールを追加します。 これは、固定 IP アドレス範囲で GKE API に到達するために必要です。

    次の gcloud CLI コマンドを使用して、このルールを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。

    gcloud compute firewall-rules create to-google-apis \
    --action ALLOW \
    --rules all \
    --destination-ranges 199.36.153.4/30 \
    --direction EGRESS \
    --priority 1000 \
    --network <vpc-name>
    
  7. GKE マスター リソースの IP 範囲への下り(外向き)を許可するルールを追加します。 デフォルトの GKE マスター IP 範囲がありますが、ワークスペースの作成時に値をオーバーライドできます。 「 アカウントコンソールを使用したワークスペースの作成」を参照してください。

    次の gcloud CLI コマンドを使用して、このルールを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。X.X.X.X/28 を GKE マスター リソースの IP 範囲に置き換えます。

    gcloud compute firewall-rules create to-gke-master \
    --action ALLOW \
    --rules tcp:443,tcp:10250 \
    --destination-ranges X.X.X.X/28 \
    --direction EGRESS \
    --priority 1000 \
    --network <vpc-name>
    
  8. Databricks ワークスペースで使用されるサブネット内通信 (エグレス) を許可するルールを追加します。 これらのサブネットのデフォルトは、ワークスペースの作成時に [ 詳細構成 ] セクションに表示されます。 ユーザー インターフェースで GKE ノードのプライマリ IP 範囲、GKE ポッドのセカンダリ IP 範囲、GKE サービスのセカンダリ IP 範囲としてラベル付けされている 3 つのサブネット範囲すべてへのエグレスを許可する必要があります。

    次の gcloud CLI コマンドを使用して、このルールを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。X.X.X.X/X,X.X.X.X/X,X.X.X.X/X を、ワークスペースの作成時に指定した 3 つの Databricks サブネットに置き換えます。

    gcloud compute firewall-rules create to-gke-nodes-subnet \
    --action ALLOW \
    --rules all \
    --destination-ranges X.X.X.X/X,X.X.X.X/X,X.X.X.X/X \
    --direction EGRESS \
    --priority 1000 \
    --network <vpc-name>
    
  9. Databricks コントロール プレーン サービスへのエグレスを許可するルールを追加します。 「IP アドレスとドメイン」の表を使用して、これらのサービスでサポートされている各 Databricks リージョンの正しい値を決定します。

    メイン Web アプリケーションへの接続と、ポート 443 での セキュア クラスター接続 (SCC) リレーを許可します。 このルールを作成するには、次の gcloud CLI コマンドを使用します。 <vpc-name> を実際の VPC 名に置き換えます。X.X.X.X を Web アプリケーションのリージョンのイングレス アドレスに置き換えます。Y.Y.Y.Y を SCC リレーの地域 IP アドレス範囲に置き換えます。

    gcloud compute firewall-rules create to-databricks-control-plane \
    --action ALLOW \
    --rules tcp:443 \
    --destination-ranges X.X.X.X/32,Y.Y.Y.Y/32 \
    --direction EGRESS \
    --priority 1000 \
    --network <vpc-name>
    
  10. デフォルト メタストアを使用する場合は、ポート 3306 でのメタストアへの接続を許可するルールを追加します。 このルールを作成するには、次の gcloud CLI コマンドを使用します。 <vpc-name> を実際の VPC 名に置き換えます。X.X.X.X を、デフォルト メタストアのリージョン IP アドレス範囲に置き換えます。

    gcloud compute firewall-rules create to-databricks-managed-hive \
    --action ALLOW \
    --rules tcp:3306 \
    --destination-ranges X.X.X.X/32 \
    --direction EGRESS \
    --priority 1000 \
    --network <vpc-name>
    

    重要

    独自のメタストア インスタンスをデプロイした場合は、デフォルト メタストアではなく、そのインスタンスへの接続を許可するルールを作成します。

  11. データソースまたは他のシステムへの必要な接続を許可するために組織が必要とするその他のネットワーク・エグレス・ルールを追加します。

    重要

    カスタム・エグレス・ ALLOW ・ルールの場合は、1000〜1099の範囲でプライオリティ番号を設定します。 プライオリティ番号は、前の手順でプライオリティ 1100 に設定されたすべての出力をブロックするために使用した値よりも小さいことが重要です。

ファイアウォール規則は次のようになりますが、ワークスペースの リージョンのコントロール プレーン サービスにはリージョン IP アドレス を使用する必要があります。

ファイアウォール ルール

ステップ 4: VPC ルートを更新する

Google クラウドルート は、ネットワーク トラフィックが仮想マシン(VM)インスタンスから他の宛先にたどるパスを定義します。 VPC ネットワークでは、ルートは CIDR 形式の 1 つの宛先プレフィックスと 1 つのネクストホップで構成されます。

  1. VPCで自動的に作成されたデフォルトルート(デフォルトインターネットゲートウェイをネクストホップとして 0.0.0.0/0 )を削除します。 コンソール UI を使用してこのルートを削除し、インターネットへのパスをクリアします。

    1. Googleクラウドコンソールのルートリストに移動します。

    2. 0.0.0.0/0するルートを選択し、[削除] をクリックします。

      ルートの削除
  2. 制限された Google APIs サブネット(199.36.153.4/30)にトラフィックを送信するルートを VPC に作成します。 ネクストホップをdefault-internet-gatewayとして設定するには、限定公開の Google APIsにアクセスします。

    次の gcloud CLI コマンドを使用して、このルートを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。<project-name> をプロジェクト名に置き換えます。

    gcloud beta compute routes create route-to-google-apis \
    --project=<project-name> --description="Route to Google restricted APIs" \
    --network=<vpc-name> \
    --priority=1000 \
    --destination-range=199.36.153.4/30 \
    --next-hop-gateway=default-internet-gateway
    
  3. Databricks コントロール プレーン サービスに到達するためのルートを作成します。 [IP アドレスとドメイン] でリージョンの値を取得します。

    次の gcloud CLI コマンドを使用して、Web アプリケーションへのルートを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。<project-name> をプロジェクト名に置き換えます。X.X.X.X/32 を Web アプリケーションのリージョン IP アドレス範囲に置き換えます。

    gcloud beta compute routes create route-to-databricks-scc-service \
    --project=<project-name> --description="Route to Databricks web app" \
    --network=<vpc-name> \
    --priority=1000 \
    --destination-range=X.X.X.X/32 \
    --next-hop-gateway=default-internet-gateway
    

    以下の gcloud CLI コマンドを使用して、 セキュア・クラスター接続 リレーへの経路を作成できます。 <vpc-name> を実際の VPC 名に置き換えます。<project-name> をプロジェクト名に置き換えます。X.X.X.X/32 を SCC リレーの地域 IP アドレス範囲に置き換えます。

    gcloud beta compute routes create route-to-databricks-scc-service \
    --project=<project-name> --description="Route to Databricks SCC relay" \
    --network=<vpc-name> \
    --priority=1000 \
    --destination-range=X.X.X.X/32 \
    --next-hop-gateway=default-internet-gateway
    

    デフォルト メタストアを使用する場合は、次の gcloud CLI コマンドを使用して、デフォルト メタストアへのルートを作成します。 <vpc-name> を実際の VPC 名に置き換えます。<project-name> をプロジェクト名に置き換えます。X.X.X.X/32 をメタストアのリージョン IP アドレス範囲に置き換えます。

    gcloud beta compute routes create route-to-databricks-scc-service \
    --project=<project-name> --description="Route to default metastore" \
    --network=<vpc-name> \
    --priority=1000 \
    --destination-range=X.X.X.X/32 \
    --next-hop-gateway=default-internet-gateway
    

ステップ 5: Google APIs の DNS ゾーンを作成して、GCS と GCR の Google プライベート アクセスを有効にする

ここで、Google 用の DNS ゾーンを作成する必要があります。これは、クラシックAPIs コンピュート プレーンからAPIs GCSと GCR の 2 つの Google への Google プライベート アクセスを有効にするために必要なものです。GPAの有効化の詳細については、Googleのドキュメント記事「 限定公開のGoogleアクセスの設定」を参照してください。

  1. クラウド DNS を使用して、ドメイン googleapis.com の VPC 内の DNS をカスタマイズします。 通常、 googleapis.com はパブリック IP アドレスに解決されますが、Google プライベート アクセスの場合は restricted.googleapis.comを使用する必要があります。 このドメインは、Google クラウド ネットワーク内でアクセス可能な特定の範囲 199.36.153.4/30に解決されます。

    Databricksクラシック コンピュート プレーン GKE クラスターには、 GCSおよび GCR へのアクセスが必要です。 PGA の場合、制限されたAPIsへのアクセスが解決されていることを確認する必要があります。そうしないと、GKE が正常に起動しません。

    次の gcloud コマンドを使用して、DNS ゾーンを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。

    gcloud dns managed-zones create google-apis \
    --description "private zone for Google APIs" \
    --dns-name googleapis.com \
    --visibility private \
    --networks VPC-NAME
    
    gcloud dns record-sets transaction start --zone google-apis
    
    gcloud dns record-sets transaction add restricted.googleapis.com. \
    --name *.googleapis.com \
    --ttl 300 \
    --type CNAME \
    --zone google-apis
    
    gcloud dns record-sets transaction add "199.36.153.4" "199.36.153.5" "199.36.153.6" "199.36.153.7" \
    --name restricted.googleapis.com \
    --ttl 300 \
    --type A \
    --zone google-apis
    gcloud dns record-sets transaction execute --zone google-apis
    

    Google クラウドコンソールのオブジェクトは、次のようになります。

    APIのゾーン
  2. GCR.io ドメインに対して同様のゾーン設定を行い、コンテナ レジストリに到達するために制限された Google APIs サブネットにトラフィックを送信します。 これらの変更がないと、必要なすべての Databricks ランタイム コンテナをプルダウンできないため、GKE クラスターは正常に立ち上がれません。

    次の gcloud コマンドを使用して、これらの DNS ゾーンを作成できます。 <vpc-name> を実際の VPC 名に置き換えます。

    gcloud dns managed-zones create gcr-io \
    --description "private zone for GCR.io" \
    --dns-name gcr.io \
    --visibility private \
    --networks <vpc-name>
    
    gcloud dns record-sets transaction start --zone gcr-io
    gcloud dns record-sets transaction add gcr.io. \
    --name *.gcr.io \
    --ttl 300 \
    --type CNAME \
    --zone gcr-io
    
    gcloud dns record-sets transaction add "199.36.153.4" "199.36.153.5" "199.36.153.6" "199.36.153.7" \
    --name gcr.io \
    --ttl 300 \
    --type A \
    --zone gcr-io
    gcloud dns record-sets transaction execute --zone gcr-io
    

    Google クラウドコンソールのオブジェクトは、次のようになります。

    GCRのゾーン

ステップ 6: 構成を検証する

  1. Databricks クラスターを作成して開始します。

  2. 正常に起動し、状態 が Running であることを確認するまで待ちます。

    クラスターの検証
  3. Google クラウド コンソールの GKE ワークロード ページに移動します。

  4. クラスターピッカーで 、クラスターを選択します 。 ワークスペースのクラスター名には、名前 db- の後に大きな数値である Databricks ワークスペース ID が続きます。

  5. すべてのサービスのステータスが [OK] と表示されていることを確認します。

    サービスの検証

トラブルシューティング

Cannot start GKE クラスター

GKE クラスターが起動しない場合は、Databricks ワークスペースで使用されている VPC で限定公開の Google アクセスが有効になっているときに、DNS の設定に誤りがある可能性があります。 ノードが googleapis ホスト名を解決できない場合、登録に失敗し、最終的に GKE クラスターの作成に失敗する可能性があります。

ログを表示するには、対応する GKE ノードのシリアルポートログを確認します。 次のようなエラーが表示される場合があります。

>>> [ 203.604558] configure.sh[948]: curl: (6) Couldn't resolve host '

>>> storage.googleapis.com'

>>> [ 203.605422] configure.sh[948]: == Failed to download

>>> https://storage.googleapis.com/gke-release/npd-custom-plugins/v1.0.1/npd-custom-plugins-v1.0.1.tar.gz.

>>> Retrying. ==

>>> [ 203.614049] configure.sh[948]:

>>> https://www.googleapis.com/auth/devstorage.read_write

クラスターは VPC ネットワークを使用しているため、このクラスターが存在するサブネットでは限定公開の Google アクセスが有効になっています。 限定公開の Google アクセスの設定は、 この Google PGA ドキュメントの手順に従って完了する必要があります。

GKE クラスターが動作を停止するか、以前の試行で正常に開始できた後に開始できない

GKE をホストしているプロジェクトでコンピュート エンジン サービス アカウントが正しく構成されていないため、GKE クラスターが動作を停止したり、GKE クラスターを開始できなかったりすることがあります。 問題のあるクラスターのノードに関連付けられているコンピュート エンジンの既定のサービス アカウントが 'disabled' 状態になっているか、必要な最低限のロールを持っていません。 サービス アカウントは <project-id>-compute@developer.gserviceaccount.comです。

ノード登録の失敗の原因は、問題のあるクラスターのそのノードにアタッチされているこのサービス アカウントの無効状態が原因である可能性があります。

この Google ヘルプセンターの記事に従ってサービス アカウントを有効にし、クラスターまたはノード プールを再作成して、問題が解決するかどうかを確認してください。

また、Google クラウドコンソールを使用して、IAMと管理ページでサービスアカウントと問題のあるクラスターの対応するノードを確認することもできます。

デフォルトでは、コンピュートエンジンのデフォルトのサービスアカウントは、IAM プロジェクトエディタロールで作成されます。 次のようにして、最低限必要なロールに変更できます。

  1. デフォルト コンピュート サービス アカウントに割り当てられている現在のロールを取得します。

    gcloud projects get-iam-policy {{project-id}}  \
    --flatten="bindings[].members" \
    --format='table(bindings.role)' \
    --filter="bindings.members:{{project-id}}-compute@developer.gserviceaccount.com"
    
  2. デフォルト コンピュート サービス アカウントに必要な最小限のロールを追加する

    gcloud projects add-iam-policy-binding {{project-id}} \
    --member "serviceAccount:{{project-id}}-compute@developer.gserviceaccount.com" \
    --role roles/logging.logWriter
    
    gcloud projects add-iam-policy-binding {{project-id}} \
    --member "serviceAccount:{{project-id}}-compute@developer.gserviceaccount.com" \
    --role roles/monitoring.metricWriter
    
    gcloud projects add-iam-policy-binding {{project-id}} \
    --member "serviceAccount:{{project-id}}-compute@developer.gserviceaccount.com" \
    --role roles/monitoring.viewer
    
    gcloud projects add-iam-policy-binding {{project-id}} \
    --member "serviceAccount:{{project-id}}-compute@developer.gserviceaccount.com" \
    --role roles/stackdriver.resourceMetadata.writer
    
  3. プロジェクト編集者の役割をデフォルトのコンピュートサービスアカウントから削除します。

    gcloud projects remove-iam-policy-binding {{project-id}} \
    --member "serviceAccount:{{project-id}}-compute@developer.gserviceaccount.com" \
    --role roles/editor
    
  4. デフォルト コンピュート サービス アカウントに割り当てられたロールを検証します。

    gcloud projects get-iam-policy {{project-id}}  \
    --flatten="bindings[].members" \
    --format='table(bindings.role)' \
    --filter="bindings.members:{{project-id}}-compute@developer.gserviceaccount.com"
    
  5. このサービスアカウントに、プロジェクトに対する適切なロールセットがあることを確認します。