ファイアウォールを使用してワークスペースのネットワークエグレスを制限する
デフォルトでは、Google Cloud は VPC からのすべての下り(外向き)トラフィックを許可します。 必要に応じて、組織が必要とする重要なサービスと宛先のみにエグレスを制限するようにワークスペースを構成することを選択できます。 重要なサービスを許可するには、Google Cloud ネットワーク (VPC) と、Databricks がワークスペース用に作成するファイアウォールを変更する必要があります。 一部のサービスでは、プライベート IP アドレスで Google と通信するように Googleアクセス シークレットを設定できます。APIs
これらの Google Cloud 機能の仕組みに関する最新情報については、 Google Cloud のドキュメントをご覧ください。
Databricks Web アプリケーションに接続するように企業ドメイン名ファイアウォールを構成する場合は、代わりに「 ドメイン名ファイアウォール規則の構成」を参照してください。
従来のコンピュート プレーンとコントロール プレーンの定義など、 Databricks アーキテクチャの一般的な概要については、「 Databricks アーキテクチャの概要」を参照してください。
ファイアウォール構成の概要
従来のコンピュート プレーンからの出力を制限する場合は、次の 2 つの一般的なタイプの設定を行って、ブロックされる必要な接続を許可する必要があります。
-
プライベート Google Access for GCR and GCS : デフォルトでは、Databricks クラスター ノードなどのコンピュート エンジン仮想マシン(VM)に、ネットワーク インターフェースに割り当てられた外部(パブリック)IP アドレスがない場合、他の内部 IP アドレスの宛先にのみパケットを送信できます。これらの VM が Google APIs とサービスで使用される外部 IP アドレスのセットに接続できるようにするには、VM のネットワーク インターフェースが使用するサブネットで Private Google Access(PGA) を有効にします。 PGA を使用すると、Databricks コンピュートプレーンとこれらの Google サービス間の直接通信は、パブリックインターネットではなく Google の内部ネットワークを使用します。 これは、コンピュート プレーンからの次の発信接続に影響します。
- 従来のコンピュート プレーンは、 Google Container Registry(GCR) を使用して Databricks ランタイム イメージを取得します。
- 従来のコンピュート プレーンは、 Google Cloud Storage (GCS) を使用して、ワークスペースの正常性チェック ログと使用状況ログに書き込みます。
-
コントロール プレーン サービスのファイアウォール ルール : 組み込みのファイアウォールを変更してエグレスをブロックした後、新しいファイアウォール ルールを追加して、いくつかの重要なサービスを許可する必要があります。
- Web アプリケーションへのエグレスとポート 443 での REST APIs 。
- ポート 443 の セキュア クラスター接続 リレーへのエグレス。
- デフォルトへの出力は、ポート 3306 で Hive metastore します。 独自の外部メタストアをデプロイする場合は、未使用のデフォルト メタストアにネットワーク ルールを追加する必要はありません。
- Databricks コンピュート プレーンから Databricks コントロール プレーンへの内部コールの出力は、ポート 8443 でAPIします。
- ポート 8444 の へのUnity Catalog ログ記録とリネージ データ ストリーミングのエグレス。Databricks
- 今後の機能をサポートするためのポート 8445-8451 のエグレス。
Web アプリケーション、セキュリティで保護されたクラスター接続リレー、およびデフォルト Hive metastore の IP アドレス範囲は、リージョンによって異なります。 リージョンの値については、 Databricks サービスと資産の IP アドレスとドメインの表を参照してください。
この記事では、 gcloud
コマンドライン インターフェース(CLI)を使用した Google Cloud の設定例を紹介します。 これらの例を使用するには、 Google Cloud SDK をインストールする必要があります。
リージョン別のコントロール プレーン サービス エンドポイントの IP アドレス
エグレスをブロックするようにファイアウォールを構成する場合は、新しい VPC エグレス ファイアウォール ルールとルートを定義して、Databricks コントロール プレーンでホストされている重要なサービスを許可する必要があります。 エンドポイントの IP アドレスは、Databricks ワークスペースの Google Cloud リージョンによって異なります。 「Databricks サービスと資産の IP アドレスとドメイン」の表を使用して、ワークスペースの Google Cloud リージョンのコントロール プレーン イングレスのポートと IP アドレスを取得します。
ステップ 1: ネットワークのサイズ設定を計画する
大規模なクラスターまたは多数のワークスペースを使用する場合は、 ネットワークDatabricksサイジング計算機 を使用して GKE サブネット範囲を計算し、 ジョブを実行するのに十分な IP スペースがワークスペースにあることを確認してください。
Databricks ワークスペースで使用される GKE サブネットは、ワークスペースのデプロイ後に変更できないため、正確に構成してください。 Databricks サブネットのアドレス範囲が小さすぎると、ワークスペースの IP 空間が使い果たされ、Databricks ジョブが失敗します。 必要なアドレス範囲のサイズを決定するために、Databricks には Microsoft Excel スプレッドシートの形式で計算機が用意されています。 「新しいワークスペースのサブネット サイズを計算する」を参照してください。
ステップ 2: ワークスペースを作成する
-
アカウントコンソールにログインします
-
-
ワークスペースを作成するには、フォームの [Advanced Configuration ] セクションで、[ Enable private clustering ] のデフォルト設定を使用する必要があります。これにより、ワークスペースはプライベート GKE クラスターを使用します。 プライベートGKEクラスターの場合、 Databricks コンピュートインスタンスにはパブリックIPアドレスがありません。
-
ワークスペースの作成時に [詳細設定 ] セクションに表示されるすべての IP サブネット設定を書き留めます。 デフォルトもありますが、上書きできます。 詳細については、「 アカウント コンソールを使用してワークスペースを作成する」を参照してください。
-
-
Google アカウントの Databricks VPC とサブネットで プライベート Google アクセス (PGA) が有効になっていることを確認します。
ステップ 3: VPC ファイアウォール ルールを追加する
次に、Databricks が新しいワークスペース用に作成したファイアウォールにファイアウォール規則を追加する必要があります。
-
VPC 名を取得します。 Databricks は、ワークスペースの作成の一環として、この VPC を Google アカウントに作成しました。
-
アカウントコンソールのワークスペースページで、ワークスペースをクリックして起動します。
-
URL の の
?o=
の後の数値部分をコピーします。 たとえば、ワークスペース URL がhttps://1676665108650415.5.gcp.databricks.com/?o=1676665108650415#
の場合、ワークスペース ID は 1676665108650415 です。 -
ワークスペースの VPC の名前は
databricks-managed-<workspace-ID>
です。 たとえば、databricks-managed-1676665108650415
. この値を CLI コマンドで使用できるように書き留めておきます。
-
-
Google Console を使用してファイアウォール ルールを追加する場合:
- Google Cloud コンソールの VPC ページに移動します。
- ワークスペースの VPC 名と一致するネットワークの VPC 名をクリックします。
- 「ファイアウォールルール 」タブをクリックします。
-
0.0.0.0/0
へのエグレスをブロックするルールを追加します。これは、すべての外部 IP アドレスを意味する特別な構文です。デフォルトでは、Google Cloud は VPC からのすべての下り(外向き)トラフィックを許可します。 このトラフィックをブロックするルールを作成する必要があります。 このルールの優先度が大きな数値に設定されていることを確認します。 このルールは、Google Cloud が他のすべてのルールを実行した後に適用されることを目的としています。 たとえば、このルールを優先度 1100 に設定し、後で出力ルールの優先度を 1000 から 1099 の範囲で設定できます。
このルールに低い優先度の値を誤って使用すると、Google Cloud は重要な 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>
-
Google ヘルスチェックからのイングレスを許可するルールを追加します。
次の
gcloud
CLI コマンドを使用して、このルールを作成できます。<vpc-name>
を VPC 名に置き換えます。Bashgcloud 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> -
Google ヘルスチェックへの下り(外向き)を許可するルールを追加します。
次の
gcloud
CLI コマンドを使用して、このルールを作成できます。<vpc-name>
を VPC 名に置き換えます。Bashgcloud 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> -
制限付き APIs へのエグレスを許可するルールを追加します (restricted.googleapis.com) これは、固定 IP アドレス範囲で GKE API にアクセスするために必要です。
次の
gcloud
CLI コマンドを使用して、このルールを作成できます。<vpc-name>
を VPC 名に置き換えます。Bashgcloud 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> -
GKE マスター リソースの IP 範囲への下り(外向き)を許可するルールを追加します。 デフォルトの GKE マスター IP 範囲がありますが、ワークスペースの作成時に値をオーバーライドできます。 「アカウントコンソールを使用してワークスペースを作成する」を参照してください。
次の
gcloud
CLI コマンドを使用して、このルールを作成できます。<vpc-name>
を VPC 名に置き換えます。X.X.X.X/28
を GKE マスター リソースの IP 範囲に置き換えます。Bashgcloud 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> -
Databricks ワークスペースで使用されるサブネット内通信 (エグレス) を許可するルールを追加します。 これらのサブネットには、 ワークスペースの作成時に [Advanced Configuration ] セクションに表示される [デフォルト] があります。 ユーザー インターフェースで 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 サブネットに置き換えます。Bashgcloud 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> -
Databricks コントロール プレーン サービスへのエグレスを許可するルールを追加します。 「Databricks サービスと資産の IP アドレスとドメイン」の表を使用して、これらのサービスでサポートされている各 Databricks リージョンの正しい値を決定します。
メイン Web アプリケーションへの接続と、ポート 443 での セキュア クラスター接続 (SCC) リレーを許可します。 次の
gcloud
CLI コマンドを使用して、このルールを作成します。<vpc-name>
を VPC 名に置き換えます。X.X.X.X
を Web アプリケーションのリージョン別のイングレス アドレスに置き換えます。Y.Y.Y.Y
を SCC リレーの地域の IP アドレス範囲に置き換えます。Bashgcloud 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> -
デフォルト メタストアを使用する場合は、ポート 3306 でメタストアへの接続を許可するルールを追加します。 次の
gcloud
CLI コマンドを使用して、このルールを作成します。<vpc-name>
を VPC 名に置き換えます。X.X.X.X
をデフォルト メタストアの地域の IP アドレス範囲に置き換えます。Bashgcloud 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>
独自のメタストア インスタンスをデプロイした場合は、デフォルト メタストアの代わりに、そのメタストア インスタンスへの接続を許可するルールを作成します。
- データソースまたは他のシステムへの必要な接続を許可するために組織が必要とするその他のネットワーク エグレス ルールを追加します。
カスタム出力 ALLOW
ルールの場合は、プライオリティ番号を 1000 〜 1099 の範囲で設定します。 優先度番号は、すべての出力をブロックするために使用した値 (前の手順で優先度 1100 に設定) よりも小さくすることが重要です。
ファイアウォールのルールは次のようになりますが、ワークスペースのリージョンの コントロールプレーンサービスには、リージョンのIPアドレス を使用する必要があります。
ステップ 4: VPC ルートを更新する
Google Cloud ルート は、ネットワーク トラフィックが仮想マシン(VM)インスタンスから他の宛先に移動するパスを定義します。 VPC ネットワークでは、ルートは CIDR 形式の 1 つの宛先プレフィックスと 1 つのネクストホップで構成されます。
-
VPC で自動的に作成されたデフォルトルート (ネクストホップとしてデフォルトのインターネットゲートウェイと
0.0.0.0/0
されている) を削除します。 コンソール UI を使用してこのルートを削除し、インターネットへのパスをクリアします。-
Google Cloud コンソールのルートリストに移動します。
-
0.0.0.0/0
するルートを選択し、[ 削除 ] をクリックします。
-
-
VPC制限された GoogleAPIs サブネット()にトラフィックを送信するルートを
199.36.153.4/30
に作成します。ネクストホップを、プライベート APIsGoogle にアクセスするための要件に従ってdefault-internet-gateway
に設定します。次の
gcloud
CLI コマンドを使用して、このルートを作成できます。<vpc-name>
を VPC 名に置き換えます。<project-name>
をプロジェクト名に置き換えます。Bashgcloud 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 -
Databricks コントロール プレーン サービスに到達するためのルートを作成します。 Databricks のサービスと資産の IP アドレスとドメインで、リージョンの値を取得します。
次の
gcloud
CLI コマンドを使用して、Web アプリケーションへのルートを作成できます。<vpc-name>
を VPC 名に置き換えます。<project-name>
をプロジェクト名に置き換えます。X.X.X.X/32
を Web アプリケーションの地域 IP アドレス範囲に置き換えます。Bashgcloud 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 アドレス範囲に置き換えます。Bashgcloud 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 アドレス範囲に置き換えます。Bashgcloud 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 Private Access を有効にする
ここで、従来のコンピュート平面から と GCR の 2 つの Google への Google Private Access を有効にするために必要な Google の DNS ゾーンを作成する必要があります。APIsAPIsGCSGPAの有効化については、Googleのドキュメント記事「限定公開のGoogleアクセスの設定」(https://cloud.google.com/vpc/docs/configure-private-google-access#config-domain)をご覧ください。
-
Cloud DNS を使用して、ドメイン
googleapis.com
の VPC 内の DNS をカスタマイズします。 通常、googleapis.com
はパブリック IP アドレスに解決されますが、Google Private Access の場合はrestricted.googleapis.com
. このドメインは、Google Cloud ネットワーク内でアクセス可能な特定の範囲199.36.153.4/30
に解決されます。Databricks クラシック コンピュート平面 GKE クラスターには、GCS と GCR へのアクセスが必要です。PGA の場合、制限付き APIs へのアクセスが解決されていないことを確認する必要があり、そうしないと GKE が正常に起動しません。
次の
gcloud
コマンドを使用して DNS ゾーンを作成できます。<vpc-name>
を VPC 名に置き換えます。Bashgcloud 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-apisGoogle Cloud Console のオブジェクトは次のようになります。
-
コンテナ レジストリに到達するために制限された Google APIs サブネットにトラフィックを送信するには、GCR.io ドメインで同様のゾーン設定を行います。 これらの変更がないと、GKE クラスターは必要なすべての Databricks ランタイム コンテナをプルダウンできないため、正常に立ち上がりません。
次の
gcloud
コマンドを使用して、これらの DNS ゾーンを作成できます。<vpc-name>
を VPC 名に置き換えます。Bashgcloud 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-ioGoogle Cloud Console のオブジェクトは次のようになります。
ステップ 6: 構成の検証
-
Databricks クラスターを作成し、開始します。
-
正常に開始され、状態が Running であることを確認します。
-
クラスター ピッカーで、クラスターを選択します。ワークスペースのクラスター名には、名前
db-
の後に Databricks ワークスペース ID (大きな数値) が続きます。 -
すべてのサービスのステータス がOK になっていることを確認します。
トラブルシューティング
GKE クラスターを開始できません
GKE クラスターが開始されない場合は、VPC Databricksワークスペースで使用されている で [限定公開の 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 ネットワークを使用しているため、このクラスターが存在するサブネットでは Private Google Access が有効になっています。 この Google PGA ドキュメントの手順に従って、限定公開の Google アクセスの設定を完了する必要があります。
GKE クラスターが動作を停止するか、以前の試行で正常に開始できなかった後に開始できない
GKE をホストしているプロジェクトでコンピュート エンジン サービス アカウントが正しく構成されていないため、GKE クラスターが機能しなくなったり、GKE クラスターを開始できなくなったりすることがあります。 問題のあるクラスターのノードに関連付けられているコンピュート エンジン デフォルト サービス アカウントは、"無効" 状態であるか、必要な最小限のロールを持っていません。 サービス アカウントは <project-id>-compute@developer.gserviceaccount.com
です。
ノード登録の失敗の原因は、問題のあるクラスターのノードにアタッチされているこのサービス アカウントの無効状態が原因である可能性があります。
この Google ヘルプセンターの記事に従ってサービス アカウントを有効にし、クラスターまたはノード プールを再作成して、問題が解決するかどうかを確認してください。
また、Google Cloud Console を使用して、 IAM と管理ページでサービス アカウントと、問題のあるクラスターの対応するノードを確認することもできます。
デフォルトによって、コンピュート エンジン デフォルト サービス アカウントは、 IAM プロジェクト エディターの役割で作成されます。 次のように、必要最小限のロールに変更できます。
-
デフォルト コンピュート サービス アカウントに割り当てられている現在のロールを取得します。
Bashgcloud projects get-iam-policy {{project-id}} \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:{{project-id}}-compute@developer.gserviceaccount.com" -
必要な最小限のロールをデフォルト コンピュート サービス アカウントに追加する
Bashgcloud 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 -
プロジェクト エディターの役割をデフォルト コンピュート サービス アカウントから削除します。
Bashgcloud projects remove-iam-policy-binding {{project-id}} \
--member "serviceAccount:{{project-id}}-compute@developer.gserviceaccount.com" \
--role roles/editor -
デフォルト コンピュート サービス アカウントに割り当てられたロールを検証します。
Bashgcloud projects get-iam-policy {{project-id}} \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:{{project-id}}-compute@developer.gserviceaccount.com" -
このサービス アカウントに、プロジェクトに対する適切なロール セットがあることを確認します。