오픈 데이터 공유(Open Data Sharing)

오픈 데이터 공유(Open Data Sharing)

프리뷰 기능 — 모든 계정에서 사용 가능.

Snowflake의 오픈 데이터 공유는 전통적인 데이터 공유를 Snowflake 생태계 너머로 확장해요. 이 기능을 사용하면 Snowflake를 사용하지 않는 소비자와 라이브 읽기 전용 데이터 자산을 안전하게 공유할 수 있어 복잡한 ETL 파이프라인, 데이터 중복, 수동 파일 내보내기의 필요성을 없애줘요.

공개 프리뷰 기간 동안 공유 데이터의 지원되는 유일한 대상 리전은 공급자 계정이 위치한 리전이에요.

출처: Open Data Sharing

본문

오픈 데이터 공유를 사용하는 이유

  • 보편적 접근: 소비자는 이 프로토콜이 지원되는 모든 분석 도구나 플랫폼에서 표준 오픈소스 Iceberg REST Catalog API로 라이브 데이터를 쿼리해요.
  • 데이터 이동 없음: 데이터는 Snowflake 스토리지 계층에 안전하게 남아 단일 진실 공급원을 보장하면서 데이터 이그레스 비용과 스토리지 중복을 제거해요.
  • 세분화된 제어: 제한된 외부 소비자 신원과 직접 관리하는 리전별 프로그래매틱 액세스 토큰(PAT)을 사용한 안전한 데이터 배포.
  • 자동화된 복제: 기본 프레임워크가 리스팅 구성에 따라 크로스 리전 복제를 원활하게 처리해 데이터를 외부 소비자에게 더 가까이 배치해 최적의 성능을 제공해요.

외부 소비자와 안전한 데이터 공유

다음 단계는 최소한의 오픈 데이터 공유 워크플로를 안내해요: 외부 소비자와 액세스 토큰 만들기, 공유 Iceberg 테이블 데이터 준비, 공유 및 리스팅 만들기, 외부 소비자용 카탈로그 URL 검색.

계정 리전 확인

다음 명령을 실행해 계정 리전을 반환하세요:

SELECT CURRENT_REGION();

결과는 계정의 Snowflake 리전 ID예요(예: AWS_US_WEST_2 또는 PUBLIC.AWS_US_WEST_2).

계정 URL에서도 리전을 식별할 수 있어요. URL에 *organization*-*account*.*us-east-2*.*aws*.snowflakecomputing.com의 us-east-2 같은 클라우드 리전 ID가 포함되면 계정이 해당 클라우드 리전에 호스팅된 것이에요. 자세한 내용은 계정 식별자를 참조하세요.

1단계: 필수 권한이 있는 역할 사용

이 워크플로를 완료하려면 다음 중 하나가 있는 역할을 사용하세요:

  • ACCOUNTADMIN 역할, 또는
  • 계정 수준에서 부여된 CREATE EXTERNAL CONSUMER 권한과 함께, 공유, 리스팅, 계획한 공유 데이터베이스 객체를 만드는 데 필요한 권한.

커스텀 역할에 CREATE EXTERNAL CONSUMER를 부여하려면:

GRANT CREATE EXTERNAL CONSUMER ON ACCOUNT TO ROLE my_role;

다음 예제는 ACCOUNTADMIN을 사용해요:

USE ROLE ACCOUNTADMIN;

2단계: 외부 소비자 만들기

Snowflake 외부에서 공유 데이터에 접근할 당사자를 위한 외부 소비자를 만들어요:

CREATE EXTERNAL CONSUMER test_ext_consumer;

SHOW EXTERNAL CONSUMERS LIKE '%test_ext_consumer%';

외부 소비자는 생성 시점에 특정 리전에 바인딩된 제한된 사용자예요. 이 계정에 역할이나 다른 표준 사용자 옵션을 부여할 수 없어요.

3단계: 프로그래매틱 액세스 토큰 추가

외부 소비자를 위한 PAT(Programmatic Access Token)를 추가해요:

ALTER EXTERNAL CONSUMER test_ext_consumer ADD PAT test_ext_consumer_pat;

Snowflake가 PAT secret을 반환할 때 반드시 저장해야 해요. 나중에 secret을 검색할 수 없어요.

공개 프리뷰 기간 동안 외부 소비자 인증에는 PAT만 지원돼요. 다른 인증 방법은 이후 릴리스 단계에서 제공될 예정이에요.

계정이 네트워크 정책을 사용한다면 접근을 부여하려는 각 외부 소비자에 대한 항목을 추가해야 해요. 계정이 네트워크 정책을 사용하지 않으면 외부 소비자는 추가 구성 없이 연결할 수 있어요.

4단계: 공유 데이터 만들기

공유하려는 데이터를 위한 데이터베이스, 스키마, Iceberg 테이블을 만들어요. 다음 예제는 가장 간단한 데모 설정을 위해 Snowflake 관리 스토리지를 사용해요:

CREATE DATABASE test_db;
CREATE SCHEMA test_db.test_schema;

CREATE ICEBERG TABLE test_db.test_schema.test_table (id INT, val STRING)
  EXTERNAL_VOLUME = 'SNOWFLAKE_MANAGED'
  CATALOG = 'SNOWFLAKE';

INSERT INTO test_db.test_schema.test_table VALUES (1, 'A'), (2, 'B'), (3, 'C');

SELECT * FROM test_db.test_schema.test_table;

외부 볼륨에서 데이터 공유 (선택)

Snowflake 관리 스토리지를 사용하지 않는다면 대신 외부 볼륨을 참조하는 Iceberg 테이블을 만들 수 있어요. 위에서 Snowflake 관리 테이블을 사용했다면 이 섹션을 건너뛰어도 돼요.

먼저 외부 볼륨을 만들어요:

CREATE OR REPLACE EXTERNAL VOLUME exvol
  STORAGE_LOCATIONS = (
    (
      NAME = 'exvol'
      STORAGE_PROVIDER = 'S3'
      STORAGE_BASE_URL = 's3://bucket/basepath'
      STORAGE_AWS_ROLE_ARN = ''
    )
  );

그런 다음 외부 볼륨을 사용하는 Iceberg 테이블을 만들어요:

CREATE ICEBERG TABLE test_db.test_schema.test_table_ex_vol (id INT, val STRING)
  EXTERNAL_VOLUME = exvol
  CATALOG = 'SNOWFLAKE';

5단계: 공유 만들기 및 권한 부여

공유를 만들고 데이터베이스, 스키마, 테이블에 필요한 권한을 부여해요:

CREATE SHARE test_share;

GRANT USAGE ON DATABASE test_db TO SHARE test_share;
GRANT USAGE ON SCHEMA test_db.test_schema TO SHARE test_share;
GRANT SELECT ON TABLE test_db.test_schema.test_table TO SHARE test_share;

6단계: 외부 리스팅 만들기

공유를 외부 소비자에게 연결하는 외부 리스팅을 만들어요:

CREATE EXTERNAL LISTING test_listing SHARE test_share AS
$$
title: "test open sharing"
description: "test open sharing"
open_sharing:
  catalog_identifier: "test-open-sharing"
listing_terms:
  type: "OFFLINE"
external_targets:
  access:
    - external_consumers: [TEST_EXT_CONSUMER]
$$;

리스팅 매니페스트 필드에 대한 자세한 내용은 리스팅 매니페스트 참조를 참조하세요.

7단계: 리스팅 검증

리스팅이 생성됐는지 확인하고 속성을 검토해요:

SHOW LISTINGS LIKE 'TEST_LISTING';

DESC LISTING test_listing;

8단계: 외부 소비자용 카탈로그 URL 가져오기

SYSTEM$GET_LISTING_URL_FOR_EXTERNAL_CONSUMER를 호출해 외부 소비자용 catalog와 catalog_uri 값을 검색해요:

CALL SYSTEM$GET_LISTING_URL_FOR_EXTERNAL_CONSUMER('TEST_LISTING');

반환된 카탈로그 URL과 3단계의 PAT를 외부 소비자에게 제공해 Iceberg REST Catalog 클라이언트로 연결할 수 있게 하세요.

리스팅 매니페스트 속성

예제 리스팅은 다음 매니페스트 필드를 사용해요:

  • title 및 description — 공급자와 외부 소비자에게 리스팅을 식별해요.
  • listing_terms — 소비자가 리스팅의 약관을 수락하는 방식을 지정해요. 예제는 OFFLINE을 사용해요.
  • external_targets.access.external_consumers — 리스팅에 접근할 수 있는 외부 소비자 신원을 나열해요.
  • open_sharing.catalog_identifier — Iceberg REST Catalog API를 통해 외부 소비자에게 노출되는 카탈로그의 고유 식별자. 소비자가 공유 데이터에 연결하도록 Iceberg REST Catalog 클라이언트를 구성할 때 이 값을 사용해요.

더 알아보기