Set up Openflow - Snowflake Deployment: Connect to private data sources

Set up Openflow - Snowflake Deployment: Connect to private data sources (Openflow - Snowflake 배포: 사설 데이터 소스 연결)

DCP(Data Connectivity Proxy)는 Openflow - Snowflake 배포의 커넥터가 VPC나 온프레미스 네트워크의 사설 데이터 소스에 도달할 수 있게 해줘요. 네트워크에 경량 에이전트를 배포하면 포트 443을 통해 Snowflake로 암호화 터널을 설정해요. 그 결과 Snowflake는 네트워크로의 인바운드 접근이 필요 없어요.

출처: Snowflake Documentation

본문

기능 — 일반 공개(Generally Available)

Openflow Snowflake Deployments는 AWS, Azure, GCP의 상업용 리전에 있는 모든 계정에서 사용할 수 있어요.

에이전트가 데이터 소스에 대한 네트워크 연결을 활성화하는 동안 모든 데이터 처리는 여전히 Snowflake가 호스팅하는 Openflow 런타임에서 일어나요. 커넥터 상태는 런타임에 남아 있으므로 에이전트를 교체해도 상태가 바뀌지 않아요.

Openflow에서 DCP를 사용해야 하는 경우

DCP는 런타임이 Snowflake에서 실행되고 방화벽 뒤의 호스트에 다른 방법으로는 도달할 수 없는 Snowflake Deployments용이에요.

런타임이 실행되는 위치와 Snowflake가 이미 소스에 도달할 수 있는지에 따라 연결 옵션을 선택해요.

옵션 사용 시점 다루지 않는 것
허용 도메인 소스가 공용 인터넷(또는 Snowflake가 이미 허용하는 다른 경로)에서 Snowflake로 도달 가능하고, 소스 호스트·포트만 허용 목록에 추가하면 될 때. Snowflake가 해석하거나 도달할 수 없는 사설 호스트 이름. 그것들은 outbound private connectivity 또는 DCP를 사용.
아웃바운드 사설 연결 소스가 Amazon S3나 Azure Storage처럼 사설 엔드포인트를 제공하는 클라우드 서비스일 때. Snowflake에서 사설 엔드포인트를 프로비저닝하고 TYPE = PRIVATE_HOST_PORT로 네트워크 규칙을 만들어 트래픽이 공용 인터넷 대신 클라우드 공급자의 사설 연결을 사용하게 함. 앞에 클라우드 사설 엔드포인트 서비스가 없는 네트워크의 호스트(예: 온프레미스 데이터베이스). Business Critical Edition이 아닌 Snowflake 계정. 그것들은 DCP를 사용.
Data Connectivity Proxy Openflow - Snowflake 배포를 유지하면서 네트워크에서만 도달할 수 있는 데이터베이스, Kafka 브로커, API에서 수집하려 할 때. 런타임과 데이터 처리 자체를 VPC로 옮기는 것. 그것이 필요하다면 Openflow - BYOC를 사용.

더 완전한 비교는 DCP가 다른 사설 연결 옵션과 비교되는 방식을 참고해요.

전제 조건

Openflow에서 DCP를 사용하도록 구성하기 전에 다음이 있는지 확인해요.

Openflow가 프록시를 사용하도록 구성

프록시 객체가 활성화되고 에이전트가 연결된 후 다음 단계를 완료해 Openflow 커넥터가 데이터 소스에 연결할 수 있는지 확인해요. 에이전트 연결 확인은 에이전트 연결 확인을 참고해요.

데이터 소스용 네트워크 규칙 생성

DATA_CONNECTIVITY_PROXY_EGRESS 모드의 이 네트워크 규칙은 지정된 TARGET_HOSTNAME:TARGET_PORT로 가는 모든 트래픽이 공용 인터넷 게이트웨이가 아닌 DCP를 통해 라우팅되도록 보장해요. 네트워크 규칙에 여러 호스트·포트 조합을 지정할 수 있어요.

Note

TARGET_HOSTNAME은 정규화된 도메인 이름(FQDN)이 필요해요. IP 주소를 제공하면 네트워크 규칙 생성이 실패해요.

CREATE NETWORK RULE IF NOT EXISTS <DCP_NETWORK_RULE>
  MODE = DATA_CONNECTIVITY_PROXY_EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('<TARGET_HOSTNAME>:<TARGET_PORT>');

데이터 소스용 외부 접근 통합 생성

외부 접근 통합은 Openflow 런타임과 커넥터에 외부 리소스에 대한 안전한 접근을 제공해요. 그것을 Data Connectivity Proxy 객체 및 Openflow 런타임과 연결해요. ALLOWED_NETWORK_RULES는 통합을 통해 접근할 수 있는 엔드포인트를 결정해요.

CREATE EXTERNAL ACCESS INTEGRATION IF NOT EXISTS <DCP_EAI_NAME>
  ALLOWED_NETWORK_RULES = (<DCP_NETWORK_RULE>)
  ENABLED = TRUE;

프록시를 만들 때 EXTERNAL_ACCESS_INTEGRATIONS를 설정하지 않았다면 통합을 DCP 객체와 연결해요.

ALTER DATA CONNECTIVITY PROXY <DCP_NAME>
  SET EXTERNAL_ACCESS_INTEGRATIONS = (<DCP_EAI_NAME>);

execute-as 역할과 Openflow 관리자에게 통합 접근 부여

런타임과 연결된 execute-as 역할에 DCP 외부 접근 통합에 대한 USAGE를 부여해요.

GRANT USAGE ON INTEGRATION <DCP_EAI_NAME> TO ROLE OPENFLOW_<RUNTIME_NAME>_EXECUTE_AS_RL;

사용자가 DCP 외부 접근 통합을 런타임과 연결할 수 있게 하려면, 사용자가 런타임을 만들거나 업데이트할 때 사용하는 역할에 USAGE를 부여해요.

GRANT USAGE ON INTEGRATION <DCP_EAI_NAME> TO ROLE <OPENFLOW_ADMIN>;

외부 접근 통합을 런타임에 연결

Openflow 런타임에도 같은 외부 접근 통합이 필요해서 커넥터가 목적지로 연결을 열 수 있어요.

Openflow UI에서 연결하려면:

  1. Snowsight에 로그인해요.
  2. 탐색 메뉴에서 Ingestion » Openflow를 선택해요.
  3. Launch Openflow를 선택해요.
  4. 런타임 목록으로 이동해 기존 런타임을 보거나 Openflow - Snowflake 배포: 런타임 생성에 설명된 대로 새로 만들어요.
  5. 런타임 목록 보기에서 런타임 옆의 » External access integrations를 선택해요. DCP 외부 접근 통합을 선택하고 Save를 선택해요. 런타임이 허용 목록에 추가된 공용 목적지도 필요하다면 통합을 둘 이상 선택할 수 있어요.

gen 2 런타임에서는 SQL로 같은 일을 할 수 있어요. 기존 런타임에 통합을 추가하려면:

ALTER OPENFLOW RUNTIME <DATABASE>.<SCHEMA>.<RUNTIME_NAME>
  ADD EXTERNAL_ACCESS_INTEGRATIONS = (<DCP_EAI_NAME>);

통합이 이미 연결된 런타임을 만들려면:

CREATE OPENFLOW RUNTIME <DATABASE>.<SCHEMA>.<RUNTIME_NAME>
  IN DEPLOYMENT <DEPLOYMENT_NAME>
  NODE_TYPE = MEDIUM
  MIN_NODES = 1
  MAX_NODES = 1
  EXECUTE_AS_ROLE = OPENFLOW_<RUNTIME_NAME>_EXECUTE_AS_RL
  EXTERNAL_ACCESS_INTEGRATIONS = (<DCP_EAI_NAME>);

ALTER OPENFLOW RUNTIME으로 통합을 추가하거나 제거하려면 런타임에 대한 OWNERSHIP이 필요해요. 어떤 통합이 연결되어 있는지 확인하려면 DESCRIBE OPENFLOW RUNTIME을 실행하고 external_integrations 컬럼을 확인해요.

사설 DNS 이름으로 커넥터 구성

커넥터의 소스 호스트와 포트를 DCP 네트워크 규칙에 나열한 것과 같은 정규화된 호스트 이름으로 설정해요. Snowflake 호스트 이름, 프록시 URL, 소스의 사설 IP로 바꾸지 마세요.

호스트와 포트는 네트워크 규칙과 정확히 일치해야 해요. 나머지 연결 문자열은 평소처럼 동작하므로 소스가 요구하는 스킴과 파라미터를 유지해요. 예를 들어 네트워크 규칙이 mydb.internal.corp:5432를 나열하면 PostgreSQL 커넥터는 jdbc:postgresql://mydb.internal.corp:5432/mydb?sslmode=require를 사용할 수 있어요.

그런 다음 Openflow UI에서 커넥터의 평소 연결성 확인을 실행해요. 성공적인 확인은 Snowflake 호스팅 런타임에서 DCP 터널을 거쳐 소스까지의 경로를 확인해 줘요.

커넥터를 시작하고 데이터가 성공적으로 수집되는지 검증해요.

고려 사항

  • 에이전트는 네트워크 규칙과 커넥터에서 사용하는 호스트 이름을 해석할 수 있어야 해요. 대상에 DNS가 없다면 사설 목적지용 네트워크 규칙 생성에 설명된 대로 에이전트 호스트(Snowflake가 아닌)에 host 항목을 추가해요.
  • 커넥터 트래픽을 기대하기 전에 Data Connectivity Proxy 객체를 활성화해요. 객체가 존재하지만 비활성화되어 있으면 에이전트가 연결된 것처럼 보이다가 에이전트를 알 수 없거나 비활성화되었다는 오류로 재시도할 수 있어요. 에이전트가 disconnected 또는 down 상태 표시를 참고해요.
  • 이중화가 필요하다면 서로 다른 장애 도메인에 에이전트를 둘 이상 배포해요. 에이전트를 교체해도 커넥터 체크포인트는 Openflow에 남아 있어요. 고가용성 참고.
  • bootstrap 자격 증명이 만료되기 전에 교체해요. 교체는 DCP 에이전트 작업이며, 토큰이 바뀌어도 Openflow 커넥터를 재구성하지 않아요. 무중단 bootstrap 토큰 교체 참고.

Openflow 연결 문제 해결

에이전트가 실행 중인데 커넥터가 소스에 도달할 수 없다면 먼저 Openflow 쪽을 확인해요.

증상 예상 원인 확인할 것
커넥터 연결 실패; 같은 런타임의 공용 허용 목록 소스는 여전히 동작함 DCP 외부 접근 통합이 런타임에 없거나, 런타임 역할에 USAGE가 없음 DCP 외부 접근 통합이 런타임에 선택되고 런타임 역할에 부여되었는지 확인
(gen 1 커넥터) 다음 오류로 커넥터 실행 실패: Caused by: org.postgresql.util.PSQLException: The connection attempt failed. Caused by: java.net.UnknownHostException 런타임에 연결된 외부 접근 통합에 DCP를 통해 소스 접근을 제공하는 네트워크 규칙이 포함되지 않음. EAI에 포함된 네트워크 규칙에 정의된 호스트·포트가 연결 문자열의 호스트·포트와 일치하지 않음 네트워크 규칙이 올바른 소스 호스트·포트로 정의되었는지, 올바른 EAI에 연결되었는지, 커넥터에서 사용하는 연결 문자열과 일치하는지 확인
(gen 2 커넥터) 다음 오류 메시지로 소스 연결성 검증 실패: There is no egress Network Rule in <runtime_name>’s External Access Integration(s) (EAI) that allows access to <source_connection_string> 런타임에 연결된 외부 접근 통합에 DCP를 통해 소스 접근을 제공하는 네트워크 규칙이 포함되지 않음. EAI에 포함된 네트워크 규칙에 정의된 호스트·포트가 연결 문자열의 호스트·포트와 일치하지 않음 네트워크 규칙이 올바른 소스 호스트·포트로 정의되었는지, 올바른 EAI에 연결되었는지, 커넥터에서 사용하는 연결 문자열과 일치하는지 확인
(gen 2 커넥터) 다음 오류 메시지로 소스 연결성 검증 실패: Failed to connect to the source database. Failed to establish Database Connection / (gen 1 커넥터) 다음 오류 메시지로 커넥터 실패: Caused by: org.postgresql.util.PSQLException: The connection attempt failed. Caused by: java.net.SocketTimeoutException: Read timed out 에이전트 호스트가 소스에 도달할 수 없거나 프록시 객체가 비활성화됨 에이전트-소스 도달 가능성과 프록시 활성화 여부를 확인. 커넥터가 사설 소스에 도달할 수 없음 참고.

에이전트 시작 오류, bootstrap JWT 문제, 아웃바운드 포트 443, Snowflake로의 DNS, Prometheus 메트릭은 데이터 연결 프록시 문제 해결과 데이터 연결 프록시 모니터링을 참고해요.

더 알아보기 (Learn more)