개발 기록장

04. Snowflake 운영과 관리 본문

데브코스(DE)/데이터 웨어하우스 관리와 고급 SQL, BI 대시보드

04. Snowflake 운영과 관리

jxwxnk 2024. 5. 12. 00:54
반응형

학습 주제: Snowflake, 운영/관리, 사용자 권한 설정, 실습, Data Governance

Snowflake 운영과 관리

Snowflake 소개

  • 2014년 클라우드 기반 데이터웨어하우스로 시작됨(2020년 상장)
    • 지금은 데이터 클라우드라고 부를 수 있을 정도로 발전
  • 글로벌 클라우드(AWS, GCP, Azure)위에서 모두 작동(멀티클라우드)
  • Data Sharing/Marketplace 제공
    • Data Sharing("Share, Don't Move"): 데이터 셋을 사내 혹은 파트너에게 스토리지 레벨에서 공유하는 방식
    • Data Marketplace: 데이터 판매를 통해 매출 이익을 얻을 수 있는 기능
  • ETL을 비롯한 다양한 데이터 통합 기능 제공
  • 대표 고객사: Siemens, Flexport, Iterable, Affirm, PepsiCo 등

Snowflake 특징

  • 스토리지와 컴퓨팅 인프라가 별도로 설정되는 가변 비용 모델
    • 사용한 만큼 비용 지불
    • 미리 지불하면 더 저렴하게 사용 가능하기도 함
    • Redshift(고정비용)처럼 노드 수 조정할 필요 없음(diskey 등의 최적화 불필요)
  • SQL 기반으로 빅데이터 저장, 처리, 분석이 가능함
    • 비구조화된 데이터 처리와 머신러닝 기능도 제공
  • CSV, JSON, Avro, Parquet 등과 같은 다양한 데이터 포맷 지원
    • S3, GC 클라우드 스토리지, Azure Blog Storage도 지원
  • 배치 데이터 중심이지만 실시간 데이터 처리 지원
  • Time Travel: 과거 데이터 쿼리 기능으로 트렌드를 분석하기 쉽게 함
  • Python API를 통한 관리/제어 가능(당연하게 웹 콘솔도 지원함)
    • ODBC/JDBC 연결도 지원
  • 자체 스토리지 이외에도 클라우드 스토리지를 외부 테이블로 사용 가능
  • 멀티 클라우드와 다른 지역에 있는 데이터 공유(Cross-Region Replication) 지원

Snowflake 계정 구성도: Organization -> 1 + Account -> 1 + Databases

  • Organizations
    • 한 고객이 사용하는 모든 Snowflake 자원들을 통합하는 최상위 레벨 컨테이너
    • 하나 혹은 그 이상의 Account들로 구성되며 모든 Account들의 접근권한, 사용트래킹, 비용을 관리하는데 사용
  • Accounts
    • 하나의 Account는 자체 사용자, 데이터, 접근권한을 독립적으로 가짐
    • 한 Account는 하나 혹은 그 이상의 Databases로 구성됨
  • Databases
    • 하나의 Database는 한 Account에 속한 데이터를 다루는 논리적 컨테이너
    • 한 Database는 다수의 스키마와 거기에 속한 테이블과 뷰 등으로 구성
    • 하나의 Database는 PB 단위까지 확장 가능하고 독립적 컴퓨팅 리소스를 갖게 됨

Snowflake의 기본 데이터 타입

  • Numeric: TINYINY, SMALLINT, INTEGER, BIGINT, NUMBER, NUMERIC, DECIMAL, FLOAT, DOUBLE, REAL
  • Boolean: BOOLEAN
  • String: CHAR, VARCHAR, TEXT, BINARY, VARBINARY
  • DATE and Time: DATE, TIME, TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_TZ
  • Semi-structured data: VARIANT(JSON,OBJECT)
  • Binary: BINARY, VARBINARY
  • Geospatial: GEOGRAPHYm GEOMETRY
  • Array: ARRAY
  • Object: OBJECT

Snowflake 실습

Snowflake 비용 구조

  • 크게 3가지 컴포넌트로 구성
    • 컴퓨팅 비용: 크레딧으로 결정됨
      • Snowflake Warehouse에서 Credit이란?
        쿼리 실행, 데이터 로드와 기타 작업 수행에 소비되는 계산 리소스를 측정하는 단위
        1 credit는 상황에 따라 다르지만 대략 2-4$임
    • 스토리지 비용: TB 당으로 계산
      • 지역과 클라우드마다 차이가 있음(AWS, GCP, Azure)
    • 네트워크 비용: 지역간 데이터 전송 혹은 다른 클라우드 간 데이터 전송시 TB당 계산

Snowflake Schema

: 데이터 베이스 아래 3개의 스키마 생성
- raw_data: ETL로 읽어온 테이블들이 들어가는 스키마
- analytics: ELT 즉, 이미 DB에 들어온 데이터들을 바탕으로 새로운 테이블을 만드는 경우
- adhoc: playground 즉, 개발/테스트 용으로 테이블을 잠깐 만들때 사용

Schema 생성

-- dev 데이터베이스 생성
CREATE DATABASE dev;

--3개의 스키마 생성
CREATE SCHEMA dev.raw_data;
CREATE SCHEMA dev.analytics;
CREATE SCHEMA dev.adhoc;

raw_data 아래 3개의 테이블 생성

  • CREATE OR REPLACE TABLE: 만약 테이블이 존재한다면 지우고 다시 만들기

    • Snowflake에만 존재한느 문법
    • 원래는 Drop -> CREATE 해야하는데 CREATE OR REPLACE를 쓰면 더 편리함
  • 테이블 생성: session_transction

    CREATE OR REPLACE TABLE dev.raw_data.session_transaction(
      sessionid varchar(32) primary key,
      refunded boolean,
      amount int
    );
  • 테이블 생성: user_session_channel

    CREATE TABLE dev.raw_data.user_session_channel(
      userid integer,
      sessionid varchar(32) primary key,
      channel varchar(32)
    );
  • 테이블 생성: session_timestamp

    CREATE TABLE dev.raw_data.session_timestamp(
      sessionid varchar(32) primary key,
      ts timestamp
    );

벌크 업데이트: COPY

  • 주의점

    • AWS 어드민 사용자의 AWS KEY ID와 AWS SECRET KEY를 사용하면 안됨
    • Snowflake의 S3 버킷 액세스를 위한 전용 사용자를 IAM으로 만들고 S3 읽기 권한 부여
    • 새로 만들어진 권한의 사용자 AWS KEY ID와 AWS SECRET KEY 사용
  • COPY: session_transaction

    COPY INTO dev.raw_data.session_transaction
    FROM 's3://jiwon-test-bucket/test_data/session_transaction.csv'
    credentials=(AWS_KEY_ID='*****' AWS_SECRET_KEY='*****')
    FILE_FORMAT = (type='CSV' skip_header=1 FIELD_OPTIONALLY_ENCLOSED_BY='"');
  • COPY: session_timestamp

    COPY INTO dev.raw_data.session_timestamp
    FROM 's3://jiwon-test-bucket/test_data/session_timestamp.csv'
    credentials=(AWS_KEY_ID='*****' AWS_SECRET_KEY='*****')
    FILE_FORMAT = (type='CSV' skip_header=1 FIELD_OPTIONALLY_ENCLOSED_BY='"');
  • COPY: user_session_channel

    COPY INTO dev.raw_data.user_session_channel
    FROM 's3://jiwon-test-bucket/test_data/user_session_channel.csv'
    credentials=(AWS_KEY_ID='*****' AWS_SECRET_KEY='*****')
    FILE_FORMAT = (type='CSV' skip_header=1 FIELD_OPTIONALLY_ENCLOSED_BY='"');

IAM 설정

  • Snowflake에서 S3 버킷 접근을 위한 IAM 사용자 생성
    • Permissions policies: AmazonS3ReadOnlyAccess
    • Users>Security credentials> Create access key
  • 생성된 AWS KEY ID와 AWS SECRET KEY를 사용하여 S3 접근

analytics 스키마 밑에 테이블 생성: CTAS

  • CTAS: CREATE TABLE AS SELECT
  • analytics.mau_summary 생성
--CTAS
CREATE OR REPLACE TABLE dev.analytics.mau_summary AS
SELECT
 TO_CHAR(A.ts, 'YYYY-MM') AS month,
 COUNT(DISTINCT B.userid) AS mau
FROM raw_data.session_timestamp A
JOIN raw_data.user_session_channel B ON A.sessionid = B.sessionid
GROUP BY 1
ORDER BY 1 DESC;

Snowflake 사용자 권한 설정

Role과 User 생성

  • Snowflake는 Group 지원 X

  • Role 지원

    • Role은 계승 구조: Base Role위에 다른 Role을 올리면서 지정 가능
  • 실습 Role 정의

    • analytics_authors(for 데이터 분석가): summary 생성해야하므로 analytics table 읽기 및 쓰기 권한 필요
    • analytics_users(for 데이터 소비자; ex. 마케팅팀 마케터 등): 실제로 완전히 새로운 데이터를 생성하는 사람 아님. 예를 들어, 시각화 하는 사람
      analytics_authors analytics_users
      raw_data 읽기 읽기
      analytics 읽기 및 쓰기 읽기
      adhoc 읽기 및 쓰기 읽기 및 쓰기
  • Role 생성

    CREATE ROLE analytics_users;
    CREATE ROLE analytics_authors;
  • 사용자 생성

    • 사용자(jiwon)에게 analytics_users 권한 지정
CREATE USER jiwon PASSWORD='*****';
GRANT ROLE analytics_users TO USER jiwon;

Role 설정: analytics_users와 analytics_authors

  • Base Role: analytics_users(읽기, 읽기, 읽기 및 쓰기)
  • 추가적인 Role: analytics_authors(읽기, 읽기 및 쓰기, 읽기 및 쓰기)
    ** 즉, analytics 테이블관한 권한에 쓰기만 추가하면 됨

  • Role 설정: analytics_users
    • SELECT: 읽기
    • ALL: 읽기 및 쓰기(모든 권한)
GRANT USAGE on schema dev.raw_data to ROLE analytics_users;
GRANT SELECT on all tables in schema dev.raw_data to ROLE analytics_users;
GRANT USAGE on schema dev.analytics to ROLE analytics_users;
GRANT SELECT on all tables in schema dev.analytics to ROLE analytics_users;
GRANT ALL on schema dev.adhoc to ROLE analytics_users;
GRANT ALL on all tables in schema dev.adhoc to ROLE analytics_users;
  • Role 설정: analytics_author
    • analytics_users Role 계승
    • analytics에 대한 권한만 ALL로 업데이트
GRANT ROLE analytics_users TO ROLE analytics_authors;
GRANT ALL on schema dev.analytics to ROLE analytics_authors;
GRANT ALL on all tables in schema dev.analytics to ROLE analytics_authors;

보안

컬럼 레벨 보안(Column Level Security)

  • 테이블내의 특정 컬럼(들)을 특정 사용자/역할(Role)에만 접근 가능하게 함
  • 보통 개인정보 등에 해당하는 민감한 컬럼을 권한 없는 사용자들에게 숨기는 목적으로 사용
    • 좋은 방법은 민감한 정보가 들어있는 컬럼을 별도의 테이블로 구성
    • 더 좋은 방법은 보안이 필요한 정보를 아예 데이터 시스템으로 로딩하지 않는 것

레코드 레벨 보안(Row Level Security)

  • 테이블내의 특정 컬럼(들)을 특정 사용자/역할(Role)에만 접근 가능하게 함
  • 특정 사용자/그룹의 특정 테이블 대상 SELECT, UPDATE, DELETE 작업에 추가 조건을 다는 형태로 동작
    • 좋은 방법은 민감한 정보가 들어있는 컬럼을 별도의 테이블로 구성
    • 더 좋은 방법은 보안이 필요한 정보를 아예 데이터 시스템으로 로딩하지 않는 것

Data Governance 관련 기능

  • Object Tagging
  • Data Classification
  • Tag based Masking Policies
  • Access History
  • Object Dependencies

Data Governance란?

  • 필요한 데이터가 적재적소에 올바르게 사용됨을 보장하기 위한 데이터 관리 프로세스
    • 품질 보장과 데이터 관련 법규 준수를 주목적으로 함
  • 목표
    • 데이터 기반 결정에서의 일관성(ex. KPI등의 지표 정의와 계산에 있어 일관성 보장)
    • 데이터를 이용한 가치 창출(Citizen data scientist가 효율적으로 일할 수 있게 돕기, Data silos 없애기)
    • 데이터 관련 법규 준수(개인 정보 보호 -> 적절한 권한 설정과 보안 프로세스 필수)

Object Tagging

  • Enterprise 레벨에서만 사용 가능한 기능
  • CREATE TAG 생성
    • 문자열을 Snowflake object에 지정 가능(계정, 스키마, 테이블, 컬럼, 뷰 등)
    • 시스템 태그도 있음(Data Classification)
  • 지정된 TAG는 구조를 따라 계승됨

Data Classification

  • Enterprise 레벨에서만 사용 가능한 기능
  • Object Tagging은 개인 정보 관리가 주요 용도 중 하나
    • 하지만 TAG를 매뉴얼하게 관리하기는 어려움 -> 새로운 기능: Data Classirfication
  • 3가지 단계로 구성
    • Analyze: 테이블에 적용하면 개인정보나 민감정보가 있는 컬럼 분류함
    • Review: 이를 사람(보통 데이터 엔지니어)이 보고 최종 리뷰 및 결과 수정
    • Apply: 최종 결과를 System Tag로 적용
      • SNOWFLAKE.CORE.PRIVACY_CATEGORY(상위레벨):
        • IDENTIFIER(식별자): 개인을 바로 지칭
        • QUASI_IDENTIFIER(준식별자): 몇 개의 정보를 조합하여 지칭
        • SENSITIVE(민감정보): 그 외 민감한 정보
      • SNOWFLAKE.CORE.SEMANTIC_CATEGORY(하위레벨)

Tag based Masking Policies

  • Enterprise 레벨에서만 사용 가능한 기능
  • Tag에 액세스 권한 지정
    • 해당 Tag가 지정된 Snowflake Object의 액세스 권한을 그에 맞춰 제한하는 방식
  • 개인 정보와 같은 Tag에 부여하는 것이 가장 많이 사용되는 패턴
    • Tag Lineage가 여기에도 적용됨

Access History

  • Enterprise 레벨에서만 사용 가능한 기능
  • 목적: 데이터 액세스에 대한 감사 추적을 제공하여 보안과 규정 준수
    • 잠재적인 보안 위반이나 무단 액세스 시도의 조사를 가능하게 함
    • 캡처된 정보에는 사용자 신원, IP 주소, 타임스탬프 및 기타 관련 세부 정보 포함
  • 'Access History'를 통해 아래의 활동 추적 가능
    • 데이터베이스 로그인
    • 실행된 쿼리
    • 테이블 및 뷰 액세스
    • 데이터 조작 작업
  • 이 기능은 다른 모든 클라우드 데이터 웨어하우스에서도 제공되는 기능임

Object Dependencies

  • 목적: 데이터 거버넌스와 시스템 무결성 유지
  • 테이블이나 뷰를 수정하는 경우 이로 인한 영향 자동 식별
    • 예를 들어, 테이블 이름이나 컬럼 이름을 변경 및 삭제하는 경우
    • 즉, 데이터 리니지 분석을 자동으로 수행
  • 계승 관계 분석을 통한 더 세밀한 보안 액세스 제어
    • 어떤 테이블의 개인정보 컬럼이 새로운 테이블을 만들때 사용된다면?
      : 원본 테이블에서의 권한 설정이 그대로 계승됨(Tag 포함)

공부하며 느낀점

실습을 통해 Snowflake를 처음으로 사용해 봤는데, GUI 환경이 매우 편리한 것이 매우 큰 장점인 것 같다. 또 Role에 대한 개념을 확실히 정리하는 계기였다.

반응형