본문으로 바로가기

AWS Billing 요금 절감하기

category 개발/인프라, CS 2021. 7. 7. 21:33
글을 쓰기에 앞서, 필자는 AWS Cloud Platform을 웹 서버 구축 및 운영 목적으로 이용했으며 사용하고 있는 대부분의 서비스는 웹 서버 구축에 관련된 서비스인 점 참고 부탁드립니다

 

필자는 개인 프로젝트 개발을 위해 클라우드 플랫폼인 AWS를 사용중에 있다. 해당 서비스는 웹 서비스로 메인서버(모니터링 및 로그 분석), 프론트엔드 서버, 백엔드 서버인 총 3개로 사용중에 있다. 이러한 서버를 구축하고 AWS 서비스를 사용하던 과정에서 내가 어떻게 비용을 절약했는지에 대해서 이번글에서 써보고자 한다.

 

웹서버 구축에 필요한 서비스

웹 서버를 구축하는데 사용되는 서비스는 꽤 많다. https, firewall(ddos defence), security group, load balancing등 세부적인 서비스를 설정해줘야 한다. 이번 글에서는 그런 세부적인 것에 대해서는 다루지 않을것이며 가장 비용(돈)을 많이 먹는 서비스에 대해서 이야기할것이다.

 

먼저 내가 웹 서버를 운영하기 위해 사용중인 서비스는 대략적으로 이정도이다

  • EC2
  • RDS
  • S3 Bucket
  • Route53

이중에서 가장 비용을 많이 먹는건 EC2, RDS 두가지다. EC2는 내부에서도 여러 서비스로 나누어지고 각각의 서비스마다 비용이 청구되기때문에 비용이 많이 부가된다.

 

먼저 알아야 할게 있는데, AWS에서 서비스 비용이 책정되는데 사용되는 지표는 두가지로 인스턴스 종류인스턴스 사용 시간이다. EC2던, RDS던 둘다 기본적으로는 인스턴스 형태이기 때문에 얼마나 고성능의 인스턴스를 얼마나 오랫동안 사용했냐(켜 놓았냐)로 비용이 책정되게 된다. 그리고 인스턴스에서는 Free-Tier라는 제도가 있는데, 낮은 성능의 인스턴스 종류는 Free-Tier가 적용되게 된다. 이 경우 사용 시간이 어느정도를 초과하지 않은 경우, 비용을 청구하지 않는 제도이다.

위의 테이블에서 Amazone Elastic Compute Cloud가 52% 사용된것을 볼수 있다. 만약 사용량이 100%(30gb)를 초과하게 되면 그때부터 비용이 청구되는 구조이다. 여기서 30gb of amazone elastic block storage라는것은 현재 사용중인 인스턴스의 ssd가 차지하고있는 용량을 의미한다.

 

EC2 비용절감

웹 서비스를 개발하기 위해 Backend Server API 인스턴스를 하나 생성한다고 가정해보자. 이를 위해 사용해야 하는 서비스는 아래와 같다.

  1. Instance
  2. EBS
  3. Load Balancer
  4. WAF

그럼 서비스마다 비용을 절감하는 방법을 설명하도록 하겠다.

1) Instance

보통 서비스를 개발할때는 t2micro등의 free-tier가 적용되는 인스턴스를 사용하는게 좋다. 필자의 경우 개발 서버에는 t2micro, 라이브 서버에는 t3small을 사용했는데 이유는 네트워크 속도이다. api 서버의 인스턴스를 t2micro로 사용할 경우 네트워크 속도가 낮음에서 중간으로 고정되기 때문에 프론트엔드 측에서 느끼는 response가 많이 느리다.

간단한 클라우드 구조도이다

프론트엔드 개발을 할때는 Node환경에서 backend api에 axios등의 라이브러리로 http요청을 보낸다. 원래는 backend api, 즉 vpc에 접속하기 전에 route53 -> load balancer -> firewall -> instance의 과정을 거치지만 해당 그림에서는 생략하였다. 만약 backend api instance를 t2micro등의 free-tier instance로 만들게 되면 프론트엔드 개발 환경에서 해당 인스턴스에까지 도달하는동안의 레이턴시가 오래 걸리게 되는 것이다.

 

그래서 우리는 결정을 해야된다, 개발 과정에서의 효율성을 위해 비용을 감수하고 high level의 인스턴스를 사용할것인지, 아니면 적당히 타협하고 free-tier 인스턴스를 사용할것인지를. 근데 솔직히 말해서 free-tier 인스턴스 사용해도 된다. 필자가 개발한 환경에서는 api request가 페이지당 적게는 10개에서 많게는 50개 정도 실행되는 환경이였는데, request가 엄청 많이 발생하는 main page외에는 2~3초 정도의 레이턴시만 있었고 개발하는데 크게 거슬릴 정도는 아니였다. 그리고 좋은점이 있기도 하다. 레이턴시때문에 짜증나서 request 갯수를 줄이는 최적화작업을 하고 싶어지거든ㅋㅋㅋ

 

어쨌든 인스턴스는 적당히 목적에 맞는걸 사용한다고 하고. 위에서 말했다싶이 인스턴스 실행 시간에 따라 비용이 부과된다는 부분인데, 이건 그냥 간단하게 해결할 수 있다. 인스턴스 갯수를 적게 유지하는거다. 용도가 없어진 인스턴스는 종료시키고, 갯수를 3개~5개 이내로 유지시키는 free-tier가 폭발할 일은 별로 없다. 기본적으로 instance free-tier는 월 264시간까지 적용된다. 한달은 720시간인데 인스턴스 여러개 켜놓으면 비용이 많이 나오겠지? 그러니까 안쓰는 인스턴스는 종료를 시키거나 중지 상태로 두는게 비용을 줄이는 방법이다.

2) EBS

EBS는 두가지로 나누어지는데 Instance SSD Storage와 Snapshot이다.

EC2 Billing Report by month

instance ssd는 인스턴스에 할당된 ssd 스토리지, 즉 리눅스 스토리지이다. 이걸 줄이려면 그냥 인스턴스의 갯수를 적게 유지하면 된다. snapshot은 AMI Image라고도 부르는데 스토리지의 특정 시점을 찍어서 저장해놓은 이미지이다. 인스턴스를 켜서 이런저런 패키지를 설치하고 폴더 구조를 만들고 env를 커스텀하고 뭐하고.. 이걸 한 다음 snapshot을 찍어놓으면 같은 구조의 인스턴스를 복제할 수 있게된다.필자의 경우 이 snapshot이 5개정도 있었는데 그래서 비용이 좀 많이 청구됬다. 한두개정도만 가지고 있으면 그렇게까지 청구되지는 않는것으로 알고있다

3) Load Balancer

이 서비스의 용도는 크게 두가지인데, 수많은 트래픽을 다수의 인스턴스로 분배시켜주는것 https를 사용가능하도록 해주는것이다. 이걸 그냥 웹서버 용도로만 사용하면 괜찮은데 필자는 로그 수집과 모니터링을 https통신을 사용해서 구현했었다. 개발용으로 사용하던 서버임에도 불구하고 수많은 요청들이 로드밸런서를 거치게 됬고 결과적으로 6만원씩이나 비용이 청구되었던 기억이 있다. 나중에는 VPC 내부에서 인스턴스 프라이빗 ipv4주소로 요청을 보내는 방식으로 변경했다. 근데 그래도 비용을 많이 먹기는 한다 거의 인스턴스급으로..

ㅠㅠ

4) WAF

waf는 인스턴스에 적용할 수 있는 방호벽 서비스으로 다양한 종류가 있다. 필자는 DDos Bot 공격에 의한 피해를 방지하기 위해 Bot Control이란 waf를 사용했다. 이게 한달에 17달러정도 나왔다(트래픽 적은 개발서버에서)

WAF web acls

봇이라는게 사실 마구잡이로 서버 포트를 공격하는게 대부분이기 때문에 이를 정말 쉽게 방지할 수 있다. 다들 알다시피 아파치의 기본 웹 서버 포트는 80번이다. 이를 똑같이 연결시켜놓은 서버가 대부분이기때문에 봇들은 80번 포트를 집중적으로 공격하게 된다. 만약 이 포트를 80번이 아닌 170번, 228번, 1192번과 같이 인기없는 포트로 바꿔놓을 경우 대부분의 봇은 이를 찾기 못하게 된다. 물론 악의적인 의도를 가지고 특정 사이트를 공격하려면 포트 알아내는건 쉽기때문에 규모가 있는 서비스의 경우 해당 waf정도는 적용시켜주어야 한다.

 

RDS 비용절감

RDS는 딱히 특별할건 없다. 위에서 말했다싶이 RDS또한 EC2와 같은 인스턴스이므로 인스턴스의 종류(level), 사용 시간에 따라 비용이 책정되게 된다. 아래는 rds에 청구된 report인데 참고하면 좋을것 같다.

 

S3 Bucket 비용 절감

BIlling Report에 s3 bucket에 부과된 비용이 없길래 왜없지? 하고 찾아봤는데 Data Transfer이라는 항목이 있었다.

아마 이미지 파일 업로드, 다운로드(image url load)하는 과정에서 사용된 비용인거 같은데(in-byte, out-byte를 보니) free-tier기준을 넘지 않아서 부과가 되지 않은것 같다.

 

Route53 비용 절감

Route53은 웹서버 도메인을 브라우저에 입력했을때, 이를 웹서버 인스턴스로 연결해주는 역할을 한다. 나는 api 인스턴스또한 route53으로 호스팅하고 있었기 때문에 백엔드 요청까지 포함되었다.

사진을 보면 Intra-AWS-DNS-Queries이게 총합인거같은데 3만5천건정도 실행된것을 볼수있다. 근데 0.5달러 나왔네

 

마치며

지금까지 필자가 사용했던 웹서버에 책정된 비용을 보면서 어떤 이유로 이런 비용이 책정되었고, 어떻게 하면 이를 절감할 수 있는지 써보았다. 내용을 정리하자면

  1. EC2
    1. 비싼 인스턴스 안쓰기(tree-tier)
    2. 갯수 적게 유지하기(3개정도)
    3. 오래 안켜놓기(안쓰는건 종료하기)
    4. SnapShot 2개 이내로 유지하기
    5. Load Balancer에 로그 수집, 모니터링 연결해놓지 않기(요금 폭탄)
  2. RDS
    1. 비싼 인스턴스 안쓰기
    2. 갯수 적게 유지하기

정도 될거같다. 다른건 팁이랄게 없어서..