개인 프로젝트
IoT 센서 로그 데이터 수집 및 적재 파이프라인 구축
RaspberryPi(+SenseHAT)로 실시간 수집한 센서 데이터를 Kappa Architecture 기반으로 AWS IoT Core → Kinesis → S3/OpenSearch 이원 구조에 적재하고, Lambda와 Athena CTAS로 파일 단위 자동 압축까지 구현한 개인 학습 프로젝트입니다. AWS 클라우드 서비스 8종 이상을 엮어 하나의 데이터 파이프라인으로 설계·검증했습니다.
Overview
RaspberryPi 4B와 SenseHAT 센서를 이용해 실시간으로 발생하는 온·습도 데이터를 Kappa Architecture 기반 파이프라인으로 처리하는 프로젝트를 개인적으로 진행했습니다. 센서 데이터는 Kinesis Data Stream을 통해 Pub/Sub 구조로 분산되고, 두 개의 Consumer(OpenSearch, S3)가 이를 각각 검색·시각화 목적과 배치 저장 목적으로 소비하도록 설계했습니다. S3에 쌓인 데이터는 일정 파일 개수가 모이면 Lambda와 Athena를 통해 자동으로 압축되어 별도 디렉토리에 저장되도록 구성했습니다.
Constraints
- 단일 RaspberryPi 기기, 개인 실습 환경이라 관리형 서비스 위주로 구성해 운영 부담을 최소화해야 함
- 검색·시각화용 저장소와 배치 압축 저장소, 두 갈래로 데이터를 동시에 소비해야 함
- AWS 서비스 간(IoT Core ↔ Kinesis 등) 통신을 위한 IAM Role 설정 및 권한 구조를 직접 설계해야 함
- 비동기 통신과 동기 통신의 차이를 실제로 검증해 적합한 프로토콜을 선택해야 함
Tech Stack
- RaspberryPi 4B + SenseHAT
- AWS IoT Core (MQTT Bridge)
- mosquitto
- AWS IoT Rule
- Amazon Kinesis Data Streams
- Kinesis Data Firehose
- Amazon S3
- AWS Lambda (Python)
- Amazon DynamoDB
- Amazon Athena (CTAS Query)
- Amazon OpenSearch (Elasticsearch) Service
- EC2 (Windows Server 2016)
Learnings
- AWS 서비스 간 통신에서 IAM Role 설정 이슈를 직접 겪고 해결했습니다. 일반 IAM 메뉴에서 생성한 Role을 그대로 적용했을 때는 계속 에러가 발생했고, IoT Rule 생성 시 Role을 자동 생성하도록 하자 해결됐습니다 — IoT Rule에 적용되는 Role은 일반 IAM 목록과 별도로 관리된다는 것을 이 과정에서 알게 됐습니다.
- MQTT 브로커(mosquitto)가 클러스터링을 지원하지 않는다는 한계를 직접 확인했고, 향후 HiveMQ나 RabbitMQ처럼 클러스터링을 지원하는 브로커로 검증을 확장할 필요성을 인지했습니다.
- 단일 기기 환경이라 실제 병목(Bottleneck)은 발생하지 않았지만, Kinesis shard 수와 Consumer 증가에 따른 비용·성능 트레이드오프를 미리 시뮬레이션해보며 확장 시나리오를 고민했습니다.