이번 주는 파이프라인이 "구축"된 뒤 "운영"되는 단계를 다뤘다. 나흘의 주제는 따로 떨어진 것이 아니라, 운영자가 장애 한 건을 겪으며 차례로 던지는 네 질문이다.
운영 중인 파이프라인
│
┌──────────────┬─────────┴────────┬───────────────┐
지금 정상인가? 데이터가 맞는가? 왜·누가 깨뜨렸나? 얼마를 쓰는가?
(Day 1) (Day 2) (Day 3) (Day 4)
│ │ │ │
CloudWatch Glue Data CloudWatch Logs 비용 할당 태그
지표·알람 Quality CloudTrail Cost Explorer
EMF·복합 알람 DQDL·이상 탐지 Retry/Catch·DLQ Budgets·이상 탐지
- 왼쪽 두 질문은 탐지, 셋째는 진단과 복구, 넷째는 지속 가능성이다. 문제를 읽을 때 지문이 넷 중 무엇을 묻는지 먼저 정하면 보기를 좁힐 수 있다.
- 흔한 오답 구조는 "질문과 다른 칸의 도구"다. "누가 삭제했나"에 CloudWatch Logs, "비용 급증 탐지"에 CloudTrail 을 고르게 만든다.
| 알고 싶은 것 | 볼 곳 | 틀리기 쉬운 선택 |
|---|
| 컨슈머가 뒤처지는가 | GetRecords.IteratorAgeMilliseconds(Maximum) | IncomingBytes(유입량일 뿐) |
| 쓰기가 거부되는가 | WriteProvisionedThroughputExceeded | 이터레이터 에이지(읽는 쪽 지표) |
| Glue 잡이 왜 느린가 | 셔플·힙·익스큐터 지표, 드라이버·익스큐터 로그 | CloudTrail |
| EMR 이 놀고 있는가 | IsIdle 연속값, 자동 종료 정책 | AppsRunning 단일 시점 |
| 들어온 데이터가 믿을 만한가 | Glue Data Quality 점수·규칙 결과 | CloudWatch 지표(잡 성공 여부만 알려 줌) |
| 누가 테이블·정책을 바꿨나 | CloudTrail 관리 이벤트 | CloudWatch Logs |
| 누가 객체를 읽었나 | CloudTrail 데이터 이벤트(직접 켠다) | 관리 이벤트 |
| 어느 팀이 얼마를 썼나 | 활성화한 비용 할당 태그 + Cost Explorer | Budgets |
| 평소와 다른 비용 급증 | Cost Anomaly Detection | Budgets(정한 임계값만 본다) |
- "잡이 성공했다"와 "데이터가 맞다"는 다른 사실이다. 잡은 빈 파일을 읽고도 성공한다. 모니터링(Day 1)이 품질 검증(Day 2)을 대신하지 못하는 이유다.
기록·로그
| 구분 | CloudWatch Logs | CloudTrail 관리 이벤트 | CloudTrail 데이터 이벤트 | S3 서버 액세스 로그 |
|---|
| 답하는 질문 | 무엇이 출력됐나 | 누가 설정을 바꿨나 | 누가 데이터를 건드렸나 | 버킷에 어떤 요청이 왔나 |
| 기본 상태 | 서비스별 | 켜짐(90일 조회) | 꺼짐 | 꺼짐 |
| 고유한 쓸모 | 스택 트레이스 | 감사 | 객체 단위 감사 | 인증 실패, 수명 주기 동작 |
"평소와 다름"을 잡는 세 기능
| 구분 | 대상 | 날 |
|---|
| CloudWatch Anomaly Detection | 운영 지표(지연, 오류율) | Day 2 |
| Glue Data Quality 이상 탐지 | 데이터 통계(행 수, 완전성) | Day 2 |
| Cost Anomaly Detection | 비용 | Day 4 |
- 셋 모두 "임계값을 사람이 정하기 어렵다"는 같은 문제를 푼다. 보기에 셋이 함께 나오면 무엇의 이상인지로 고른다.
실패를 다루는 네 장치
| 장치 | 대상 | 동작 |
|---|
| Retry | 일시적 오류 | 간격을 늘려 가며 다시 시도 |
| Catch | 재시도로 안 풀린 오류 | 다른 상태(격리·통보)로 분기 |
| DLQ | 반복 실패한 메시지 | 큐에서 빼서 따로 보관 |
| 검증 게이트 | 실행은 성공했지만 품질 미달 | 다음 단계 진행 차단 |
- 앞의 셋은 실행이 실패했을 때, 넷째는 실행은 성공했는데 결과가 틀렸을 때의 장치다.
용량을 자동으로 맞추는 기능
| 기능 | 무엇을 늘리나 | 사용자가 정하는 것 |
|---|
| Glue Auto Scaling | 잡 실행 중의 워커 | 최대 워커 수 |
| EMR Managed Scaling | 코어·태스크 노드 | 최소·최대, 온디맨드 상한, 코어 상한 |
| Kinesis 온디맨드 | 샤드 | 없음(모드 선택만) |
| Redshift Concurrency Scaling | 임시 쿼리 클러스터 | 큐의 모드, 클러스터 수 상한 |
| 영역 | 항목 | 값 |
|---|
| CloudWatch | 지표 해상도 | 표준 1분, 고해상도 1초(커스텀 지표만) |
| CloudWatch | 지표 보관 | 1분 단위 15일, 5분 단위 63일, 1시간 단위 455일 |
| CloudWatch | 누락 데이터 기본 처리 | missing(전부 비면 INSUFFICIENT_DATA) |
| CloudWatch | 고해상도 알람 주기 | 10초 또는 30초 |
| Glue | 잡 지표 보고 간격 | 30초 |
| Glue | 잡 타임아웃 기본값 | 4.0 이하 2,880분, 5.0 이상 480분 |
| Glue | 자동 재시도 | 0~10회, 타임아웃된 잡은 재시작 안 함 |
| Glue | 실시간 로그 | 5.0 은 기본, 4.0 이하는 연속 로깅을 켠다 |
| EMR | 지표 보고 간격 | 5분(변경 불가) |
| Kinesis | 스트림 지표 | 1분, 무료. 샤드 지표는 유료 옵션 |
| Glue DQ | 이상 탐지 최소 데이터 | 데이터 포인트 3개 |
| Glue DQ | 룰셋 한도 | 규칙 2,000개, 65KB |
| CloudTrail | 이벤트 기록 | 관리 이벤트 90일 |
| Step Functions | Retry 기본값 | 간격 1초, 3회, 배수 2.0, 지터 없음 |
| Lambda 비동기 | 함수 오류 재시도 | 2회(1분 뒤, 2분 뒤) |
| SQS | 가시성 타임아웃 | 기본 30초, 최대 12시간 |
| 비용 태그 | 반영 지연 | 최대 24시간, 백필은 최대 12개월 |
| Athena | 쿼리당 스캔 한도 최솟값 | 10MB |
- 최근 바뀐 값이 둘 있다. Glue 잡 기본 타임아웃(48시간 → 5.0 부터 8시간)과 비용 할당 태그의 소급 여부(불가 → 백필 가능)다. 시험 자료에는 옛 값으로 나올 수 있다.
00:00 EventBridge 스케줄 → Step Functions 파이프라인 시작
1) Glue 수집 잡 (실시간 로그 + Auto Scaling + 잡 지표)
2) Glue Data Quality 평가 (DQDL + 이상 탐지)
└─ 치명 규칙 실패 또는 점수 < 0.95 → 격리 버킷 + SNS + 중단
3) EMR 변환 (코어 온디맨드, 태스크 스팟, Managed Scaling)
4) curated 적재 + Athena 검증 쿼리
비용 운영:
- 모든 리소스에 Project/Environment 태그, 관리 계정에서 활성화
- Budgets 80% 알림, Cost Anomaly Detection 으로 급증 감지
- 월간 Cost Explorer 리뷰로 사이징 재조정
같은 파이프라인에서 새벽에 일이 났다고 가정한다. 나흘의 내용이 시간 순서로 이어진다.
| 시각 | 일어난 일 | 쓰는 것 | 날 |
|---|
| 02:10 | 복합 알람이 울림(잡 실패율 + 처리 건수 0) | 복합 알람, TreatMissingData=breaching | Day 1 |
| 02:12 | Step Functions 실행 그래프에서 품질 평가 단계가 실패로 분기된 것을 확인 | 오케스트레이터부터 본다 | Day 3 |
| 02:15 | 규칙 결과: RowCount 가 평소의 40%, IsComplete "customer_id" 실패 | DQ 규칙 결과·이상 관찰 | Day 2 |
| 02:20 | 격리 버킷에서 실패 행 확인: 특정 지역 주문의 customer_id 가 전부 NULL | 행 단위 결과 + 실패 사유 | Day 2 |
| 02:30 | 원천 추출 잡 로그: 조인 대상 테이블을 찾지 못함 | CloudWatch Logs | Day 1·3 |
| 02:35 | CloudTrail: 전날 저녁 한 역할이 카탈로그 테이블을 UpdateTable 로 변경 | 관리 이벤트 | Day 3 |
| 03:00 | 테이블 정의 복구 후 해당 날짜 파티션만 재처리, 실패한 실행은 redrive | 멱등 재처리, redrive | Day 2·3 |
| 다음 날 | 재처리로 그날 Glue 비용이 평소의 두 배. 이상 탐지 알림 확인, 예산은 초과 없음 | Cost Anomaly Detection vs Budgets | Day 4 |
- 02:10 에 알람이 울린 것은 처리 건수 지표에 누락 처리를 걸어 두었기 때문이다. 기본값이었다면 아침에 사람이 발견했다.
- 02:15 에 curated 가 오염되지 않은 것은 게이트가 적재 앞에 있었기 때문이다. 게이트가 없었다면 02:30 이후의 일은 "오염 범위 조사"가 됐을 것이다.
- 03:00 의 재처리가 중복을 만들지 않은 것은 적재가 파티션 덮어쓰기였기 때문이다.
- 알람이 조용한 것은 정상의 증거가 아니다. 지표가 끊기면 기본 설정의 알람은 울리지 않는다.
- 품질 점수는 행 비율이 아니다. 통과한 규칙의 비율이므로 치명 규칙은 점수와 따로 판정한다.
- 이상 탐지는 첫날부터 동작하지 않는다. 통계가 쌓여야 하고, 한 번 잡힌 이상값은 제외하지 않으면 정상으로 학습된다.
- CloudTrail 이 켜져 있어도 객체 접근은 안 남는다. 데이터 이벤트는 별도 설정이다.
- Step Functions 의 지터는 기본으로 꺼져 있다. 백오프만으로는 동시 재시도가 흩어지지 않는다.
- 표준 큐의 DLQ 는 보존 기간이 새로 시작되지 않는다. DLQ 보존을 원본 큐보다 길게 둔다.
- 태그는 달아도 활성화하지 않으면 비용에 안 보인다. 조직에서는 관리 계정의 일이다.
- Athena 워크그룹 알림은 쿼리를 멈추지 않는다. 멈추는 것은 쿼리당 한도뿐이다.
- 스케일링 상한을 올려도 평소 비용은 줄지 않는다. 베이스라인을 다시 잡는다.
| 지문 단서 | 정답 |
|---|
| "누가 삭제했는지" + "컨슈머가 얼마나 지연됐는지" | CloudTrail + IteratorAgeMilliseconds |
| "품질 점수가 임계값 미만일 때의 동작" | Choice 로 차단, 격리, 통보 |
| "태스크 노드를 스팟으로 바꿀 때의 원칙" | 코어 노드는 안정적인 옵션으로 유지 |
| "자동 재시도의 전제 조건" | 태스크가 멱등 |
| "자동 스케일링을 켰는데 평소 비용이 과도" | 베이스라인 사이징 점검 |
| "파이프라인이 멈췄는데 알림이 없었다" | 누락 데이터 처리, 하트비트성 지표 알람 |
| "실패 원인을 고친 뒤 큐의 실패 메시지 재처리" | DLQ redrive |
| "예산 임계값을 정하기 어려운 급증 탐지" | Cost Anomaly Detection |
다음 주는 데이터 보안과 거버넌스다. IAM 과 Lake Formation 의 접근 제어에서 시작한다.
- 관측성(observability) : 지표·로그·추적으로 시스템 안에서 무슨 일이 벌어지는지 밖에서 알아낼 수 있는 정도.
- 증상 기반 알람 : CPU 같은 자원 수치가 아니라 지연·실패율처럼 사용자가 겪는 현상에 거는 알람.
- 검증 게이트 : 품질이 기준에 못 미친 데이터를 다음 단계로 넘기지 않는 지점.
- 격리 버킷 : 게이트를 통과하지 못한 데이터를 실패 사유와 함께 모아 두는 곳.
- 멱등 재처리 : 같은 구간을 몇 번 다시 돌려도 결과가 한 번 돌린 것과 같은 재처리.
- redrive : 실패한 메시지나 실행을 원인 수정 후 다시 처리 경로에 올리는 것.
- 베이스라인 : 평상시 부하에 맞춘 기본 용량. 스케일링이 흡수하는 변동분과 구분한다.
- 런북(runbook) : 특정 장애가 났을 때 무엇을 어떤 순서로 확인하고 조치할지 적어 둔 절차서.
📝 연습 문제
선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 "어제 누가 prod Glue 테이블을 삭제했는지"와 "어젯밤 Kinesis 컨슈머가 얼마나 지연됐는지"를 각각 확인하기 위한 올바른 도구 조합은?
야간 ETL에서 Glue Data Quality 점수가 임계값 미만일 때 권장되는 파이프라인 동작은?
비용을 절감하기 위해 EMR 태스크 노드를 Spot으로 전환할 때 함께 적용해야 하는 원칙으로 가장 적절한 것은?
일시적 오류가 잦은 외부 API 호출 태스크를 자동 재시도하도록 구성할 때, 안전성을 위해 반드시 전제되어야 하는 조건은?
자동 스케일링을 도입했는데도 평소 비용이 여전히 과도하다면 가장 먼저 점검해야 할 것은?