SSH 역방향 터널을 사용하여 온-프레미스 리소스에 연결

온-프레미스 리소스를 인바운드 방화벽 액세스를 열지 않고 Azure Databricks에 연결하세요. 온-프레미스 터널 호스트는 Azure 프록시 VM(가상 머신)에 대한 아웃바운드 SSH 연결을 열어 Azure Databricks 클래식 및 서버리스 컴퓨팅이 온-프레미스 리소스에 연결할 수 있도록 합니다.

작동 방식

SSH 역방향 터널을 사용하면 온-프레미스 터널 호스트가 Azure 클라우드 프록시 VM에 대한 아웃바운드 SSH 연결을 열 수 있습니다. Azure Databricks 부하 분산 장치를 통해 프록시 VM에 연결되고 트래픽은 터널을 통해 온-프레미스 리소스로 다시 흐릅니다. 온-프레미스 네트워크에는 Azure 아웃바운드 SSH(포트 22)만 필요하므로 들어오는 포트가 필요하지 않습니다.

역방향 터널에서 온-프레미스 호스트는 방화벽 제한 완화를 방지하기 위해 연결 아웃바운드(온-프레미스에서 클라우드로)를 시작하고 반환 트래픽은 설정된 경로를 통해 다시(클라우드에서 온-프레미스로) 흐릅니다.

클래식 컴퓨팅은 피어링을 통해 프록시 VM에 도달합니다. 서버리스 컴퓨팅은 클라우드 공급자의 프라이빗 연결 서비스를 통해 프라이빗 엔드포인트 연결로 전달됩니다.

메모

이는 자체 관리형 솔루션입니다. 프록시 VM 및 온-프레미스 터널 호스트를 프로비전하고 유지 관리합니다.

필수 및 선택적 구성 요소

메모

이 설정을 사용하려면 클라우드 환경과 온-프레미스 네트워크 간의 전용 네트워크 회로가 필요합니다. 이 회로를 사용하면 온-프레미스 터널 호스트가 프록시 VM의 개인 IP 주소에 대한 아웃바운드 SSH를 시작할 수 있습니다. 일반적인 옵션으로는 ExpressRoute 또는 VPN 터널이 있습니다.

필수 (최소 작업 설정):

  • 아웃바운드 SSH 연결을 설정하기 위해 실행되는 autossh 온-프레미스 터널 호스트입니다.
  • 터널을 수락하고 네트워크 인터페이스에 리소스 포트를 노출하기 위해 실행되는 socat 클라우드의 프록시 VM 1개.
  • Azure Databricks 프록시 VM으로의 네트워크 경로:
    • Classic 컴퓨팅: Azure Databricks VNet과 프록시 허브 VNet 간의 피어링입니다.
    • 서버리스 컴퓨팅: 클라우드 공급자의 프라이빗 연결 서비스를 사용하는 프라이빗 엔드포인트 연결 및 프라이빗 엔드포인트 규칙이 있는 NCC(네트워크 연결 구성).
    • 두 컴퓨팅 유형: 두 경로를 모두 구성합니다.

부하 분산 장치가 없는 단일 프록시 VM은 개발 및 테스트에 충분합니다.

선택 사항 (고가용성 및 프로덕션 견고성 추가):

  • 중복성을 위한 추가 프록시 VM입니다.
  • 프록시 VM 앞에 있는 부하 분산 장치입니다. 터널이 실패할 때 안정적인 엔드포인트 및 자동 장애 조치(failover)를 제공합니다.
  • 각 프록시 VM의 HTTP 상태 검사 서비스입니다. 이렇게 하면 부하 분산 장치가 VM 또는 포트 가용성뿐만 아니라 터널 수준 오류를 검색할 수 있습니다.

Azure Databricks 이 구성을 권장하지만 환경 및 보안 요구 사항에 맞게 조정합니다.

터널 프록시 허브

프록시 허브는 다음 구성 요소로 구성됩니다.

  • 프록시 VM (고가용성을 위해 2개 이상). 각 프록시 VM은 다음 세 가지 서비스를 실행합니다.
    • sshd: SSH 디먼은 온-프레미스 터널 호스트에서 들어오는 역방향 터널을 허용하고 터널 수신기를 설정합니다 localhost (예 localhost:13306 : MySQL).
    • 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 PLS(Private Link Service)를 사용합니다.
  • 온-프레미스 터널 호스트: 프록시 VM당 하나의 autossh 프로세스를 실행합니다. 단일 autossh 연결은 다중 리소스 설정에 대해 여러 -R 포트 전달(하나의 SSH 연결, 여러 터널)을 지원합니다. Restart=always을(를) 사용하여 systemd 서비스를 이용합니다. 대화형 터널은 로그오프 시 종료되며 프로덕션에 적합하지 않습니다.

Azure Databricks 구성

부하 분산 장치 프런트 엔드 IP를 사용하여 온-프레미스 리소스에 대한 연결을 만듭니다. 컴퓨팅 유형에 대한 탭을 선택합니다.

메모

다음 예제에서는 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>');

클래스 로더 격리로 인해 실행자가 Maven 기반 JDBC 드라이버에 액세스할 수 없으므로 쿼리가 공유 액세스 모드에서 실패합니다. 단일 사용자 액세스 모드를 사용하여 전체 클러스터에서 드라이버를 사용할 수 있는지 확인합니다. 연결을 만들기 전에 Unity 카탈로그 허용 목록에 JDBC 드라이버를 추가합니다.

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 커넥터 설명서를 참조하세요.

고가용성 및 파이프라인 복원력

백 엔드 풀에 둘 이상의 프록시 VM이 있는 경우 단일 인스턴스에서 터널 오류가 발생해도 서비스가 중단되지 않습니다. 터널이 실패하면 상태 검사 서비스는 HTTP 503을 반환합니다. 그런 다음 부하 분산 장치는 약 10초 이내에 해당 VM에 대한 새 연결 라우팅을 중지합니다.

메모

개별 프록시 VM의 IP가 아닌 연결 문자열 부하 분산 장치 프런트 엔드 IP를 사용합니다. 터널이 삭제되면 부하 분산 장치는 수동 개입 또는 파이프라인 가동 중지 시간 없이 트래픽을 자동으로 다시 라우팅합니다.

실패 시나리오 애플리케이션 상태 검사 없이 애플리케이션 상태 검사를 통해
프록시 VM 응답 중지 장애 조치(failover)를 감지하는 부하 분산 장치입니다. 부하 분산 장치가 장애 조치(failover)를 감지합니다.
포트 포워더 중지됨 부하 분산 장치가 장애 조치(failover)를 감지합니다. 부하 분산 장치에서 장애 조치(failover)를 감지합니다.
SSH 터널 실패, 포트 전달자 실행 부하 분산 장치는 → 간헐적 오류를 검색할 수 없습니다. 부하 분산 장치가 장애를 감지하여 장애 조치(failover)를 수행 (HTTP 503)

Lakeflow Connect CDC 파이프라인의 경우 이진 로그 보존 기간을 최소 7일로 설정합니다. 이진 로그가 만료될 때 CDC 게이트웨이가 오프라인 상태인 경우, 파이프라인은 모든 원본 테이블에 대한 전체 스냅샷을 다시 수행해야 합니다.

알려진 제한

이 솔루션에는 다음과 같은 제한 사항이 있습니다.

  • 각 온-프레미스 리소스에는 각 프록시 VM에서 고유한 포트 매핑이 필요합니다. 동일한 기본 포트에서 동일한 유형의 여러 리소스의 경우 프록시 VM의 네트워크 인터페이스(예: 3306, 3307 또는 3308)에서 다른 포트를 사용하거나 별도의 프록시 VM을 사용합니다.
  • 프록시 VM 및 온-프레미스 터널 호스트를 프로비전하고 유지 관리해야 합니다.
  • 부하 분산 장치는 백 엔드 풀의 VM에 대한 기본 아웃바운드 인터넷 연결을 차단합니다. 풀에 VM을 추가하기 전에 필요한 패키지를 설치합니다.
  • Azure Databricks UI의 Test Connection 단추는 프라이빗 엔드포인트 연결에서 작동하지 않습니다.
  • 공유 액세스 모드에서 Maven JDBC 라이브러리는 드라이버 노드에서만 사용할 수 있습니다. JDBC 워크로드에 단일 사용자 액세스 모드를 사용합니다.

다음 단계