AWS 기반의 데이터 PII 처리
Published in
8 min readMar 16, 2023
AWS 기반으로 PII(개인 식별 정보, Personal Identifiable Information) 처리된 데이터를 생성하고 각 계정에 공유하는 방법에 대해 설명한 글입니다. PII 처리 구조를 보여주고 각 구조에 대해 설명하는게 주된 내용입니다.
PII 처리 프로세스
1.스케줄 또는 트리거
- 편의를 위해 다양한 형태의 트리거 제공
2.Dump DB(Database) 생성 — ELT (Extract, Load, Transform) 방식 사용
- Production 계정 DB 기반으로 스냅샷 생성
- AWS DMS, Glue 등을 사용한 ETL(Extract, Transform, Load) 방식을 사용하지 않음
- DMS는 탄력적인 변환(Transform)을 하려면 다양한 리소스(Kinesis, Lambda)를 활용해야하고 Glue는 테이블 단위로 관리하기 때문에 데이터 엔지니어링 업무만 전담하는 인원이 없는 소규모의 팀(10인)이 유지 보수 하는데 많은 리소스가 필요
- ELT의 경우 중요 데이터를 먼저 적재하기 때문에 보안 위험이 있지만 해당 프로세스는 Production 계정 내에서 처리하기 때문에 외부에 중요 데이터가 노출 될 일이 없음
- DMS, Glue를 사용하면 단순 테이블 생성을 제외한 기존 데이터베이스 시스템 카탈로그(인덱스, 접근 권한 등)를 이전과 동일하게 사용할 수 없음 → 해당 작업을 하는 목적 중 하나가 테스트 서버에서 사용하기 위함
- ELT 방식을 채택한 이유 — 개발 기간이 ETL 개발 기간보다 상대적으로 빠르고, 유지 보수 비용이 낮기 때문
- 참고 자료 — ETL vs ELT
3.PII 처리
- 약 30개의 테이블과 90개의 컬럼 처리
- DML(Data Manipulation Language)을 사용해서 처리
4.스냅샷 생성 — PII 처리된 DB
- 공유하기 쉬운 형태로 만들기 위해 스냅샷 생성
5.Dump DB 삭제
- PII 처리를 위해 생성했던 DB 삭제
- Dump DB를 생성 AWS CloudFormation 삭제
6.스냅샷 공유
- RDS 스냅샷 공유를 사용해 필요한 계정에 공유
Architecture
RDS 이벤트를 제외한 모든 이벤트는 EventBridge를 사용해서 관리 (Daas는 이벤트 기반으로 알람 메세지를 운영 중)
1.Trigger
- Github actions 기반으로 트리거 생성
- 스케줄 — Github actions (Schedule)
- Slack Command, REST API — Amazon Api Gateway + Github actions(repository_dispatch), 구성 가이드
2.Dump RDS
- Production DB 검색 후 스냅샷 생성
- AWS CDK, boto3를 사용해서 구축
- AWS CDK는 IaC(Infrastructure as Code)이기 때문에 인프라를 관리하고 프로비저닝하는데 효율적이지만 기존 인프라 정보 검색에는 코드 복잡도 증가 방지와 사전 정보를 제공해야해서 boto3를 사용
3.RDS-Events-Handler
- Amazon RDS(Relational Database Service) 상태에 따른 변화에 대해 이벤트 형태로 제공하는 “RDS 이벤트 모니터링”의 이벤트 데이터를 기반으로 실행
- 작업 순서 — RDS 이벤트 알림 구독 생성 → Lambda 트리거를 RDS 이벤트 SNS로 설정
- RDS 이벤트 범주 및 이벤트 메시지
- RDS 이벤트 SNS 포맷 (예시)
{
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:ap-northeast-2:topic:f12",
"Sns": {
"Type": "Notification",
"MessageId": "582f945e-43da-5a48-aa0f-c8d8cbe1ea8c",
"TopicArn": "arn:aws:sns:ap-northeast-2:54542124545:topic",
"Subject": "RDS Notification Message",
"Message":
{
"EventSource": "db-cluster",
"Event Time":"2023-03-11 13:45:30.232",
"Identifier Link":"https://console.aws.amazon.com/rds/home?region=ap-northeast-2",
"Source ID":"dump-cluster",
"Source ARN":"arn:aws:rds:ap-northeast-2:54542124545:cluster:dump-cluster",
"Event ID":"http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Messages.html#RDS-EVENT-0170",
"Event Message":"DB cluster created"
},
"TimeStamp": "2023-03-11T13:45:31.431Z",
"SignatureVersion": "1",
"Signature": "----",
"SigningCertUrl": "https://sns.ap-northeast-2.amazonaws.com/SimpleNotificationService",
"UnsubscribeUrl": "https://sns.ap-northeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn",
"MessageAttributes":
{
"Resource":
{
"Type": "String",
"Value": "arn:aws:rds:ap-northeast-2:54542124545:cluster-snapshot:snapshot-230216"
},
"EventID": {
"Type": "String",
"Value": "RDS-EVENT-0075"
}
}
}
}
]
}
4.PII Processing
- PII 처리 데이터 선정 기준은 Amazon Macie로 1차 검증(DMS로 RDS → S3 이동 후 Amazon Macie로 검증) 후 보안 관리자가 2차 검증 후 선정
- SQL DML 중 하나인 UPDATE를 사용해서 데이터 PII 처리
- PII 처리할 컬럼 중 Unique key가 설정되어 있다면 Unique key 설정 변경 후 작업
- UPDATE 예시
# MySQL 5.x
UPDATE {table}
SET {column} = CONCAT(
CONCAT(
LEFT({column}, {index}),
LPAD("*", CHAR_LENGTH({column})-{index}, "*")
)
);
# MySQL 8.x
UPDATE {table}
SET {column} = REGEXP_REPLACE({column}, '(?<=.{index}).', '*')
);
5.RDS-Events-Handler
- 3번(Architecture)과 동일
6.Send Slack
- Daas에서 공통적으로 사용하는 Lambda
- 메세지 템플릿과 채널 정보만 받아서 슬랙 메세지 발송
결론
- 총 작업 시간은 30~45분 정도가 소요되며, Amazon RDS의 생성 시간이 작업 시간에 많은 영향을 줌
- ELT 방식을 사용해서 개발 기간과 유지 보수에 사용하는 리소스를 줄일 수 있음
- 스냅샷 기반으로 RDS를 생성하기 때문에 시스템 카탈로그 정보가 동일 (DMS, Glue 등 다양한 ETL 서비스를 사용하면 시스템 카탈로그 정보를 동일하게 가져올 수 없음)
- 지속적으로 유지 보수(테이블 추가, 이벤트 수정 등)가 필요한건 2개의 Lambda (RDS-Events-Handler, PII Processing), 나머지 리소스는 변동 사항이 생길 확률이 낮음
- 스냅샷 공유 기능을 사용해 여러개의 계정과 편리하게 공유 가능, 추가 작업 필요 없음
- ELT 방식을 사용했기 때문에 Data Warehouse, Data Lake를 구축하는데 해당 구조를 참조해서 사용할 수 없음 (보안 위험 방지), 테스트 환경에서 사용하는데 적합