일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ETL
- docker-compose
- 웹 스크래핑
- 데이터마트
- spark
- AWS
- snowflake
- yarn
- 데이터레이크
- 데이터파이프라인
- redshift
- docker
- airflow.cfg
- selenium
- Hive
- docker hub
- 알고리즘
- SQL
- Django Rest Framework(DRF)
- truncate
- dag 작성
- 데이터 웨어하우스
- Django
- Serializer
- 컨테이너 삭제
- ELT
- dag
- airflow
- 웹 크롤링
- Kafka
Archives
- Today
- Total
개발 기록장
04. Snowflake 운영과 관리 본문
반응형
학습 주제: 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$임
- Snowflake Warehouse에서 Credit이란?
- 스토리지 비용: 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(하위레벨)
- SNOWFLAKE.CORE.PRIVACY_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에 대한 개념을 확실히 정리하는 계기였다.
반응형
'데브코스(DE) > 데이터 웨어하우스 관리와 고급 SQL, BI 대시보드' 카테고리의 다른 글
05. 대시보드 소개와 구현 (0) | 2024.05.12 |
---|---|
03. Redshift 고급 기능 실습(권한과 보안/백업 등) (0) | 2024.05.08 |
02. Redshift 소개와 기능 (0) | 2024.05.07 |
01. 다양한 데이터 웨어하우스 옵션, ETL/ELT, 데이터 조직 (0) | 2024.05.07 |