SSHリバーストンネルを使用してオンプレミスリソースに接続する
インバウンドファイアウォールアクセスを開放することなく、オンプレミスのリソースをDatabricksに接続できます。オンプレミス トンネル ホストは、Google クラウドのプロキシ仮想マシン (VM) へのアウトバウンド SSH 接続を開き、 Databricksクラシックとサーバーレス コンピュートがオンプレミス リソースに到達できるようにします。
仕組み
SSH リバース トンネルを使用すると、オンプレミス トンネル ホストが Google クラウドのクラウド プロキシ VM への送信 SSH 接続を開くことができます。 Databricksはロードバランサーを介してプロキシVMに接続し、トラフィックはトンネルを通ってオンプレミスのリソースへと戻ります。オンプレミス ネットワークでは、Google クラウドへの送信 SSH (ポート 22) のみが必要なため、受信ポートは必要ありません。
リバーストンネルでは、オンプレミスホストがファイアウォールの制限を緩和しないように、アウトバウンド(オンプレミスからクラウド)への接続を開始し、戻りトラフィックは確立されたパスを介して(クラウドからオンプレミスへ)流れます。
Classic コンピュートは、ピアリングを通じてプロキシ VM に到達します。 サーバーレス コンピュートは、クラウド プロバイダーのプライベート接続サービスを使用したプライベート エンドポイント接続を通じてサーバーに到達します。
これは自己管理型のソリューションです。プロキシVMとオンプレミスのトンネルホストのプロビジョニングと保守を行います。
必須コンポーネントとオプションコンポーネント
この構成では、クラウド環境とオンプレミスネットワーク間の専用ネットワーク回線が必要です。この回路により、オンプレミスのトンネルホストは、プロキシVMのプライベートIPアドレスに対してアウトバウンドSSH接続を開始できます。一般的な選択肢としては、クラウドインターコネクトやVPNトンネルなどがある。
必要条件 (最低限の動作環境):
- 発信SSH接続を確立するために、
autosshを実行しているオンプレミスのトンネルホスト。 - クラウド上で
socatを実行しているプロキシVMが1つあり、トンネルを受け入れ、そのネットワークインターフェース上でリソースポートを公開します。 - DatabricksからプロキシVMへのネットワークパス:
- クラシック コンピュート : Databricks VPCとプロキシ ハブVPC間のピアリング。
- サーバー レス コンピュート: クラウド プロバイダーのプライベート接続サービスとプライベート エンドポイント ルールを備えたネットワーク接続構成 (NCC) を使用したプライベート エンドポイント接続。
- 両方のコンピュート タイプ : 両方のパスを設定します。
開発およびテストには、ロードバランサーのない単一のプロキシVMで十分です。
オプション (高可用性と本番運用の堅牢性を追加):
- 冗長性を確保するための追加のプロキシVM。
- プロキシVMの前面に配置されたロードバランサー。トンネル障害発生時には、安定したエンドポイントと自動フェイルオーバー機能を提供します。
- 各プロキシVM上にHTTPヘルスチェックサービスを配置する。これにより、ロードバランサーはVMやポートの可用性だけでなく、トンネルレベルの障害も検出できるようになります。
Databricksはこの構成を推奨していますが、ご自身の環境とセキュリティ要件に合わせて調整してください。
トンネルプロキシハブ
プロキシハブは以下のコンポーネントで構成されています。
-
プロキシVM (高可用性を確保するには最低2台)。各プロキシVMは、以下の3つのサービスを実行します。
- sshd : SSHデーモンは、オンプレミスのトンネルホストからの受信リバーストンネルを受け入れ、トンネルリスナーを
localhostに配置します(たとえば、MySQLの場合はlocalhost:13306)。 - socat : VM のネットワーク インターフェイスをトンネル リスナー (例えば
NIC:3306 → localhost:13306) にブリッジ接続し、Databricks からのトラフィックがトンネル エンドポイントに到達できるようにします。 - HTTPヘルスチェックサービス :トンネルがアクティブな場合はHTTP 200を、アクティブでない場合はHTTP 503を返します。通常のTCPプローブはsocatがリッスンしているかどうかのみを検出しますが、アプリケーションレベルのHTTPプローブはsocatがまだ実行されている場合でも、デッドトンネルを検出します。
- sshd : SSHデーモンは、オンプレミスのトンネルホストからの受信リバーストンネルを受け入れ、トンネルリスナーを
-
ロードバランサー :
- フロントエンド :プロキシサブネット内のプライベートIPアドレス。
- バックエンドプール :すべてのプロキシVM。
- 負荷分散ルール :リソースポート上のTCP(例:MySQLの場合はポート3306)。
- ヘルスプローブ :各プロキシVM上のヘルスチェックエンドポイントに対してHTTP GETを実行します。推奨される開始点は、5秒間隔で2回連続して失敗した場合にVMを異常と判断することです。リカバリ許容度に合わせて調整してください。
-
プライベート接続サービス (サーバーレス コンピュートに必要): 専用の NAT サブネットを使用してロード バランサー フロントエンドに接続されます。 Google クラウドは、Private Service Connect サービスのアタッチメントを使用します。
-
オンプレミスのトンネルホスト :プロキシVMごとに1つの
autosshプロセスを実行します。単一のautossh接続は、マルチリソース構成のために複数の-Rポートフォワーディング(1つのSSH接続、複数のトンネル)をサポートします。Restart=alwaysで systemd サービスを使用します。 インタラクティブなトンネルはログオフ時に終了するため、本番運用には適していません。
Databricksの設定
ロードバランサーのフロントエンドIPを使用して、オンプレミスのリソースへの接続を作成します。コンピュート タイプのタブを選択します。
以下の例ではMySQLを使用しています。他のデータベースの場合は、接続タイプ、ポート、およびJDBCドライバのMaven座標を置き換えてください。
- Classic compute
- Serverless compute
- Lakeflow Connect CDC
接続する前に、プロキシハブVPCとDatabricks VPC間のピアリングが有効になっていることを確認してください。 VPCがアクティブになっていることを確認してください。 次に、接続設定でロードバランサーのフロントエンドのプライベートIPアドレスを使用します。
CREATE CONNECTION mysql_onprem TYPE mysql
OPTIONS (
host '<lb-frontend-ip>',
port '3306',
user '<db-user>',
password '<db-password>'
);
CREATE FOREIGN CATALOG onprem_catalog
USING CONNECTION mysql_onprem
OPTIONS (database '<db-name>');
クラスローダー分離によりエグゼキューターがMavenベースのJDBCドライバーにアクセスできないため、共有アクセス モードではクエリが失敗します。 シングルユーザーアクセスモードを使用して、ドライバがシステム全体で利用可能であることを確認してください。 。 接続を作成する前に、 JDBCドライバをUnity Catalog許可リストに追加してください。
ALTER METASTORE ADD ALLOWLIST maven ('mysql:mysql-connector-java:8.0.33');
-
アカウント管理者として、アカウントコンソールにアクセスしてください。
-
サイドバーで 「セキュリティ」 をクリックします。
-
「ネットワーク接続構成」 をクリックし、ワークスペース領域のNCCを作成します。
-
NCC で、プライベート エンドポイント ルールを追加し、サービス リソース ID を入力します。
-
NCC をワークスペースに接続し、伝播するまで 10 ~ 15 分間待ちます。
-
プライベート接続サービス上でプライベートエンドポイント接続を承認します。
Google クラウド コンソールまたは
gcloudCLIを使用して、Private Service Connect 接続を受け入れます。 -
プライベートエンドポイントドメインを使用して接続を作成します。
SQLCREATE CONNECTION mysql_onprem_serverless TYPE mysql
OPTIONS (
host '<pe-domain>',
port '3306',
user '<db-user>',
password '<db-password>'
);
DatabricksのUIにある 「接続テスト」 ボタンは、プライベートエンドポイント接続では機能しません。それをスキップして、直接接続を作成してください。
LakeFlow ConnectゲートウェイはワークスペースVPCのクラシック コンピュート上で実行され、ピアリングを通じてプロキシ VM に到達します。 接続ホストとして、個々のプロキシVMのIPアドレスではなく、ロードバランサーのフロントエンドのプライベートIPアドレスを使用してください。高可用性とパイプラインの回復力については、こちらをご覧ください。
CDCパイプラインを作成する前に、データベース エンジンに対して次のステップを完了します。
-
変更ログを有効にする :データベースを構成して、行レベルの変更をログに記録します(たとえば、MySQL のバイナリログ、PostgreSQL の論理レプリケーション、Oracle の補助ログなど)。
-
レプリケーション権限を付与 する:パイプラインユーザーに、変更ログの読み取りとスナップショットの実行に必要な権限を付与します。ご使用のデータベースに対応するコネクタのドキュメントを参照してください。
-
ログ保持期間の設定 :ログの保持期間を最低7日間に設定してください。ログの有効期限が切れた時点でCDCゲートウェイがオフラインになっている場合、パイプラインはすべてのソーステーブルの完全な再スナップショットを実行する必要があります。
エンジン固有の設定については、 LakeFlow Connectコネクタのドキュメントを参照してください。
高可用性とパイプラインの回復力
バックエンドプールに2つ以上のプロキシVMが存在する場合、単一インスタンスでのトンネル障害が発生してもサービスは中断されません。トンネルが失敗した場合、ヘルスチェックサービスはHTTP 503を返します。ロードバランサーは、約10秒以内にその仮想マシンへの新規接続のルーティングを停止します。
接続文字列には、個々のプロキシVMのIPアドレスではなく、ロードバランサーのフロントエンドIPアドレスを使用してください。トンネルが切断された場合、ロードバランサーは手動による介入やパイプラインのダウンタイムなしに、トラフィックを自動的に再ルーティングします。
故障シナリオ | アプリケーションの健康状態チェックなし | アプリケーションの健康状態チェック付き |
|---|---|---|
プロキシVMが応答しなくなりました | ロードバランサーがフェイルオーバーを検出 | ロードバランサーがフェイルオーバーを検出 |
ポートフォワーダーが停止 | ロードバランサーがフェイルオーバーを検出 | ロードバランサーがフェイルオーバーを検出 |
SSHトンネルが失敗、ポートフォワーダーが実行中 | ロードバランサーが断続的な障害を検出できない | ロードバランサーが(HTTP 503)を検出 → フェイルオーバー |
LakeFlow Connect CDCパイプラインの場合、バイナリ ログの保持期間を少なくとも 7 日間に設定します。 バイナリログの有効期限が切れた時点でCDCゲートウェイがオフラインになっている場合、パイプラインはすべてのソーステーブルの完全な再スナップショットを実行する必要があります。
既知の制限事項
このソリューションには次の制限があります。
- オンプレミスの各リソースには、各プロキシVM上で個別のポートマッピングが必要です。同じデフォルトポート上に同じタイプのリソースが複数存在する場合は、プロキシVMのネットワークインターフェイスで異なるポート(例えば、3306、3307、または3308)を使用するか、別々のプロキシVMを使用してください。
- プロキシVMとオンプレミスのトンネルホストをプロビジョニングおよび維持する必要があります。
- ロードバランサーは、バックエンドプール内の仮想マシン(VM)のデフォルトのインターネットへのアウトバウンド接続をブロックします。仮想マシンをプールに追加する前に、必要なパッケージをインストールしてください。
- DatabricksのUIにある 「接続テスト」 ボタンは、プライベートエンドポイント接続では機能しません。
- 共有アクセス モードでは、 Maven JDBCライブラリはドライバー ノードでのみ使用できます。 JDBCワークロードにはシングルユーザーアクセスモードを使用してください。