logo
Published on

CloudWatch + Lambda + S3로 로그 수집하기

들어가며

서버리스로 웹 서비스를 구현하고 있다. 서버리스는 사용한만큼 돈을 내는 서비스이기 때문에 사용자가 얼마나 API를 사용했는지 측정하고 싶었다. 가장 쉬운 방법은 API를 호출할 때마다 DB에 기록하는 방법이지만 이는 비효율적이다. 그래서 리서치를 하다가 CloudWatch에 쌓인 로그를 일정 시간마다 긁어서 처리한 후에, 처리 된 정보만 DB에 저장하기로 했다.

240228-195056

서버리스에서 API는 API Gateway + Lambda를 통해 실행된다. 그리고 API 호출 중에 생성된 모든 로그는 특별한 조치를 하지 않아도 자동으로 Cloudwatch에 기록된다. 이를 1시간마다 S3로 이동하도록 설정했다. 그리고 이동이 끝나면 S3에서는 1시간치의 로그를 읽어서 API 호출 횟수를 정리해서 DB에 저장하면 끝이다.

231224-214042

이렇게 구성한 이유는 아래와 같다.

  1. CloudWatch의 로그를 S3로 옮긴 이유는 S3의 보관 비용이 CloudWatch보다 저렴하기 때문이다.
  2. 1시간마다 유저 사용량을 계산해서 DB에 저장하는 이유는 별거 없다. 내 서비스 대시보드에서 유저마다 사용량을 보여줄 때 최소 단위가 1시간이기 때문이다.

진행방법

  1. CloudWatch에 저장된 로그를 S3로 옮길때는 aws-sdk에서 지원하는 CloudWatch.createExportTask를 사용했다. cron 스케줄 표현식을 이용해서 1시간마다 Lambda를 실행해서 간단하게 이동시켰다.

    231224-214919
  2. 로그는 분석과 관리를 쉽게 하기 위해 JSON 형태로 저장했다. lambda-log 라이브러리를 이용해서 JSON으로 저장했다.

그 이후는 간단하다. 로그 파일을 원하는대로 분석해서 필요한 형태로 가공해서 저장하면 끝이다.

하고나면 별거 없지만, AWS의 권한 문제, Lambda 로그가 어떤 형태로 CloudWatch에 저장되는지를 알아보는데 시간을 많이 사용했다.