데이터 레이크가 커지면 "누가 어떤 테이블·컬럼·행에 접근할 수 있는가"를 IAM 정책만으로 관리하기 어렵다. S3 + Glue Data Catalog 만 쓰면 권한이 두 군데로 갈린다.
메타데이터: IAM 정책의 glue:GetTable 같은 액션과 Glue 리소스 정책.
데이터: S3 버킷 정책과 IAM 정책의 s3:GetObject.
이 구조에서는 권한의 최소 단위가 S3 프리픽스다. "이 테이블에서 주민번호 컬럼만 빼고", "자기 지역 행만"을 표현할 수 없다. 컬럼을 가리려면 컬럼을 뺀 사본 테이블을 따로 만들어야 한다.
Lake Formation 은 이를 RDBMS 식 권한 모델로 바꾼다. 권한은 두 층으로 걸린다.
메타데이터 권한: Data Catalog 의 데이터베이스·테이블에 대한 권한. 권한이 없는 테이블은 GetTables 응답에 아예 나오지 않는다.
스토리지 접근 관리: 등록된 S3 위치의 데이터를 통합 엔진이 대신 읽도록 임시 자격 증명을 내준다.
💡 관련 이론: Lake Formation 은 Glue Data Catalog 를 권한 제어 지점으로 쓴다. 별도의 카탈로그를 만드는 것이 아니라 같은 카탈로그의 데이터베이스·테이블에 GRANT/REVOKE 를 얹는 것이다. 그래서 크롤러·ETL 잡·Athena 테이블은 그대로 두고 권한 계층만 바뀐다.
분석가가 Athena 로 Lake Formation 관리 테이블을 조회하면 다음 순서로 진행된다.
① 메타데이터 요청 Athena → Data Catalog : 이 테이블의 정의를 달라② 권한 확인 Data Catalog → Lake Formation : 이 사용자가 볼 수 있는가 → 허용된 컬럼만 담긴 메타데이터를 엔진에 반환③ 자격 증명 요청 Athena → Lake Formation : 등록된 위치의 데이터 접근 권한을 달라 → Lake Formation 이 등록 시 지정한 역할로 임시 자격 증명 발급④ 데이터 읽기 Athena → S3 : 임시 자격 증명으로 읽고, 컬럼·행·셀 필터 적용 후 결과 반환
③④가 자격 증명 벤딩이다. 사용자의 IAM 정책에는 S3 권한이 없어도 된다. S3 권한은 "등록할 때 지정한 역할"이 갖고 있다.
테이블 위치가 Lake Formation 에 등록되어 있지 않으면 ③이 없다. 엔진이 사용자 권한으로 S3 를 직접 읽고, 버킷 정책과 IAM 정책이 평가된다.
행·셀 필터를 실제로 적용하는 것은 엔진이다. 그래서 Lake Formation 과 통합된 엔진을 거쳐야만 필터가 지켜진다.
# S3 위치를 Lake Formation 에 등록 (Lake Formation 이 맡을 역할 지정)aws lakeformation register-resource \ --resource-arn arn:aws:s3:::acme-datalake-clean-prod \ --role-arn arn:aws:iam::111122223333:role/LakeFormationServiceRole
등록 대상은 버킷 또는 버킷 아래 프리픽스다(개별 객체는 안 된다). 등록 역할은 두 종류다.
역할
특징
반드시 사용자 정의 역할을 써야 하는 경우
서비스 연결 역할
가장 간단. 필요한 권한이 자동 부여
-
사용자 정의 역할
S3 읽기·쓰기 인라인 정책과 lakeformation.amazonaws.com 신뢰 관계를 직접 구성
다른 계정의 위치 등록, AWS 관리형 키(aws/s3)로 암호화된 위치, Amazon EMR 로 접근할 위치
등록하는 관리자는 그 역할에 대한 iam:PassRole 이 있어야 한다.
위치가 KMS 키로 암호화되어 있으면 등록 역할이 그 키를 쓸 수 있어야 한다. "권한은 다 줬는데 Access Denied"의 흔한 원인이다.
요청자 지불(Requester Pays) 버킷은 등록을 피한다. 등록 역할이 항상 요청자로 취급된다.
IAM 은 거친 문, Lake Formation 은 세밀한 문이다. 사용자는 Athena·Glue API 를 호출할 IAM 권한에 더해 lakeformation:GetDataAccess IAM 권한이 있어야 하고(이 권한이 있어야 임시 자격 증명을 요청할 수 있다), 그 위에 Lake Formation 의 SELECT 등을 받아야 한다. Athena 는 사용자에게, 다른 엔진은 실행 역할에 이 IAM 권한이 필요하다.
데이터 위치 권한은 읽기 권한이 아니다. "이 S3 위치를 가리키는 테이블·데이터베이스를 만들 수 있는가"를 통제한다. 읽고 쓰는 데는 SELECT·INSERT 로 충분하다. 임의 위치에 테이블을 만들어 데이터를 빼내는 것을 막는 장치다.
한 주체가 여러 경로로 권한을 받으면 합집합이 된다. 명명형으로 col1~3, 태그로 col5~6 을 받았다면 다섯 컬럼을 볼 수 있다.
WITH GRANT OPTION 으로 받은 권한은 다른 주체에게 다시 부여할 수 있다. 권한 관리를 도메인 팀에 위임할 때 쓴다.
데이터 레이크 관리자는 모든 리소스에 대한 DESCRIBE, 모든 위치의 데이터 위치 권한, GRANT/REVOKE 권한을 암묵적으로 갖는다. 테이블을 만든 사람은 그 테이블의 모든 권한을 암묵적으로 갖는다.
Lake Formation 은 기존 Glue 사용자를 깨뜨리지 않으려고, 기본적으로 모든 데이터베이스·테이블에 IAMAllowedPrincipals 라는 가상 그룹의 권한(Super)을 걸어 둔다. 이 그룹은 "IAM 정책으로 카탈로그 리소스에 접근할 수 있는 모든 주체"다.
이 권한이 남아 있는 동안에는 IAM 만으로 접근이 결정된다. Lake Formation 에서 컬럼을 제한해 GRANT 해도, IAM 으로 접근 가능한 사용자는 전체를 본다.
세밀한 권한을 강제하려면 해당 리소스에서 IAMAllowedPrincipals 권한을 회수하고, 새 데이터베이스·테이블에 이 권한이 자동으로 붙지 않도록 계정 설정을 바꾼다.
⚠️ 함정: "Lake Formation 에서 컬럼 제한을 걸었는데 분석가가 여전히 전체 컬럼을 본다"의 원인은 대개 둘 중 하나다. IAMAllowedPrincipals 권한이 남아 있거나, 분석가의 IAM 정책에 S3 직접 권한이 있어 Lake Formation 을 우회하는 경로가 열려 있다. Lake Formation 의 권한 모델은 S3 API 로 직접 읽는 것을 막지 못한다. S3 직접 권한을 걷어 내야 통제가 완성된다.
블루프린트는 흔한 수집 패턴의 템플릿이고, 실행하면 Glue 크롤러·잡·트리거로 이루어진 워크플로우가 생성된다.
블루프린트
동작
고르는 기준
Database snapshot
JDBC 원천의 모든 테이블을 통째로 적재·재적재(제외 패턴 지정 가능)
스키마가 자유롭게 바뀐다(컬럼 이름 변경·삭제), 원천과 완전히 일치해야 한다
Incremental database
북마크 컬럼 기준으로 새 데이터만 적재. 대상 테이블을 하나씩 지정
컬럼이 추가만 된다, 새 행만 들어오고 기존 행은 수정되지 않는다
Log file
CloudTrail, ELB, ALB 로그를 일괄 적재
AWS 서비스 로그
Incremental database 블루프린트를 처음 실행하면 전체를 적재하고 북마크를 잡는다. 이후 실행부터 증분이다.
북마크 방식은 "북마크 컬럼 값이 커진 행"만 본다. 기존 행의 UPDATE·DELETE 는 잡지 못한다. 변경과 삭제까지 따라가야 하면 DMS 의 CDC 가 맞는 도구다.
워크플로우는 Glue 콘솔에서 DAG 로 보이고 노드별 상태를 추적할 수 있다. 워크플로우가 끝나면 실행한 사용자에게 생성된 테이블의 SELECT 가 부여된다.
블루프린트는 Glue 워크플로우의 생성기다. 결과물은 일반 Glue 크롤러·잡·트리거이므로 Glue 콘솔에서 그대로 모니터링하고, 비용도 그 크롤러·잡이 돈 만큼 Glue 쪽에서 발생한다. 단, Lake Formation 이 만든 블루프린트와 워크플로우는 사용자가 편집할 수 없다.