
- Snowflake

Snowflake는 멀티클라우드 데이터 웨어하우스 서비스로, 글로벌 클라우드 (AWS, GCP, Azure) 위에서 모두 동작하고, 데이터 판매를 통한 매출을 가능하게 해주는 Data Sharing/Marketplace와 같은 다양한 기능들을 제공합니다. 또한 ETL과 다양한 데이터 통합 기능도 제공합니다.

Snowflake의 계정 구성도 : Organization -> 1+ Account -> 1+ Databases
OrganizationsAccountsDatabasesSnowflake는 처음 사용할 시 30일간 400$의 무료 평가판을 이용할 수 있으니 이걸 이용해 보자.

가입을 완료하면 메일로 설정한 Username과 로그인 URL을 확인할 수 있다. 이 정보를 이용해서 Snowflake를 접속해야하므로 별도로 저장하거나 기억해두자.

전 실습에서 Redshift에서 테이블을 생성한 것과 마찬가지로 똑같은 구조를 Snowflake를 이용해서 구현해보도록 하자.

Snowflake는 외부 프로그램이기 때문에 AWS S3 버킷에 접근하기 위해 사용자를 만들어 S3에 접근할 수 있도록 정책을 할당하고 액세스 키를 발급받아야 한다.
AWS IAM 서비스에서 사용자 탭에 들어가 사용자 생성을 해주자.


생성한 사용자가 S3에 접근하고 데이터를 읽어올 수 있어야 하기 때문에 'AmazonS3ReadOnlyAccess' 정책을 연결해주고 검토 후 사용자를 생성해주자.

이제 이 사용자에 대한 액세스 키를 발급받아야 한다. 우리는 외부 프로그램에서 사용할 것이기 때문에 'AWS 외부에서 실행되는 애플리케이션' 을 선택해주자.


description은 자유롭게 적어주고 액세스 키를 생성하면 다음과 같은 화면이 나오는데, 이 액세스 키와 비밀 액세스키는 이 창을 넘어가면 다시 찾아볼 수 없기 때문에 미리 복사해서 안전한 곳에 저장해두자.
절대 이 키가 외부에 알려지지 않도록 조심하자!

이제 이 키를 이용해서 S3 버킷으로 접근해 데이터를 가져와 테이블을 생성해보자.
Snowflake는 자체적으로 웹 에디터를 제공하므로 간단하게 SQL문을 실행하고 결과를 출력할 수 있다. 먼저 우리가 SQL문을 실행시키고 작업을 할 Worksheet를 만들자.

생성한 Worksheet으로 이동하면 SQL을 실행시킬 수 있는 텍스트 에디터를 볼 수 있다. 먼저 dev라는 데이터베이스를 만들고 우리가 만드려는 3가지 스키마를 생성해주자. 완료 시 옆에 DEV 데이터베이스가 생성된 것을 확인할 수 있다.

이후 SQL문을 이용해서 테이블을 우리가 사용할 CSV파일에 맞게 필드를 설정해서 만들어주고, 전에 생성한 S3 버킷에서 COPY 명령어를 이용해 데이터를 가져와 주자.
CREATE OR REPLACE TABLE dev.raw_data.session_transaction (
sessionid varchar(32) primary key,
refunded boolean,
amount int
);
CREATE TABLE dev.raw_data.user_session_channel (
userid integer ,
sessionid varchar(32) primary key,
channel varchar(32)
);
CREATE TABLE dev.raw_data.session_timestamp (
sessionid varchar(32) primary key,
ts timestamp
);
COPY INTO dev.raw_data.session_timestamp
FROM '본인 s3 버킷안의 파일 url'
credentials=(AWS_KEY_ID='액세스 키' AWS_SECRET_KEY='비밀 키')
FILE_FORMAT = (type='CSV' skip_header=1 FIELD_OPTIONALLY_ENCLOSED_BY='"');
COPY INTO dev.raw_data.user_session_channel
FROM '본인 s3 버킷안의 파일 url'
credentials=(AWS_KEY_ID='액세스 키' AWS_SECRET_KEY='비밀 키')
FILE_FORMAT = (type='CSV' skip_header=1 FIELD_OPTIONALLY_ENCLOSED_BY='"');
COPY INTO dev.raw_data.session_transaction
FROM '본인 s3 버킷안의 파일 url'
credentials=(AWS_KEY_ID='액세스 키' AWS_SECRET_KEY='비밀 키')
FILE_FORMAT = (type='CSV' skip_header=1 FIELD_OPTIONALLY_ENCLOSED_BY='"');
다음 테이블을 새롭게 만들고 SELECT 명령어로 테이블을 살펴보면 잘 출력되는 것을 볼 수 있다.
CREATE TABLE dev.analytics.mau_summary AS
SELECT
TO_CHAR(A.ts, 'YYYY-MM') AS month,
COUNT(DISTINCT B.userid) AS mau
FROM dev.raw_data.session_timestamp A
JOIN dev.raw_data.user_session_channel B ON A.sessionid = B.sessionid
GROUP BY 1
ORDER BY 1 DESC;
SELECT * FROM dev.analytics.mau_summary LIMIT 10;


Snowflake는 Redshift와 달리 Group기능을 제공하지 않기 때문에 Role을 이용해야 한다.
-- 3개의 ROLE을 생성한다
CREATE ROLE analytics_users;
CREATE ROLE analytics_authors;
CREATE ROLE pii_users;
-- 사용자 생성
CREATE USER sangwon PASSWORD='sangwonpassword';
-- 사용자에게 analytics_users 권한 지정
GRANT ROLE analytics_users TO USER sangwon;
생성한 Role에 아무런 권한을 설정하지 않았기 때문에 어떤 테이블에서 어떤 작업을 할 수 있는지 지정해주자
-- analytics_users 설정
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;
-- analytics_authors 설정
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;
권한 설정에 있어서 선택할 수 있는 옵션은 두 가지 정도가 있다.
이렇게 있지만 사실 가장 좋은 방법은 보안이 필요한 컬럼이나 레코드들을 별도 테이블로 구성하는 것이다. 더 나아간다면 이러한 정보를 데이터 시스템으로 로딩하지 않는 것이 가장 바람직하다.

Data Governance란 필요한 데이터가 적재적소에 올바르게 사용됨을 보장하기 위한 데이터 관리 프로세스를 말한다. 품질 보장과 데이터 관련 법규 준수를 주 목적으로 삼는다. 세부적으로 다음과 같은 것들을 이룩하기 위함이 Data Governance의 존재 의의이다.
- 데이터 기반 결정에서 일관성
- 예: KPI등의 지표 정의와 계산에 있어 일관성