Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

코딩 이래요래

AWS CloudWatch 과금 본문

Trouble Shooting

AWS CloudWatch 과금

강범호 2025. 7. 7. 15:31

AWS ECS + CloudWatch, 배포 후 2일 뒤의 청구서

33.59$ㅋㅋㅋㅋㅋㅋ

이게 무슨 일인가...

log data가 44GB라니..

"logConfiguration": {
  "logDriver": "awslogs",
  "options": {
    "awslogs-group": "/ecs/discodeit",
    "awslogs-region": "ap-northeast-2",
    "awslogs-stream-prefix": "ecs"
  }
}

 

위 설정은 태스크를 만들 때 default로 지정되는 값이다.

해당 내용을 검색하니

Task Definition 내 logDriver: awslogs를 사용할 경우, 해당 컨테이너의 로그가 Amazone CloudWatch logs로 전송된다.

awslogs는 CloudWatch logs로 수집할 수 있게 해주는 Docker 로그 드라이버다.
이를 사용하면 ECS 태스크에서 발생하는 표준 출력(stdout)과 표준 에러(stderr)가 지정한 CloudWatch 로그 그룹/스트림에 기록된다.

 

자 이게 무슨말이냐...

예를 들어 Spring Boot가 다음과 같은 로그를 남기면

2025-07-07 01:20:30 INFO ... started successfully  ← stdout
2025-07-07 01:20:31 ERROR ... DB connection failed ← stderr

위 로그가 그대로 CloudWatch에 올라가게 된다.

 

이것 자체로는 큰 문제가 되지 않는다.

그럼 이제 어떤 이유로 로그가 44GB까지 쌓이게 된건지 확인을 해야한다...

 

운영 중인 서비스는 채팅 기능을 제공한다.
메시지에는 텍스트뿐 아니라 이미지도 함께 포함될 수 있는데...

디버깅을 위해, 나는 메시지를 담고 있는 DTO 전체를 로그로 남겼다.

log.debug("chatDto: {}", messageDto);

근데 여기서 문제..

messageDto 안에 이미지 byte[]가 그대로 포함되어 있었던 것.

즉, 이미지 한 장을 base64로 인코딩한 것과 비슷한 수천~수만 자의 텍스트가 그대로 로그로 남았다.

 

프론트에서는 메세지 요청을 폴링방식을 통해 3~5초마다 GET 요청을 보낸다.

난 테스트를 위해 채팅방에 6~7시간 넘게 접속해 있었고, 그 결과 엄청난 요청과 로그를 남기게 된 것이다.

 

여기에 겹쳐서 운영환경의 application-prod.yaml을 보면

logging:
  level:
    root: DEBUG

로그 레벨이 DEBUG로 잘못 설정되어 있던 것이다.

이러니 로그 크기가 44GB까지 쌓일 수 밖에

 

우선 더이상 CloudWatch로 log를 보내지 않게 logConfiguration을 삭제하고, 로그 그룹도 삭제했다.

application-prod.yaml의 로그레벨을 info로 변경해주었고, 이미지 등 바이너리 데이터는 로그로 출력하지 않도록 처리했다.

 

'Trouble Shooting' 카테고리의 다른 글

AWS ECS Prometheus + Grafana로 모니터링 하기  (1) 2025.07.08
AWS ECS 중지됨: TaskFailedToStart: RESOURCE:MEMORY  (1) 2025.07.07
TimeZone😤  (2) 2025.06.23