어제 본 Kinesis Data Streams는 강력하지만 손이 많이 간다. 샤드 수를 계산하고, 컨슈머 코드(KCL/Lambda)를 짜고, 체크포인트를 관리하고, S3에 어떻게 쌓을지도 직접 구현해야 한다. "그냥 스트리밍 데이터를 S3나 Redshift에 알아서 적재해줬으면" 싶을 때가 많다. 그 요구에 답하는 것이 Amazon Kinesis Data Firehose(현재 명칭 Amazon Data Firehose)다.
Firehose의 한 줄 정의는 "완전관리형 적재(delivery) 파이프"다. 프로듀서가 데이터를 밀어넣으면 Firehose가 알아서 버퍼링하고, 선택적으로 변환·압축·포맷 변환을 거쳐, 목적지에 자동으로 적재한다. 샤드도, 컨슈머 코드도, 스케일링도 신경 쓸 필요가 없다.
DEA-C01에서 이 둘의 차이는 시나리오 문제의 판단 기준이 된다. 차이를 표로 정리한다.
항목
Kinesis Data Streams
Kinesis Data Firehose
성격
실시간 스트림(파이프)
적재(delivery) 파이프
관리
샤드·컨슈머 직접 관리
완전관리형, 서버리스
지연
실시간(밀리초~초)
근실시간(버퍼만큼 지연, S3 기본 300초)
데이터 보존/재처리
가능(최대 365일)
불가(목적지로 흘려보냄)
커스텀 컨슈머
가능(여러 앱이 읽음)
정해진 목적지로만 적재
목적지
직접 구현
S3/Redshift/OpenSearch/Splunk 등 빌트인
💡 관련 이론: 한 줄로 외우면 "복잡한 실시간 처리·여러 컨슈머·재처리가 필요하면 KDS, 단순히 목적지에 적재만 하면 되면 Firehose"다. 더 강력한 조합은 둘을 잇는 것이다. KDS를 소스로 두고 Firehose가 그 스트림을 읽어 S3로 적재하면, 한쪽에서는 Lambda·KCL로 실시간 분석을 하면서 다른 한쪽에서는 Firehose가 원본을 데이터 레이크에 자동 보관하는 패턴이 된다. 시험에서 "실시간 분석 + 원본 보관" 둘 다 나오면 이 조합이 정답인 경우가 많다.
"작은 파일 문제(small files problem)"는 데이터 레이크의 고질병이다. Athena·Spark 같은 쿼리 엔진은 파일 하나당 오버헤드가 있어서, 수많은 작은 파일은 큰 파일 몇 개보다 훨씬 느리고 비싸다. Firehose의 버퍼 크기를 충분히 키우면(예: 128MB) 적은 수의 큰 파일로 적재돼 다운스트림 쿼리 성능이 개선된다. 시험에서 "Athena 쿼리가 느리다 + Firehose 적재" 시나리오면 버퍼 크기를 키우라는 방향을 떠올려야 한다.
Firehose는 적재 전에 Lambda로 레코드를 변환(transform) 할 수 있다. 들어온 레코드를 Lambda가 받아 정제·필터·포맷 변경한 뒤 돌려주면, 그 결과가 목적지에 적재된다. 로그를 표준 JSON으로 정규화하거나, 민감 필드를 마스킹하거나, 잘못된 레코드를 걸러내는 데 쓴다.
import base64, jsondef handler(event, context): output = [] for record in event["records"]: payload = json.loads(base64.b64decode(record["data"])) payload["ingested_at"] = context.aws_request_id # 가공 예시 transformed = json.dumps(payload) + "\n" # 개행 추가 → 줄 단위 적재 output.append({ "recordId": record["recordId"], "result": "Ok", # Ok / Dropped / ProcessingFailed "data": base64.b64encode(transformed.encode()).decode() }) return {"records": output}
또한 Firehose는 빌트인으로 JSON을 Parquet/ORC 컬럼형 포맷으로 변환할 수 있다(Data Format Conversion). 이때 Glue Data Catalog의 스키마를 참조한다. 컬럼형으로 적재하면 Athena 쿼리가 훨씬 빠르고 저렴해진다.
Redshift: 내부적으로 먼저 S3에 쓴 뒤 COPY 명령으로 Redshift에 로드한다. 직접 INSERT가 아니다.
OpenSearch: 로그·검색 인덱싱.
Splunk / 서드파티 HTTP 엔드포인트.
-- Firehose가 Redshift 적재 시 내부적으로 실행하는 형태COPY events FROM 's3://my-data-lake/redshift-staging/manifest'IAM_ROLE 'arn:aws:iam::123456789012:role/redshift-copy'FORMAT AS JSON 'auto';
Firehose의 Redshift 적재가 "S3 경유 후 COPY"라는 점은 시험 포인트다. Redshift는 단건 INSERT가 매우 비효율적인 MPP(대규모 병렬 처리) 데이터 웨어하우스라서, 대량 로드는 항상 S3에서 COPY로 병렬 적재하는 것이 정석이다. Firehose는 이 모범 사례를 내부적으로 자동 구현한다. COPY가 실패해도 데이터는 먼저 써 둔 중간 S3 버킷에 남아 있으므로 다시 적재할 수 있다.
변환 Lambda가 실패하거나 목적지 적재가 실패하면, Firehose는 데이터를 버리지 않고 지정된 S3 백업/에러 prefix로 보낸다. 덕분에 실패한 레코드를 나중에 조사·재처리할 수 있다. 이 백업 버킷 설정이 운영 안정성의 핵심이다. 단, 목적지가 S3인데 S3 전달 자체가 실패하는 경우는 보낼 곳이 없어 예외다(아래 "전달 보장과 목적지별 실패 처리" 참고).
Firehose 스트림에 데이터를 넣는 길은 셋이다. 어느 것을 고르느냐에 따라 한도와 실패 시 동작이 달라진다.
소스
넣는 방법
특징
Direct PUT
SDK 의 PutRecord/PutRecordBatch, Kinesis Agent, CloudWatch Logs·IoT·EventBridge 같은 AWS 서비스 연동
스트림별 처리량 쿼터가 있다(리전마다 기본값이 다르고, 스로틀이 생기면 서비스가 자동으로 올려 주며 상향 요청도 가능)
Kinesis Data Streams
Firehose 가 KDS 의 컨슈머가 되어 읽어 감
Direct PUT 쿼터가 적용되지 않고 KDS 유입량에 맞춰 확장. 목적지 장애 시 KDS 보존 기간만큼 버틴다
Amazon MSK
Firehose 가 Kafka 토픽을 읽어 감
커넥터를 직접 운영하지 않고 토픽을 S3 등에 적재
PutRecordBatch 는 호출당 500 레코드 또는 4MiB 중 작은 쪽까지 담는다. 레코드 하나의 상한은 base64 인코딩 전 1,000KiB 다.
2024년에 서비스 이름이 Amazon Kinesis Data Firehose → Amazon Data Firehose 로 바뀌었다. 문서는 "전달 스트림(delivery stream)"을 "Firehose 스트림"이라고 부르지만 API 이름(CreateDeliveryStream)은 그대로다. 시험 지문에는 옛 이름이 여전히 나온다.
간격을 0초로 두면 버퍼링 없이 수 초 안에 전달한다(제로 버퍼링). 과거에는 최소 60초였고, 예전 자료의 "Firehose 는 최소 60초 지연"은 여기서 나온 말이다.
S3 목적지에서 간격을 60초 미만으로 잡으면 Firehose 가 멀티파트 업로드를 써서 지연을 줄이는 대신 S3 PUT 요청 비용이 늘어난다.
제로 버퍼링은 동적 파티셔닝과 함께 쓸 수 없고, S3 백업 쪽 버퍼(60~900초)에도 적용되지 않는다.
버퍼 힌트는 말 그대로 "힌트"다. 목적지 전달이 유입을 따라가지 못하면 Firehose 가 따라잡기 위해 버퍼 크기를 동적으로 키운다.
크기와 간격은 한쪽을 지정하면 다른 쪽도 함께 지정해야 한다.
⚠️ 함정: "Athena 쿼리가 느리다"의 처방으로 "버퍼 간격을 줄인다"를 고르면 반대 방향이다. 간격을 줄이면 파일이 더 작고 많아진다. 작은 파일 문제의 처방은 버퍼 크기를 키우고 간격도 넉넉히 두는 것이다. 유입량이 적으면 크기 조건에 닿기 전에 시간 조건이 먼저 차므로, 간격이 짧으면 크기를 아무리 키워도 소용없다.
기본 요금은 수집한 데이터량에 비례한다. Direct PUT 과 KDS 소스는 레코드 크기를 5KB 단위로 올림해서 계산하므로(MSK 소스는 올림 없음), 200바이트짜리 레코드를 한 건씩 보내면 실제 크기의 수십 배로 과금된다. 프로듀서에서 여러 건을 묶어 한 레코드로 보내는 것이 요금 최적화다.
포맷 변환, 동적 파티셔닝, VPC 내 전달은 선택 기능이고 처리량에 따라 추가 요금이 붙는다. VPC 전달은 스트림이 활성인 동안 AZ 시간 요금도 있다.
그 외에는 스트림이 떠 있는 시간에 대한 요금이 없다. 유입이 없으면 수집 요금도 없다는 점이 KDS 프로비저닝 모드(샤드 시간 과금)와 다르다.
요구
Firehose
대안
대안을 고르는 조건
스트림 → S3 적재
설정만으로 끝남
Glue 스트리밍 ETL
조인·복잡한 변환·여러 싱크가 필요할 때
스트림 → Redshift
S3 스테이징 후 COPY
Redshift 스트리밍 수집
S3 를 거치지 않고 KDS·MSK 에서 구체화된 뷰로 바로 받아 더 낮은 지연이 필요할 때