AWS EC2 비용 폭탄
수업료 단단히 치뤘다

보다시피 갑자기 26일부터 하루에 20달러씩 나가기 시작했다.
진작 예산 알림 설정해 두었어야 했는데 너무 안일한 것이다.
주요 항목은 DataTransfer-Regional-Bytes와 Data-Transfer-Out-Bytes다.
모두 EC2에서 발생하는 요금이다.
그리고 26일에 나는 하나의 커밋을 올렸다

커밋 내용은 이렇다

매 초마다 모든 user를 조회했다.
user가 한 두명이었으면 그나마 상관 없었겠다만
마구잡이식으로 guest user를 생성했기 때문에 몇 천 건 있었을 거다.
user 한 줄 크기를 1kb라고 가정하면 한 번 조회할 때마다 최소 1MB 이상 데이터가 이동할 것이고
1초에 한 번이면 하루에 86400번이 실행되니 86GB를 매일 사용한 것이다.

실제로 서버를 중지했다가 해당 코드를 삭제한 다음 다시 서버를 실행해 보니
5분마다 500MB씩 사용하던 네트워크 입출력 바이트가 현격하게 줄어든 것을 볼 수 있다.
역산하면 1분에 100MB, 1초에 1.6MB 정도를 사용한 것이니 대략 추리가 맞다고 볼 수 있겠다.

EC2 데이터 전송 요금은 GB당 0.126 달러다. 하루에 150GB정도 사용했다고 한다면 대략 18달러로 계산도 맞아 떨어진다.
그런데 여기서
나는 EC2에 DB을 설치해 두고 같은 인스턴스에 애플리케이션을 Docker로 띄워서 사용하고 있는데
왜 같은 인스턴스에 있는 DB를 조회했는데 인터넷으로 나가는 데이터가 발생한 것일까?
문제는 내가 애플리케이션에서 DB host를 public IP로 설정했다는 점에 있었다.
그러면 쿼리 요청이 인터넷을 경유해서 들어오기 때문에
PostgreSQL 응답이 인스턴스 바깥으로 나가는 것으로 찍힌다.
위 EC2 모니터링 로그를 봤을 때 네트워크 입력과 출력이 거의 동일한 500MB 수준이라는 점이 이 사실을 뒷받침해준다.
일단 1초에 한 번씩 실행되던 cron job을 1분에 한 번으로 줄였고
DB host도 172.17.0.1을 사용해 주었다.
앞으로는 데이터를 다룰 때 크기와 흐름에 대해서 명확하게 인지하려는 노력이 필요하겠다.

.png)


.png)
