AWS DEA-C01 문제로 공부하기 — Day 08
Redshift IdP 페더레이션, VPC Lambda → S3 Gateway Endpoint, DynamoDB TTL, IoT 데이터 레이크 파이프라인, Redshift ROW_NUMBER 윈도우 함수 — 5문제 핵심 정리.
Amazon Redshift 네이티브 IdP 페더레이션은 Okta·Azure AD 같은 서드파티 자격증명 공급자(IdP)를 통해 Redshift에 인증할 수 있도록 지원합니다. 첫 번째 단계는 Redshift에 IdP를 등록하는 것입니다.
Amazon Redshift 레이크하우스 아키텍처에서 사용자들이 사내 SSO(Single Sign-On) 시스템을 통해 Redshift 쿼리 편집기에서 인증할 수 있도록 해야 합니다. 데이터 엔지니어가 가장 먼저 해야 할 단계는 무엇일까요?
- ARedshift 개별 클러스터의 구성 설정 화면에서 SSO 시스템을 자격증명 공급자로 등록합니다.❌ IdP는 개별 클러스터가 아닌 Amazon Redshift 서비스 전체 레벨에서 등록해야 함. 클러스터 설정 화면에 IdP 등록 기능이 없음.
- BAmazon Redshift 내에서 SSO 시스템을 자격증명 공급자(IdP)로 등록합니다.✅ Redshift 네이티브 IdP 페더레이션 — Amazon Redshift 서비스 레벨에서 IdP를 등록하면 Redshift가 해당 IdP를 인증 소스로 신뢰. 등록 후에는 클러스터별로 해당 IdP 인증을 사용하도록 구성 가능. 첫 번째 단계: Redshift에 IdP 등록.
- CSSO 시스템을 AWS Secrets Manager에 자격증명 공급자로 등록하고, Secrets Manager를 통해 자격증명을 관리하도록 Redshift를 구성합니다.❌ AWS Secrets Manager — 자격증명(ID/PW) 저장·교체 서비스. 인증(Authentication) 또는 IdP 페더레이션 기능이 없음. Secrets Manager로는 SSO 인증 구현 불가.
- DSSO 시스템을 AWS Certificate Manager(ACM)에 등록하고 ACM으로 사용자 자격증명을 관리하도록 Redshift를 구성합니다.❌ AWS ACM(Certificate Manager) — SSL/TLS 인증서 관리 서비스. ID 페더레이션 기능이 없음. 인증서와 사용자 인증(IdP)은 완전히 다른 개념.
| 단계 | 작업 |
|---|---|
| 1단계 | Amazon Redshift에 IdP 등록 (서비스 레벨) |
| 2단계 | Redshift 클러스터에서 IdP 인증 사용 설정 |
| 3단계 | IdP에서 Redshift 애플리케이션 구성 |
| 4단계 | 사용자·그룹 매핑 설정 |
Redshift IdP 페더레이션 첫 번째 단계
→ Amazon Redshift에 IdP 등록 (클러스터가 아닌 서비스 레벨)
Secrets Manager = 자격증명 저장 (IdP 페더레이션 아님)
ACM = SSL/TLS 인증서 (사용자 인증 아님)S3 VPC Gateway Endpoint는 VPC 내에서 인터넷 게이트웨이나 NAT 없이 S3에 안전하게 연결하는 무료 기능입니다. VPC 내 Lambda 함수가 S3에 업로드할 때 타임아웃이 발생하면 Gateway Endpoint와 라우팅 테이블을 확인해야 합니다.
VPC를 지원하는 Lambda 함수가 레거시 SFTP 서버에서 파일을 가져와 S3 버킷에 업로드하는 역할을 합니다. SFTP 연결은 정상이지만 S3 업로드 시 타임아웃 오류가 반복됩니다. 가장 비용 효율적으로 이 문제를 해결하는 방법은 무엇일까요?
- AVPC 퍼블릭 서브넷에 NAT 게이트웨이를 생성하고 네트워크 트래픽을 NAT 게이트웨이로 라우팅합니다.❌ NAT 게이트웨이 — 프라이빗 서브넷에서 인터넷으로 나가는 통로. 시간당 요금 + 처리 데이터 GB당 요금이 발생. S3 접근에 NAT를 사용하면 불필요한 비용 발생. Gateway Endpoint를 쓰면 무료.
- BAmazon S3용 VPC Gateway Endpoint를 생성하고, 네트워크 트래픽이 Gateway Endpoint를 경유하도록 라우팅 테이블을 업데이트합니다.✅ S3 VPC Gateway Endpoint — S3로 향하는 트래픽을 AWS 내부 네트워크로 라우팅하는 무료 엔드포인트. 인터넷 게이트웨이나 NAT 없이도 S3 접근 가능. 추가 비용 없음. 라우팅 테이블에 엔드포인트 경로만 추가하면 타임아웃 해결.
- CAmazon S3용 VPC Interface Endpoint를 생성하고 네트워크 트래픽을 Interface Endpoint로 라우팅합니다.❌ VPC Interface Endpoint — ENI(네트워크 인터페이스) 기반으로 시간당 요금이 발생. 기술적으로 동작하지만 S3는 무료인 Gateway Endpoint가 있어 Interface Endpoint를 쓸 이유가 없음.
- DVPC 인터넷 게이트웨이를 사용하여 인터넷으로 연결하고 네트워크 트래픽을 인터넷 게이트웨이로 라우팅합니다.❌ 인터넷 게이트웨이 — 퍼블릭 IP가 있는 리소스에서만 작동. VPC 지원 Lambda는 탄력적 네트워크 인터페이스(프라이빗 IP)를 사용하므로 인터넷 게이트웨이를 직접 사용할 수 없음.
| 방법 | 비용 | 보안 | VPC Lambda 적합? |
|---|---|---|---|
| S3 Gateway Endpoint | 무료 | AWS 내부 네트워크 | ✓ 최적 |
| S3 Interface Endpoint | 시간당 요금 | AWS 내부 네트워크 | 비용 과다 |
| NAT 게이트웨이 | 시간당 + GB당 요금 | 인터넷 경유 | 비용 과다 |
| 인터넷 게이트웨이 | 무료 | 인터넷 경유 | 프라이빗 IP 불가 |
"VPC 내 Lambda → S3 타임아웃 + 비용 효율"
→ S3 VPC Gateway Endpoint (무료!)
S3 / DynamoDB = Gateway Endpoint (무료)
그 외 서비스 = Interface Endpoint (유료)
NAT = 불필요한 비용 발생DynamoDB TTL(Time to Live)은 항목별로 만료 시각을 타임스탬프로 지정하면 해당 시각이 지난 후 DynamoDB가 자동으로 삭제하는 기능입니다. Lambda나 Glue 없이 내장 기능만으로 데이터 수명주기를 관리할 수 있습니다.
신규 회원 대상 30일 프로모션 기간 동안의 거래를 DynamoDB에 저장하고 Lambda로 처리합니다. 프로모션 기간이 지난 거래 데이터는 스토리지 비용 절감과 분석 정확도 유지를 위해 자동으로 삭제되어야 합니다. 운영 오버헤드를 최소화하는 방법은 무엇일까요?
- A매일 DynamoDB 데이터를 S3로 전송하는 Lambda 함수를 구현하고 S3 수명주기 정책으로 30일 후 삭제합니다.❌ DynamoDB → S3 전송 로직을 직접 코딩해야 하고, 원본 DynamoDB 데이터는 삭제되지 않음. 데이터 이동 코딩 + 두 스토리지 관리라는 불필요한 오버헤드 발생.
- B매일 DynamoDB 테이블을 전체 스캔하여 30일이 지난 항목을 찾아 삭제하는 Lambda 함수를 구현합니다.❌ Lambda 함수 개발 + 매일 전체 스캔(RCU 비용 증가) + 유지보수. DynamoDB 기본 TTL 기능으로 훨씬 간단하게 해결 가능한데 불필요하게 복잡한 방법.
- CDynamoDB 항목에 TTL(Time to Live) 속성을 설정하여 거래 생성일로부터 30일 후에 자동으로 만료·삭제되도록 합니다.✅ DynamoDB TTL(Time to Live) — 각 항목에 Unix 타임스탬프로 만료 시각을 설정하면 DynamoDB가 자동으로 삭제. 마치 식품 유통기한처럼 날짜를 찍어두면 지나면 자동 폐기. 추가 코드·서비스 없이 내장 기능만으로 구현. 삭제 비용도 없음.
- DGlue ETL 작업으로 30일 후 데이터를 별도 아카이브 DynamoDB 테이블로 이동합니다.❌ Glue ETL 구성 + DynamoDB 간 데이터 이동 로직 + 아카이브 테이블 관리까지 추가. 데이터를 삭제하는 것이 아니라 이동하는 것이므로 스토리지 비용 절감 효과도 없음. 과도한 복잡도.
| 방법 | 코딩 필요 | 추가 비용 | 운영 부담 |
|---|---|---|---|
| DynamoDB TTL | 없음 | 없음 | 최소 |
| Lambda 스캔·삭제 | 필요 | Lambda + RCU 비용 | 중간 |
| S3 수명주기 + 이동 | 필요 | 이동 + S3 비용 | 높음 |
| Glue ETL 이동 | 필요 | Glue DPU 비용 | 높음 |
"DynamoDB 항목 일정 기간 후 자동 삭제" → TTL(Time to Live)
Unix 타임스탬프로 만료 시각 설정 → DynamoDB가 자동 삭제
추가 코드·서비스·비용 없음 = 내장 기능IoT 데이터 파이프라인의 표준 패턴은 S3(데이터 레이크) + Glue(완전관리형 ETL) + QuickSight(시각화)입니다. Athena는 쿼리 도구이지 시각화 도구가 아님을 반드시 구분해야 합니다.
공장에서 매시간 IoT 센서 데이터를 수신합니다. 센서는 장비 출력과 오류 정보를 다양한 형식으로 전송합니다. 이 데이터를 데이터 레이크로 통합하고, 완전관리형 ETL로 일관된 형식으로 변환한 뒤 시각화 대시보드로 분석하려 합니다. 이 요건을 모두 충족하는 솔루션은 무엇일까요?
- A데이터를 Amazon Redshift에 저장하고, AWS Glue로 형식을 통일하고, Amazon Athena로 시각화합니다.❌ Redshift는 데이터 웨어하우스로 데이터 레이크가 아님. Amazon Athena는 쿼리 서비스이지 시각화 도구가 아님. 시각화는 QuickSight가 담당.
- B데이터를 Amazon S3에 저장하고, AWS Glue로 형식을 통일하고, Amazon Athena로 시각화합니다.❌ S3 + Glue는 맞지만 Athena는 시각화 도구가 아님. Athena는 SQL 쿼리 서비스. 시각화를 위해서는 QuickSight가 필요.
- C데이터를 Amazon Redshift에 저장하고, Amazon EMR 클러스터를 프로비저닝하여 형식을 통일하고, Amazon QuickSight로 시각화합니다.❌ Redshift는 데이터 레이크가 아닌 웨어하우스. Amazon EMR — EC2 기반 클러스터로 완전관리형 ETL이 아님. 클러스터 프로비저닝·관리 부담 존재. QuickSight는 맞음.
- D데이터를 Amazon S3에 저장하고, AWS Glue로 형식을 통일하고, Amazon QuickSight로 시각화합니다.✅ Amazon S3 — 데이터 레이크 표준 스토리지. AWS Glue — 완전 서버리스 관리형 ETL, 다양한 형식을 일관된 형식으로 변환. Amazon QuickSight — BI 시각화 서비스. 세 요건(데이터 레이크 + 완전관리형 ETL + 시각화) 모두 정확히 충족.
| 서비스 | 역할 | 시각화 가능? |
|---|---|---|
| Amazon QuickSight | BI 시각화 대시보드 | ✓ 전용 |
| Amazon Athena | S3 위 SQL 쿼리 | ✗ 쿼리만 |
| AWS Glue | 완전관리형 ETL | ✗ ETL만 |
| Amazon EMR | 관리형 클러스터 (비완전관리) | ✗ |
데이터 레이크 → Amazon S3
완전관리형 ETL → AWS Glue (서버리스)
시각화 → Amazon QuickSight
Athena = 쿼리 도구 (시각화 아님!) → 자주 나오는 함정ROW_NUMBER()는 동일한 값이 있더라도 항상 연속적인 고유 번호를 부여하는 윈도우 함수입니다. 반면 RANK()는 동점 항목에 같은 순위를 부여하고 다음 순위를 건너뜁니다. "중복 없는 순위"가 요건이라면 ROW_NUMBER가 정답입니다.
제품 테이블(product_id, name, price, category)에서 가격 기준으로 제품을 정렬하되, 가격이 동일하더라도 각 제품에 고유한 순위 번호(1, 2, 3...)를 부여하고 싶습니다. 아래는 원하는 출력 예시입니다.
product_1, 제품A, 100, 카테고리1 → 1
product_2, 제품B, 90, 카테고리2 → 2
product_3, 제품C, 90, 카테고리3 → 3
이 결과를 만드는 SQL은 무엇일까요?
- ACOUNT(DISTINCT product_id) AS product_rank를 사용하여 가격 기준으로 정렬합니다.❌ COUNT(DISTINCT ...) — 집계 함수로 중복 제거 후 개수를 반환. 순위 번호를 만드는 함수가 아님. GROUP BY 없이 개별 행 순위 부여 불가.
- BRANK() OVER (ORDER BY price) AS product_rank를 사용합니다.❌ RANK() — 동일 가격(90)이면 같은 순위(2)를 부여하고 다음 순위(3)는 건너뜀(4로 이동). 예시 출력처럼 2, 3 연속 번호가 나오지 않음. 2, 2, 4가 됨.
- CCOUNT(product_id) AS product_rank를 사용하여 가격 기준으로 정렬합니다.❌ COUNT(product_id)는 집계 함수로 전체 행 수를 반환. 개별 행에 순서대로 번호를 부여하는 기능이 없음.
- DROW_NUMBER() OVER (ORDER BY price DESC) AS product_rank를 사용합니다.✅ ROW_NUMBER() — 동일 값이 있어도 항상 연속적인 고유 번호(1, 2, 3...)를 부여하는 윈도우 함수. 가격 90짜리 두 제품도 2번, 3번으로 다른 번호 부여. 예시 출력 결과와 정확히 일치.
ORDER BY price DESC로 높은 가격이 1위.
| 함수 | 동점 처리 | 예시 (100, 90, 90) | 중복 없는 순위? |
|---|---|---|---|
| ROW_NUMBER() | 고유 번호 부여 | 1, 2, 3 | ✓ |
| RANK() | 동점 같은 순위 + 건너뜀 | 1, 2, 2, 4 | ✗ |
| DENSE_RANK() | 동점 같은 순위 + 연속 | 1, 2, 2, 3 | ✗ |
"중복 없는 연속 순위 번호" → ROW_NUMBER()
ROW_NUMBER = 항상 1, 2, 3, 4... (동점도 다른 번호)
RANK = 동점 시 같은 번호 + 건너뜀 (1, 2, 2, 4)
DENSE_RANK = 동점 시 같은 번호 + 연속 (1, 2, 2, 3)