7주차 수요일, 33일차 Today I Learned
데이터 인프라, 고급 SQL, BI 대시보드 (3)
: Redshift 고급 기능
- 권한과 보안, 백업과 복구, 관련 서비스 (Spectrum, Athena, Redshift ML), 중지와 제거
✏️ 학습 내용
1. Redshift 권한과 보안
1) 테이블 보안
너무 복잡하고 실수의 가능성이 높기 때문에 사용자별 테이블별 권한 설정은 하지 않고, 역할 (Role) 혹은 그룹 (Group)별로 스키마별 접근 권한을 주는 것이 일반적이다. 그 중에서도 특히 그룹은 계승이 안 되지만 역할은 계승이 되므로 그룹보다 더 편리한 역할을 사용하는 것이 좋다. RBAC (Role Based Access Control)이 새로운 트렌드이다. 여러 역할에 속한 사용자의 경우엔 설정된 역할에 해당하는 권한 전부를 갖게 된다.
개인정보와 관련된 테이블들이라면 별도 스키마를 설정하는 것이 좋다.
## 아래 스키마에 대한 다음 권한을 갖는 analytics_authors 그룹 (또는 역할) 예시
# raw_data 테이블들에 대한 읽기 권한
# analytics 테이블들에 대한 읽기, 쓰기 권한
# adhoc 테이블들에 대한 읽기, 쓰기 권한
# pii 테이블들에 대한 권한 없음
GRANT ALL ON SCHEMA analytics TO GROUP analytics_authors;
GRANT ALL ON ALL TABLES IN SCHEMA analytics TO GROUP analytics_authors;
GRANT ALL ON SCHEMA adhoc to GROUP analytics_authors;
GRANT ALL ON ALL TABLES IN SCHEMA adhoc TO GROUP analytics_authors;
GRANT USAGE ON SCHEMA raw_data TO GROUP analytics_authors;
GRANT SELECT ON ALL TABLES IN SCHEMA raw_data TO GROUP analytics_authors;
# GROUP -> ROLE 바꾸어도 무관하다.
2) 한 테이블 내에서의 보안 - 컬럼 레벨 보안, 레코드 레벨 보안
한 테이블 내에서의 보안은 두 가지로 나눌 수 있다. 컬럼 레벨의 보안과 레코드 레벨의 보안이지만, 일반적으로 별도 테이블로 구성하는 것이 더 좋은 방법이 된다.
컬럼 레벨의 보안은 테이블 내의 특정 컬럼(들)을 특정 사용자나 특정 그룹/역할에만 접근 가능하게 하는 것이다. 보통 개인정보 등에 해당하는 컬럼을 권한이 없는 사용자들에게 감추는 목적으로 사용되지만, 노출될 위험이 있으므로 좋은 방법은 아니다.
레코드 레벨 보안은 테이블 내의 특정 레코드(들)을 특정 사용자나 특정 그룹/역할에만 접근 가능하게 하는 것이다. 특정 사용자/그룹/역할의 특정 테이블 대상 SELECT, UPDATE, DELETE 작업에 추가 조건을 다는 형태로 동작하는데, 이를 RLS Policy라고 부른다. CREATE RLS POLICY 명령을 사용하여 Policy를 만들고 이를 ATTACH RLS POLICY 명령을 사용해 특정 테이블에 추가하면 된다.
2. Redshift 백업과 테이블 복구
가변 비용과 고정 비용별로 백업 및 테이블 복구 방법이 다르다. 기본적으로 백업 방식은 마지막 백업으로부터 바뀐 것들만 저장하는 방식이며 이를 Snapshot (스냅샷) 이라고 부른다. 백업을 통해 과거로 돌아가 그 시점의 내용으로 테이블을 복구하는 것 (Table Restore)도 간능하고, 과거 시점의 내용으로 Redshift 클러스터를 새로 생성하는 것도 가능하다. 백업은 자동 백업과 매뉴얼 백업이 있다.
1) Redshift (고정비용)에서의 백업과 복구
- 자동 백업 : 기본 하루이지만 최대 과거 35일까지 변경 가능하다. 이 경우 같은 지역에 있는 S3에서 이뤄지는데, 다른 지역에 있는 S3에 하려면 Cross-regional napshot copy를 설정해야 한다.
Redshift cluster > Maintenance > Backup details > Edit > 1일을 원하는 기간으로 선택 - 매뉴얼 백업 : 원할 때 언제든지 명령어를 실행하여 백업하고, 명시적으로 삭제할 때까지나 생성 시에 지정한 보조 기한만큼 유지된다.
[Actions] > Create snapshot > 보관 설정 - 테이블 복구 : [Actions] > Restore table > [View snapshots] > 복구 대상이 있는 백업 선택 > Restore에서 원본 테이블 입력 > 어디로 복구될지 타겟 테이블 선택
2) Redshift Serverless (가변비용)에서의 백업과 복구
가변비용에서는 좀 더 제한적이고 복잡한 백업 방식을 갖는다. Snapshot 이전에 Recovery Points라는 것이 존재하여 이는 과거 24시간에 대해서만 유지되고, 이것을 스냅샷으로 바꾼 다음에 테이블을 복구하거나 새로운 클러스터를 생성하는 등의 작업이 가능해진다.
- 자동 백업 : 24시간 (Serverless Dashboard > Name space > default > [Create snapshot from recovery point]
- 매뉴얼 백업 : Serverless Dashboard > Name space > default > [Create snapshot]
- 테이블 복구 : Serverless Dashboard > Name space > default > [Actions]
3. Redshift 관련 서비스 (Spectrum, Athena, Redshift ML)
1) Redshift Spectrum
S3에 있는 파일들을 마치 테이블처럼 SQL로 사용 가능하게 만들어주는 Redshift의 확장 기능이다. S3 파일들을 외부 테이블 (Fact 테이블)로 처리하면서 Redshift 테이블 (Dimension 테이블)과 조인을 할 수 있게 만든다. 이를 사용하려면 Redshift 클러스터가 필요하고, 이 클러스터와 S3는 같은 region에 있어야 한다.
- Fact Table : 분석의 초점이 되는 양적 정보를 포함하는 중앙 테이블
- Dimension Table : Fact Table에 대한 상세 정보를 제공하는 테이블
- 외부 테이블 (External Table) : 데이터베이스 엔진이 외부에 저장된 데이터를 마치 내부 테이블처럼 (보통 읽기 전용으로) 사용하는 방법으로, SQL 명령어로 데이터베이스에 외부 테이블을 생성할 수 있다.
보통 Fact 테이블의 크기가 훨씬 더 크고, 외래키를 통해 여러 Dimension 테이블과 연결 된다. 반대로 Dimension 테이블은 크기가 훨씬 더 작으며, PK를 가지고 Fact 테이블의 FK에서 참조된다. 보통 S3에 대용량 Fact 테이블이 파일(들)로 존재하고, Redshift에 소규모 Dimension 테이블이 존재한다. Fact 테이블을 Redshift로 적재하지 않고 두 테이블을 조인하고 싶을 때 스펙트럼을 사용할 수 있다.
즉, S3에 굉장히 큰 데이터가 있는데 이를 Redshift에 로딩하기 버거울 때, 외부 테이블로 설정한다면 Redshift에서 조작이 가능해진다.
S3 외부 테이블용 스키마 설정 시에는 ROLE에 'AWSGlueConsoleFullAccess' 권한 지정이 필요하다. AWS Glue란 AWS의 Serverless ETL 서비스로, 데이터 카탈로그, ETL 작업 생성, 작업 모니터링 및 로그, 서버리스 실행과 같은 기능을 제공한다. 스펙트럼이나 아테나 사용을 위해 필요하다.
2) Athena
Apache Presto를 서비스화 한 것으로, S3에 있는 데이터들을 기반으로 SQL 쿼리 기능을 제공한다. 스펙트럼과 비슷한 기능을 제공한다. 로그 데이터와 같이 굉장히 큰 비구조화된 데이터를 처리하기에 좋은 옵션 중에 하나이다.
3) Redshift ML
SQL만 사용하여 머신러닝 모델을 훈련하고 사용할 수 있게 해주는 Redshift 기능으로, AWS SageMaker에 의해 지원된다. ML 모델을 빌딩, 테스트, 배포, 모니터링하는 ML과 관련된 End-to-End 프레임웍으로, Auto Pilot이라는 기능으로 ML 훈련 데이터를 로딩하면 최적화된 모델을 자동으로 생성해주는 기능을 제공한다. 이미 모델이 만들어져 있다면 이를 사용하는 것도 가능하다. SageMaker는 크게 트레이닝 셋 준비, 모델 훈련, 모델 검증, 모델 배포와 관리 4가지 기능을 제공하고 있다.
머신러닝
배움이 가능한 기계 (혹은 알고리즘)의 개발로, 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다. 데이터의 패턴을 보고 흉내내는 방식으로 학습하고, 학습에 사용되는 이 데이터를 트레이닝 셋이라고 부른다.
머선러닝의 최종 산물이 머신 러닝 모델이며, 이는 학습된 패턴 (트레이닝 셋)에 따라 예측을 해주는 블랙박스와 같다. 지도 머신러닝 외에 비지도 머신러닝, 강화 학습이 존재한다. 트레이닝 셋의 품질이 머신러닝 모델의 품질을 결정한다.
비젼, 자연어 처리에 적용되는 딥러닝 (=신경망)은 머신 러닝의 일부이며, 인공지능은 머신러닝을 포괄하는 개념이다
머신러닝 사용 절차
1) 캐글 Orange Telecom Customer Churn 데이터셋 사용
2) 데이터 준비 : S3 버킷 아래 폴더로 csv 파일 업로드
3) rew_data.orange_telecom_customers로 로딩 (COPY)
CREATE TABLE raw_data.orange_telecom_customers ( state varchar,
account_length integer,
area_code integer,
international_plan varchar,
...
customer_service_calls integer, churn varchar,
purpose varchar );
COPY raw_data.orange_telecom_customers
FROM 's3://keeyong-test-bucket/redshift_ml/train.csv'
credentials 'aws_iam_role=arn:aws:iam::521227329883:role/redshift.read.s3' delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;
4) IAM ROLE 생성 후 SageMaker 사용권한을 Redshift cluster에 지정
5) CREATE MODEL 명령 사용
CREATE MODEL orange_telecom_customers_model FROM (
SELECT
state, account_length, ..., customer_service_calls, churn FROM raw_data.orange_telecom_customers
WHERE purpose = 'Train'
)
TARGET churn
FUNCTION ml_fn_orange_telecom_customers IAM_ROLE 'arn:aws:iam::521227329883:role/Redshift-ML' SETTINGS (
S3_BUCKET 'keeyong-test-bucket' );
6) Model SQL 함수로 테이블 상의 레코드들을 대상으로 예측 수행
SELECT churn, ml_fn_orange_telecom_customers(
state, account_length, area_code, international_plan, voice_mail_plan, number_vmail_messages, total_day_minutes, total_day_calls, total_day_charge, total_eve_minutes, total_eve_calls, total_eve_charge, total_night_minutes, total_night_calls, total_night_charge, total_intl_minutes, total_intl_calls, total_intl_charge, customer_service_calls
) AS "prediction"
FROM raw_data.orange_telecom_customers WHERE purpose = 'Test';
7) 사용이 다 끝난 후 SageMaker와 관련된 리소스 제거하기 (Drop Model, SageMaker 웹 콘솔의 models와 endpoints 삭제)
DROP MODEL orange_telecom_customers_model
4. Redshift 중지 및 제거
더 이상 필요하지 않다면 잠시 중지하거나 아예 제거할 수 있다. 다만, 가변 비용 옵션은 중지 기능을 제공하지 않는다. Redshift 서비스는 주기적으로 버전 업그레이드를 위해 중단된다. 이를 Maintenance window라고 부른다. 이 또한 Serverless에는 존재하지 않는다.
테이블 청소와 최적화를 위하여 VACUUM 명령을 이용할 수 있다. 이를 통해 테이블 데이터를 정렬하고, 디스크 공간을 해제하고, 삭제된 행에서 공간을 회수하고, 테이블 통계 업데이트를 할 수 있다. 큰 테이블에 대한 VACUUM 명령은 리소스를 많이 잡아먹으므로 바쁘지 않을 때 실행해주는 것이 좋다.
고정 비용 옵션에서 Redshift 클러스터를 중지하려면 상단 메뉴에서 Stop을 선택하면 되는데, 이 때 클러스터의 스토리지 비용만 부담하게 되고 SQL 실행은 불가능해진다. 다시 필요해지면 같은 메뉴에서 Resume을 선택하면 된다. 삭제는 Delete를 선택하면 되고, 데이터베이스 내용 백업을 S3로 할 것인지에 대한 여부를 선택할 수 있다. 이 S3 백업으로부터 Redshift 클러스터를 나중에 새로 론치할 수 있다.
가변 비용 옵션에서 중지는 할 수 없고, 제거를 하기 위해서는 먼저 모든 Workgroup들을 삭제한 후에 모든 Namespace들을 삭제하면 된다.
☁️ 소감
비용 문제가 발생할 수 있으므로 따로 직접 실습을 하지는 않을 예정이지만, 실습을 하는 화면을 유심히 살펴보았다. 설명을 들을 때는 오래 걸렸지만 막상 정리하고 보니까 꽤 간단해 보이기도 한다. 방법에 대해서는 따로 포스팅하여 정리해야 할 것 같다.
큰 데이터를 언제 다뤄볼 수 있을까 궁금하다.