관리 메뉴

밤 늦게까지 여는 카페

[AWS IoT Core] Cloudwatch 대비 60% 절감! Rule Engine+Athena로 데이터 수신 시각 추적하기 본문

aws

[AWS IoT Core] Cloudwatch 대비 60% 절감! Rule Engine+Athena로 데이터 수신 시각 추적하기

Jㅐ둥이 2025. 4. 19. 03:25
반응형

안녕하세요. 잘 지내고 있으신가요? 저는 갑작스럽게 더워진 날씨에 조금 힘듭니다... ㅜ

 

이번에는 AWS IoT Core에서 SQL Function을 사용해서 Ingestion time을 로그에 추가한 방법을 기록하려고 합니다.

혹시라도 같은 고민을 했던 분들에게 도움이 되었으면 좋겠습니다!


TL-DR

  • AWS IoT Core에 데이터가 전달된 시각을 알고 싶다면 Rule Engine에 규칙 추가할 때 timestamp 함수 이용해서 Ingestion Time 작성하자!
    • 예시)
    • SELECT parse_time("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", timestamp(), 'UTC') as ingestion_time, * FROM 'topic'

1. Ingestion Time이 없는 AWS IoT Core

Ingestion Time은 주로 데이터가 서비스에 도착한 시각을 의미합니다.

AWS IoT Core를 예시로 들어보면 Thing에서 전송한 데이터가 실제로 AWS IoT Core에 도착한 시각을 의미합니다.

Ingestion Time 예시

 

Ingestion Time은 네트워크 통신이 원활하지 않은 것을 서비스 차원에서 검증해야 할 때 아주 유용합니다.

  • 트위니의 오더피킹솔루션 사용하고 있다가 네트워크 문제로 로봇이 안 움직였던 것을 검증하기 위해서는 Ingestion Time이 필수적입니다.
  • 현장 네트워크 방화벽으로 인해서 AWS IoT Core로만 데이터 전달이 안될 때도 있었거든요;;;

 

그런데 슬픈 것은 AWS IoT Core로 데이터가 전송될 때 Ingestion Time이 자동으로 추가되지 않습니다.

2. Amazon Cloudwatch Logs를 이용하는 방법 - 간단하지만 비싼 방법 ㅜ

Ingestion Time을 추가하는 가장 간단한 방법은 Amazon Cloudwatch Logs를 사용하는 것입니다.

Rule Engine을 이용해서 Amazon Cloudwatch 로그 남기기 위한 구성도

 

다음과 같이 lambad handler에서 event를 출력하면 event 데이터와 로그 저장 시각을 Amazon Cloudwatch에서 확인할 수 있습니다.

def lambda_handler(event, context):
	print(event)
    ...

 

이 방법의 유일한 단점은 비용입니다.

[AWS IoT Core] Basic Ingest - 비싼 메시지 전송 비용 절약하는 방법에서 1초에 1번 메시지를 전송하는 Thing의

Rule Engine 비용이 0.47달러로 계산되었던 것 기억하시나요?

 

Amazon Cloudwatch도 로그를 저장하는 데에도 비용이 발생합니다.

로그 저장 비용은 1GB당 0.76달러로 Thing이 1초에 1번 1KB의 메시지를 전송한다면 한달에 약 1.97달러의 비용이 발생합니다.

  • 1KB × 86,400초 × 30일 × 0.76/GB = 1.97

참고: https://aws.amazon.com/cloudwatch/pricing

 

로그를 저장하는데만 Thing 1개당 총 2.44 달러를 지불해야 하는 것이죠...🤣🤣🤣

대책이 필요합니다!

3. 보다 저렴한 방법은 없나? - Rule Engine SQL Function + Athena

AWS에서 사용할 수 있는 로그 시스템 중 Cloudwatch보다 저렴한 것은 Amazon Athena가 있습니다.

  • Amazon Athena는 S3에 저장된 데이터를 쉽게 검색할 수 있는 기능을 제공합니다.
  • 거기에 사용한 만큼만 비용이 지불된다는 장점을 가지고 있습니다!

Amazon Athena를 이용한 로그 시스템의 간단한 구성도

 

위의 구성도를 보시고 'Lambda가 실행될 때 현재 시각을 저장하면 되지 않나?' 라고 생각하실 수 있습니다.

아쉽게도 Kinesis Firehose에서 Lambda로 데이터가 전달되기까지 시간이 많이 소요되서 부정확한 값이 저장됩니다.

  • 비용 절감을 위해서 Kinesis Firehose에서 데이터를 배치 처리하기 때문에 시간이 오래 소요됩니다.

 

혹시 몰라서 Lambda 함수를 작성할 때 lambda_handler 함수로 전달되는 event, context 파라미터를 자세히 찾아봤습니다.

참고: https://docs.aws.amazon.com/iot/latest/developerguide/iot-lambda-rule.html

 

event 파라미터는 AWS IoT Core가 전달해준 데이터기 때문에 Ingestion Time이 없습니다.

context 파라미터에도 Ingestion Time이 없습니다...

참고: https://docs.aws.amazon.com/lambda/latest/dg/python-context.html

 

 

어쩔 수 없이 Cloudwatch를 사용해야 하나 포기하고 있던 중에 event 파라미터가 눈에 들어왔습니다.

 

위에서 말씀드렸다시피 event 파라미터는 AWS IoT Core가 전달해준 데이터입니다.

그리고 해당 데이터는 규칙에 있는 SQL에 의해서 정의됩니다.

 

그렇다면 SQL에 Ingestion Time을 추가할 수 있으면 되는 것 아닌가?로 생각이 이어졌습니다.

AWS IoT Core에서 지원하는 SQL 함수들을 찾아보니 timestamp와 parse_time 함수가 있더라고요!

참고: https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-timestamp
참고: https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-parse-time

 

찾아본 내용들을 참고해서 SQL을 다음과 같이 수정했더니 Athena에서도 Ingestion Time을 정확하게 관리할 수 있었습니다 ㅜ

  • SELECT parse_time("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", timestamp(), 'UTC') as ingestion_time, * FROM 'topic'

2.592GB의 데이터를 Kinesis Firehose, S3, Athena가 처리하는데 필요한 비용은 대략 0.537달러입니다.

Rule Engine 비용까지 포함하면 1달러로 Cloudwatch를 사용했을 때보다(2.44달러) 60% 가량 저렴합니다!

 

  • Kinesis Firehose: 0.093달러
    • 2.592GB x 0.036/GB = 0.093 
      참고: https://aws.amazon.com/firehose/pricing/
  • S3: 0.0648달러
    • 2.592GB x 0.025/GB = 0.0648
      참고: https://aws.amazon.com/s3/pricing/
  • Athena: 0.379달러
    • 2.592GB x 30번 쿼리 5/TB = 0.379

참고: https://aws.amazon.com/athena/pricing/

 

🎁다른 AWS IoT Core 관련 포스팅들 🎁

반응형