SSH リバース トンネルを使用してオンプレミスリソースに接続する

受信ファイアウォール アクセスを開かずに、オンプレミスのリソースをAzure Databricksに接続します。 オンプレミス トンネル ホストは、Azure内のプロキシ仮想マシン (VM) への送信 SSH 接続を開き、Azure Databricksクラシック コンピューティングとサーバーレス コンピューティングがオンプレミスリソースに到達できるようにします。

どのように機能するのか

SSH リバース トンネルを使用すると、オンプレミスのトンネル ホストは、Azure内のクラウド プロキシ VM への送信 SSH 接続を開くことができます。 Azure Databricksはロード バランサーを介してプロキシ VM に接続し、トラフィックはトンネルを経由してオンプレミス リソースに戻ります。 オンプレミス ネットワークでは、Azureするために送信 SSH (ポート 22) のみが必要であるため、受信ポートは必要ありません。

逆トンネルでは、ファイアウォールの制限を緩和せずに、オンプレミスのホストがオンプレミスからクラウドへ接続を開始します。そして、確立されたパスを通じて、クラウドからオンプレミスへと戻るトラフィックが流れます。

クラシック コンピューティングは、ピアリングを介してプロキシ VM に到達します。 サーバーレス コンピューティングは、クラウド プロバイダーのプライベート接続サービスを使用して、プライベート エンドポイント接続を介してそれらに到達します。

Note

これは自己管理型のソリューションです。 プロキシ VM とオンプレミストンネル ホストをプロビジョニングして管理します。

必須コンポーネントと省略可能なコンポーネント

Note

このセットアップには、クラウド環境とオンプレミス ネットワークの間に専用のネットワーク回線が必要です。 この回線により、オンプレミスのトンネル ホストは、プロキシ VM のプライベート IP アドレスへの送信 SSH を開始できます。 一般的なオプションには、ExpressRoute または VPN トンネルがあります。

必須 (最小作業セットアップ):

  • 送信 SSH 接続を確立するために autossh 実行されているオンプレミストンネル ホスト。
  • 実行中のクラウド内の 1 つのプロキシ VM socat トンネルを受け入れ、そのネットワーク インターフェイスでリソース ポートを公開します。
  • Azure Databricksからプロキシ VM へのネットワーク パス:
    • Classic compute: Azure Databricks VNet とプロキシ ハブ VNet の間のピアリング。
    • サーバーレス コンピューティング: クラウド プロバイダーのプライベート接続サービスと、プライベート エンドポイント規則を使用したネットワーク接続構成 (NCC) を使用したプライベート エンドポイント接続。
    • 両方のコンピューティングの種類: 両方のパスを構成します。

ロード バランサーのない単一のプロキシ VM で、開発とテストに十分です。

省略可能 (高可用性と運用の堅牢性を追加):

  • 冗長性のための追加のプロキシ VM。
  • プロキシ VM の前面にあるロード バランサー。 トンネルに障害が発生した場合の安定したエンドポイントと自動フェールオーバーを提供します。
  • 各プロキシ VM 上の HTTP 正常性チェック サービス。 これにより、ロード バランサーは VM やポートの可用性だけでなく、トンネル レベルの障害を検出できます。

Azure Databricksは、この構成を推奨しますが、環境とセキュリティの要件に合わせて調整します。

トンネル プロキシ ハブ

プロキシ ハブは、次のコンポーネントで構成されます。

  • プロキシ VM (高可用性のために少なくとも 2 つ)。 各プロキシ VM は、次の 3 つのサービスを実行します。
    • sshd: SSH デーモンは、オンプレミスのトンネル ホストからの着信逆トンネルを受け入れ、トンネル リスナーを localhost に配置します (たとえば、mySQL の localhost:13306 )。
    • socat: VM のネットワーク インターフェイスをトンネル リスナー (たとえば、NIC:3306 → localhost:13306) にブリッジするので、Azure Databricksからのトラフィックはトンネル エンドポイントに到達できます。
    • HTTP 正常性チェック サービス: トンネルがアクティブな場合は HTTP 200 を返し、アクティブでない場合は HTTP 503 を返します。 プレーン TCP プローブは、socat がリッスンしているかどうかを検出するだけです。アプリケーション レベルの HTTP プローブは、socat がまだ実行されている場合でも、デッド トンネルを検出します。
  • ロード バランサー:
    • フロントエンド: プロキシ サブネット内のプライベート IP。
    • バックエンド プール: すべてのプロキシ VM。
    • 負荷分散規則: リソース ポートの TCP (たとえば、MySQL のポート 3306)。
    • 正常性プローブ: 各プロキシ VM の正常性チェック エンドポイントに対する HTTP GET 。 推奨される開始点は、VM に異常をマークするために連続して 2 回失敗した 5 秒の間隔です。復旧の許容範囲に合わせて調整します。
  • プライベート接続サービス (サーバーレス コンピューティングに必要): 専用 NAT サブネットを使用してロード バランサー フロントエンドに接続されます。 Azureは、Private Link サービス (PLS) を使用します。
  • オンプレミス トンネル ホスト: プロキシ VM ごとに 1 つの autossh プロセスを実行します。 1 つの autossh 接続では、複数の -R ポート転送 (1 つの SSH 接続、複数のトンネル) が複数リソースのセットアップに対応しています。 Restart=alwaysで systemd サービスを使用します。 対話型トンネルはログオフ時に終了し、運用環境には適していません。

Azure Databricks を構成する

ロード バランサーのフロントエンド IP を使用して、オンプレミス リソースへの接続を作成します。 コンピューティングの種類のタブを選択します。

Note

次の例では MySQL を使用します。 他のデータベースの場合は、接続の種類、ポート、および JDBC ドライバーの Maven 座標に置き換える必要があります。

クラシック コンピューティング

接続する前に、プロキシ ハブ VNet と Azure Databricks ワークスペース VNet の間のピアリングがアクティブであることを確認します。 次に、接続構成でロード バランサーフロントエンドプライベート 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>');

クラスローダーの分離により、Executor が Maven ベースの JDBC ドライバーにアクセスできなくなるため、クエリは共有アクセス モードで失敗します。 シングル ユーザー アクセス モードを使用して、ドライバーがクラスター全体で使用可能であることを確認します。 接続を作成する前に、JDBC ドライバーを Unity カタログの許可リストに追加します。

ALTER METASTORE ADD ALLOWLIST maven ('mysql:mysql-connector-java:8.0.33');

サーバーレス コンピューティング

  1. アカウント管理者として、アカウント コンソールに移動します。

  2. サイドバーで[ セキュリティ]をクリックします。

  3. [ ネットワーク接続の構成 ] をクリックし、ワークスペース リージョンの NCC を作成します。

  4. NCC で、プライベート エンドポイント規則を追加し、サービス リソース ID を入力します。

  5. NCC をワークスペースにアタッチし、伝達されるまで 10 ~ 15 分待ちます。

  6. プライベート接続サービスでプライベート エンドポイント接続を承認します。

    az network private-link-service connection update \
      --service-name <pls-name> \
      --resource-group <rg> \
      --name "<connection-name>" \
      --connection-status Approved
    
  7. プライベート エンドポイント ドメインを使用して接続を作成します。

    CREATE CONNECTION mysql_onprem_serverless TYPE mysql
    OPTIONS (
      host '<pe-domain>',
      port '3306',
      user '<db-user>',
      password '<db-password>'
    );
    

Azure Databricks UI の Test Connection ボタンは、プライベート エンドポイント接続では機能しません。 それをスキップし、接続を直接作成します。

Lakeflow Connect CDC

Lakeflow Connect ゲートウェイは、ワークスペース VNet のクラシック コンピューティングで実行され、ピアリングを介してプロキシ VM に到達します。 ロード バランサーのフロントエンド プライベート IP は、個々のプロキシ VM の IP ではなく、接続ホストとして使用します。 高可用性とパイプラインの回復性に関する説明を参照してください。

CDC パイプラインを作成する前に、データベース エンジンに対して次の手順を実行します。

  1. 変更ログを有効にする: 行レベルの変更をログに記録するようにデータベースを構成します (たとえば、MySQL でのバイナリ ログ記録、PostgreSQL での論理レプリケーション、Oracle での補足ログ記録など)。

  2. レプリケーションのアクセス許可を付与する: 変更ログの読み取りとスナップショットの実行に必要なアクセス許可をパイプライン ユーザーに提供します。 特定のデータベースについては、コネクタのドキュメントを参照してください。

  3. ログリテンション期間の設定: ログリテンション期間を少なくとも 7 日間に構成します。 ログの有効期限が切れたときに CDC ゲートウェイがオフラインの場合、パイプラインはすべてのソース テーブルの完全な再スナップショットを実行する必要があります。

エンジン固有の構成については、 Lakeflow Connect コネクタのドキュメントを参照してください

高可用性とパイプラインの回復性

バックエンド プールに 2 つ以上のプロキシ VM がある場合、1 つのインスタンスでトンネル障害が発生してもサービスは中断されません。 トンネルに障害が発生した場合、正常性チェック サービスは HTTP 503 を返します。 ロード バランサーは、約 10 秒以内にその VM への新しい接続のルーティングを停止します。

Note

個々のプロキシ VM の IP ではなく、接続文字列でロード バランサーのフロントエンド IP を使用します。 トンネルが切断された場合、ロード バランサーは手動による介入やパイプラインのダウンタイムなしでトラフィックを自動的に再ルーティングします。

失敗シナリオ アプリケーションの正常性チェックなし アプリケーションの正常性チェックを伴った
プロキシ VM が応答を停止する ロードバランサーがフェールオーバーを検出します。 ロードバランサーがフェールオーバーを検出する
ポート フォワーダーが停止する ロード バランサーはフェールオーバーを検出します。 ロードバランサーがフェールオーバーを検出する
SSH トンネルが失敗し、ポート フォワーダーが実行されている ロードバランサーは断続的な障害を検出できません。 ロード バランサーがフェールオーバー→ (HTTP 503) を検出する

Lakeflow Connect CDC パイプラインの場合は、バイナリ ログリテンション期間を少なくとも 7 日間に設定します。 バイナリ ログの有効期限が切れたときに CDC ゲートウェイがオフラインの場合、パイプラインはすべてのソース テーブルの完全な再スナップショットを実行する必要があります。

既知の制限

このソリューションには、次の制限があります。

  • 各オンプレミス リソースには、各プロキシ VM で個別のポート マッピングが必要です。 同じ既定のポートで同じ種類の複数のリソースを使用する場合は、プロキシ VM のネットワーク インターフェイスで異なるポート (3306、3307、3308 など) を使用するか、別のプロキシ VM を使用します。
  • プロキシ VM とオンプレミストンネル ホストをプロビジョニングして維持する必要があります。
  • ロード バランサーは、バックエンド プール内の VM の既定の送信インターネット接続をブロックします。 プールに VM を追加する前に、必要なパッケージをインストールします。
  • Azure Databricks UI の Test Connection ボタンは、プライベート エンドポイント接続では機能しません。
  • 共有アクセス モードでは、Maven JDBC ライブラリはドライバー ノードでのみ使用できます。 JDBC ワークロードにはシングル ユーザー アクセス モードを使用します。

次のステップ