AWS IoT Core를 사용해보면서 처음으로 MSK의 존재를 알게되었고 사용해 보게 되었습니다.
보통 AWS MSK 사용사례를 보면 DB -> MSK -> DB 처럼 이기종 데이터를 다른 DB에 sink 하는 용도로 많이 사용되는 것 같습니다.
그래서인가 AWS IoT Core에서 MSK를 연결하는 사례가 별로 없습니다.
(물론 AWS 블로그는 IoT Core -> MSK 연결 방법이 나와있습니다. https://aws.amazon.com/ko/blogs/iot/how-to-integrate-aws-iot-core-with-amazon-msk/)
그러나, 제(고객사)가 원하는건 AWS IoT -> AWS MSK -> RDS 로, 실시간 데이터를 IoT Core에서 부터 받아와서 RDS에 실시간으로 저장하는 방법을 원했습니다.
솔직히, 처음엔 rule -> msk -> msk connector -> RDS 로 구성하면 되겠지... 라는 생각을 했습니다.
하루 걸릴 줄 알았던 안일한 생각과는 다르게 한달이 걸렸고, 무려 500번 이상 커넥터를 지웠다 다시 만들었다를 반복했습니다.
끔찍했던 과거를 바탕으로 지금부터 "왜 커넥터는 데이터가 있음에도 null을 반환했는가" 에 대해 포스팅 해보려 합니다.
커넥터를 사용할때는 sink와 source 두가지가 있습니다.
- Source Connector: 외부 시스템에서 Kafka로 데이터 수집
- Sink Connector: Kafka에서 외부 시스템으로 데이터 전송
요약하면, 커넥터 입장에서 데이터를 가져와야한다 -> source, 데이터를 보내야한다 -> sink 입니다.
저는 RDS로 데이터를 내보낼 것이기 때문에 sink를 사용하는 것이 맞다 생각했습니다.
둘다 "데이터 스트리밍과 관련된 도구" 입니다.
사용사례로 봤을 때는 DB -> Connector (Debezium) -> MSK -> Connector (Confluent) -> RDS 로 많이 사용하는 것 같았습니다.
(출처 : https://aws.amazon.com/ko/blogs/tech/implement-database-cdc-using-amazon-msk/)
그래서 저도 일단은 confluent를 사용했으나, 320번 시도쯤에서 다른 방법은 없을까 하다가 찾아보니 Debezium 도 sink 를 지원한다길래 Debezium를 이용해보기로 했습니다.
https://aws.amazon.com/ko/blogs/iot/how-to-integrate-aws-iot-core-with-amazon-msk/
IoT Core -> MSK 설정은 위 가이드대로 설정합니다. SCRAM/SASL 이란 보안방법을 이용해서 말이죠.
디바이스 -> AWS IoT Core로 들어오는 데이터는 아래와 같습니다.
//Topic : Platform/Info/Q-device/sensor
{
"deviceId": "device123",
"id": "event002",
"data": {
"id": "data001",
"soc": 90,
"cellVoltageMax": 3.7,
"voltUAvg": 3.65,
"soh": 95,
"inletTemperature": 25,
"performanceScore": 100,
"pcsOperationMode": "active",
"frequency": 50.5
}
}
SELECT * FROM 'Platform/Info/Q-device/sensor'
I-${topic(4)}
${deviceId}
그럼 ec2에서 topic을 조회해봤을 때, 아래와 같이 보입니다.
해당 토픽에 오는 메세지는 아래와 같이 나옵니다.
데이터가 잘 들어오는 것 까지 확인 했으나, 여기서 끝이 아닙니다. 다음 게시글로 찾아뵙겠습니다.