Cloudwatch log S3 저장하기

2025. 7. 17. 15:24·AWS/Cloudwatch

1. 왜 이 문제에 주목했는가? (Introduction)

회사의 서비스가 성장하면서 AWS CloudWatch 로그 데이터가 급격히 증가하게 되었습니다. 처음에는 특별한 문제 없이 사용했으나 시간이 지나면서 로그 보관 비용이 점점 부담으로 다가왔습니다. 장기 보관이 필수적인 상황에서 CloudWatch Logs의 보관 비용은 예상보다 훨씬 비싸고 효율적이지 않았습니다. 이를 해결하기 위해 비용 효율적인 대안을 찾기 시작 그 결과 S3를 활용한 로그 보관 방식을 선택하게 되었습니다.

2. 기술 스택 결정 과정

기존에 사용하던 CloudWatch Logs는 관리가 쉽고 접근성이 우수했으나 데이터 양이 증가할수록 비용 부담이 급격히 늘어났습니다. 반면 S3는 저렴한 비용으로 장기 데이터 보관이 가능하고 Athena와 Glue와 같은 AWS 서비스와 연계가 쉬워 데이터 분석 환경 구축에도 유리했습니다.

 처음에는 서버리스 환경인 Lambda와 EventBridge를 활용하여 별도의 인프라 관리 없이 빠르고 간편하게 문제를 해결하고자 했습니다. 또한 이전부터 관심 있었던 Lambda와 EventBridge 기술을 실제 프로젝트에 적용해 볼 좋은 기회라고 생각했습니다. 하지만 Lambda의 최대 실행시간 제한(15분) 제한으로 인해 한계를 느끼게 되었고, 결국 이를 해결하기 위해 사용중인 EKS 인프라 CronJob을 활용하는 방안으로 전환하게 되었습니다.

3. 시스템 구성도 및 설계 과정

초기 아키텍처는 CloudWatch Logs에서 Lambda와 EventBridge 조합으로 주기적으로 S3로 로그를 백업하는 방식이었습니다. Lambda 함수는 boto3의 create_export_task API를 이용하여 구현되었고, Terraform을 활용하여 배포 및 관리 환경을 구축했습니다.

그러나 Lambda의 기본 실행시간 제한(기본 5분)으로 인해 작업이 자주 실패했고, 이 제한 시간을 15분까지 늘려도 여전히 문제가 발생했습니다. 게다가 CloudWatch Logs의 ExportTask API는 계정당 한 번에 하나의 작업만 허용하여 작업 효율성을 떨어뜨렸습니다. 이를 해결하기 위해 코드 내에 작업을 순차적으로 처리하는 로직을 구현했지만, 근본적인 문제를 완전히 해결하지 못했습니다.

결국 Lambda 기반 아키텍처의 한계를 극복하고 더 큰 유연성을 확보하기 위해 Kubernetes CronJob으로 마이그레이션했습니다. 이를 위해 Dockerfile을 작성하여 컨테이너 이미지를 빌드하고 ECR에 배포했습니다. 또한 IRSA(IAM Roles for Service Accounts)를 통해 Kubernetes Pod가 AWS 자원을 사용할 수 있도록 설정했고, Kubernetes CronJob을 통해 정기적으로 실행되는 환경을 구축했습니다.

코드 하단 링크 공유

 

4. 적용 결과 (결과 및 효과 · Result & Outcome)

이번 작업으로 CloudWatch Logs의 보관 비용을 줄일 수 있었으며, 로그 데이터 접근성과 분석 용이성 또한 크게 향상되었습니다. 특히 S3에 저장된 로그는 Athena와 같은 분석 서비스와 연동하여 데이터 활용도가 크게 개선되었습니다.

또한 Kubernetes CronJob으로 전환한 이후 관리가 더욱 간편해졌고 시스템 운영의 안정성이 향상되었습니다. 

5. 회고 및 배운 점 (Retrospective)

Lambda + eventbridge 와 Kubernetes는 각각의 특성과 장단점이 명확했습니다. Lambda + eventbridge는 간편하고 신속하게 구축 가능하지만, 실행 시간과 동시 작업 제한과 같은 명확한 한계가 존재합니다. 반면 Kubernetes CronJob은 높은 유연성과 확장성을 제공하지만 초반 설정과 관리의 복잡성이 요구됩니다.

이번 프로젝트를 통해 비용 최적화 작업이 단순 비용 절감뿐 아니라 관리 측면에서도 큰 효율을 제공한다는 것을 배웠습니다. 향후 로그 데이터의 실시간 처리가 필요하다면 Kinesis Data Firehose와 같은 스트리밍 서비스로 확장을 고려할 계획입니다.

Python Code
https://github.com/salamoa-96-Oct/JScloud/tree/main/python/cw-to-s3
Terraform code
https://github.com/salamoa-96-Oct/JScloud

'AWS > Cloudwatch' 카테고리의 다른 글

CloudWatch OAM을 활용한 멀티 계정 모니터링 통합 구축기  (0) 2025.12.18
'AWS/Cloudwatch' 카테고리의 다른 글
  • CloudWatch OAM을 활용한 멀티 계정 모니터링 통합 구축기
J cloud
J cloud
AWS 기술 정리 블로그
  • J cloud
    AWS with J
    J cloud
  • 전체
    오늘
    어제
  • 공지사항

    • 공지
    • 분류 전체보기 (10)
      • AWS (10)
        • VPC (1)
        • EC2 (1)
        • EKS (4)
        • S3 (1)
        • AmazonQ (1)
        • Cloudwatch (2)
      • Devops (0)
        • Jenkins (0)
        • CICD (0)
      • Programing (0)
      • Troubleshooting (0)
  • 링크

  • 인기 글

  • 태그

    KEDA
    1.31
    비용최적화
    amazonqcli
    custom-metrics
    EKS
    aws
    AL2
    s3
    AL2023
  • 최근 글

  • 최근 댓글

  • 블로그 메뉴

    • 방명록
  • hELLO· Designed By정상우.v4.10.3
J cloud
Cloudwatch log S3 저장하기
상단으로

티스토리툴바