AWS Data Transfer APN2-USE1-AWS-In-Bytes
|
$0.00 per GB - Asia Pacific (Seoul) data transfer from US East (Northern Virginia)
|
AWS Data Transfer APN2-USE1-AWS-Out-Bytes
|
$0.080 per GB - Asia Pacific (Seoul) data transfer to US East (Northern Virginia)
|
- 사건
- CI/CD 구축을 완료했는데, 구축 과정에서 원인을 알 수 없는 서울과 버지니아 북부간의 data transfer 요금이 발생했다. 1000원 미만의 아주 작은 소액이었지만 어느새 하루이틀 지나니 1000원을 넘기면서 누적되는 가격에 추후 실제 배포 때는 몇만원까지도 오를까봐 무서웠다. 세부 항목은 위와 같다.
- 내 계정에서는 젠킨스 서버, 다른 분 계정에서는 스프링부트 서버를 구축했고, 내 계정에서만 요금이 발생했으며, 내가 한 거라곤 깃허브 웹훅 → 젠킨스 빌드 → 젠킨스 서버에서 도커허브에 push → 스프링부트서버에서 도커허브로부터 pull → nginx를 통한 블루/그린 무중단 배포 이게 다였다.
- 젠킨스 서버와 스프링부트 서버 모두 리전은 서울이며, 아직 코드 구현은 안 한 채 ci/cd 틀만 짜둔 것이기 때문에 딱히 데이터가 크지도 않았다. 그래서 요금이 나갈 것도 없어보였다.
- 버지니아 북부에 대한 리소스도 사용한 적 없었다.
2. 원인 파악 (정확하지 않을 수 있음. 단지 원인 파악 과정을 기술한 글이니, 참고만! - 근데 구글링을 아무리 해봐도 나같은 사례는 전혀 없어서 같은 문제가 있는 분이 계실진 모르겠다.)
- 원인을 알아내기 위해 시간 투자를 엄청 했다. aws 에 문의를 해봐도 기술에 대한 지원은 따로 유료 프리미엄 플랜을 이용해야 한다는 답변만 돌아왔다. 금액은 최소 월 4만원부터 13만원짜리 플랜도 있었고, 더 비싼 요금도 있었는데 사실 가장 저렴한 요금도 조금은 부담이 됐다. 지원 요청을 해서 완전한 원인 파악과 해결이 가능하다는 보장만 있다면 할 마음은 있었지만… 그런 보장이 없다는 생각에 더 망설여졌다.
- 일단 data transfer 요금이 언제 부과되는지 파악하고자 했다. 계속 알아보니 젠킨스 파이프라인이 실행될 때마다 비례해서 발생하는 것 같았다. 그래서 여러가지 테스트를 해봤는데 깃허브 push 하여 일련의 파이프라인이 실행될 때마다 요금이 부과됨을 알게 되었다. 근데 이게 버지니아 북부 리전과의 데이터 송수신과 무슨 연관이 있지?
- 혹시 리전의 디폴트 값을 따로 명시를 해주지 않았나? 파이프라인 실행 중 사용되는 내부적인 리소스가 버지니아 북부를 경유하나? 싶어서 인스턴스 자체는 서울로 되어 있음에도 불구하고 aws 설정으로 들어가 디폴트를 서울로 다시 설정해주었고, ec2 인스턴스 내부로 들어가 터미널 상에서 또 aws 리전을 서울로 명시해주었다. 당연히 ec2 인스턴스를 서울에서 생성했으므로 이게 문제는 아닌 것 같다.
|
- aws 에서 cloud watch, 청구서 세부 내역, vpc 설정, cost explorer 등 다 들어가서 찾아봤는데 사실 더 구체적인 세부 내역은 유료 서비스였고, 해당 서비스 자체도 정확히 뭐가 원인인지는 알 수 없는 것 같았다.
- 그래서 버지니아 북부와의 데이터 송수신 내역을 확인을 위해 이것저것 알아보기 시작했다. iftop 라는 걸 터미널 상에서 간단히 설치하면 데이터 송수신 상황에 대한 실시간 모니터링이 어느정도는 가능하다는 것을 알게 됐다. 버지니아 북부에 대한 ip 주소들만 필터링 해주는 쉘 스크립트를 작성하여 실행파일로 만들어 실행해주었다. 그와 동시에 젠킨스 파이프라인도 실행하며 데이터 송수신 상황을 모니터링하였다. 깃허브 웹훅, 젠킨스 빌드 까지만 해도 아무것도 안 뜨다가 도커 허브에 push했을 때 버지니아북부와의 데이터송수신 내역이 잡히기 시작하는 걸 확인했다.
|
- 도커 허브와 ec2 인스턴스 간의 데이터가 전송되는 과정에서 버지니아 북부 지역의 어떠한 것을 사용하는 것 같다. 아직도 정확한 원인은 모르겠다. 원래대로라면 도커허브에 이미지를 push한다고 해서 aws의 ec2 항목에서 요금이 발생하는 것은 말이 안 된다. 차랴리 도커허브에서 요금이 발생하면 모를까. 아무튼 그래서 정말 도커 허브만의 문제가 맞는지, 혹은 젠킨스 파이프라인에서의 다른 문제 요인이 있는지 파악하기 위해 터미널 상에서 단순히 명령어를 사용하여 도커 이미지를 다운받아 도커 허브에 push 해주었다. 그랬더니 또 다시 버지니아 북부와의 데이터 전송이 발생하는 것을 확인했다. 정말 도커 허브 때문인가?
- 그것 또한 확인하기 위해 이제 새로운 ec2 인스턴스를 생성해서 도커 하나만 간단히 설치해준 뒤, 도커 허브에 로그인하여 이미지를 pull 받고 다시 도커 허브에 push 해주었다. 그랬더니 버지니아 북부와의 데이터 전송이 전혀 발생하지 않음을 확인했다. 대체 뭐가 문제일까? 젠킨스를 거쳐 도커 허브에 push, pull 해주는 과정이 문제가 됐나? 아무튼 내가 구축한 특정 ec2 인스턴스 내부 셋팅과 도커 허브와의 관계 측면에서 요금이 발생하는 건 맞는 것 같다…. (도커 허브에 aws 처럼 리전 설정이 있나 알아봤더니 그것도 아니었다.)
그래서 결론은 아직도 해결을 못 했다. ec2 인스턴스를 새로 만들고 같은 환경을 구축한다고 했을 때, 또 다시 요금부과가 되지 않으리라는 보장이 없다는 생각에 github action을 사용할까 고민중이다. e2 인스턴스 생성부터 깃허브 웹훅 연동, 젠킨스 자동 빌드, nginx 블루그린 무중단 배포, 빌드시마다 슬랙 자동알림까지 다 구축 성공까지 했는데 이걸 해결을 못해서 슬프다 ...........- [해결] 이 인스턴스를 유지하면서+도커 허브를 사용하면서+과금도 안 되는 방법은 잘 모르겠다. 다만 다른 방법을 써서 해결을 했다. 정말 도커 허브 하나 때문이라면, 도커 허브만 사용하지 않는 코드로 바꿔주면 되지 않을까? 기존 방식은 젠킨스 서버에서 만든 이미지를 도커 허브에 push하고, 스프링부트 서버에서 해당 이미지를 pull 받아와 실행시키는 과정이었다. 젠킨스서버와 스프링부트서버 간에 도커 허브를 거쳐 이미지를 전달하는 것이다. 이러한 과정 대신 젠킨스 서버에서 이미지를 만들지 않고 스프링부트 서버로 바로 jar 파일 형태로 넘기고(정확히는 jar, Dockerfile, deploy.sh 딱 이 3개의 파일을 copy하는 방식으로 넘겼다), 스프링부트 서버에서는 넘어온 해당 3개의 파일을 가지고 docker build하는 방식으로 수정했더니 과금이 안 됐다. (이 때, 같은 리전이더라도 가용영역이 다르면 데이터전송 요금이 부과될 수 있다. 가용영역 마저 같게 하기 위해 나는 스냅샷을 활용해 기존 ec2 인스턴스를 복제해서 가용영역을 동일하게 해주었다. 이제서야 완전히 요금이 부과되지 않았다.) 다만 더 베스트는 도커허브를 사용하는 방법으로 다시 구축해보거나, github action을 사용하는 방식이 아닐까 싶다.
- 아래는 나의 최종 젠킨스 파이프라인 코드 중 Deploy 부분의 예시이다.
# ec2-기타 요금
# 젠킨스 파이프라인 구축 data transfer 요금 부과
# data trnsfer 과금
# 버지니아 북부 데이터 전송
# 젠킨스 서버 버지니아 북부 과금