[AWS] AWS 비용 절감하기 :: 0. Free Tier가 끝나며 흥미로워진 AWS 비용
AWS Free Tier가 만료되기 직전이 되자 그동안 편하게 쓰고 있던 Free Tier RDS나 Elastic Load Balancer의 가격이 무섭게 느껴지기 시작했습니다. Free Tier의 무료 서비스로 쓰고 있던 것을 대체하며 서비스를 유지하기 위해 최대한 Low 스펙 인스턴스 안에 욱여넣는 경험을 공유합니다.
AWS Free Tier가 만료되며 최근 Modoco 서비스를 위해 쓰던 AWS 요금이 예상했던 것보다 많이 들어서 급하게 PR 하나를 날렸습니다.
➡️ https://github.com/SWM-FIRE/modoco-backend/pull/56
new feature: https without loadbalancer👍 by IamGroooooot · Pull Request #56 · SWM-FIRE/modoco-backend
무료 인증서 사용하도록 변경 기존의 AWS LoadBalancer의 사용 용도는 돈이 많이 들어서 단일 인스턴스만 쓰기로 하며 그저 앞단에 둬서 HTTPS 인증서용으로만 쓰고 있었습니다. AWS Freetier 만료 후에
github.com
오랜만에 이 PR을 주제로 글을 써봅니다. ㅎㅎ
Modoco 서비스의 Free Tier 시절
Free Tier를 쓴다면 한 달에 0.6$로 유지할 수 있었습니다.
t2.micro EC2 하나도 무료이고 우리 트래픽 정도면 Elastic LoadBalancer도 750시간 정도까지 무료이고 RDS도 Free Tier 스펙으로 잘 돌아가고 있었습니다.
하지만 1년이 다 되어서 무료 Managed 서비스를 모두 갈아타야 했고
여러 방법? 편법을 고민하게 됩니다.
어떤 서비스가 비쌀까...
개인적(팀 3명)으로 프로젝트를 유지하다 보니 일 년에 15만 원 이하로 프로젝트 유지할 수 있으면 좋을 것 같았습니다. 이런 생각으로 상대적으로 비싼 관리형 서비스부터 대체하기 시작했습니다.
Frontend
일단은 Front에서 쓰는 것들은 프리티어 후에도 거의 다 무료로 사용할 수 있었습니다.
Amplify, ClouldFront, S3, AWS Certificate Manager, Lambda, API Gateway 등은 프리티어가 만료되어도 괜찮았습니다. 실제로 모두 합해도 위에 보시다시피 한 달에 0.04$ 정도 부과됐습니다. (지금 저희 사이트는 하루에 한 명 올까 말까 합니다..ㅎㅎ)
프리티어가 끝나도 Route53만 거의 한 달에 한 번씩 0.51$가 결제되는 정도였습니다.
Backend
하지만 Back단에서 쓰던 Managed 서비스 대부분은 부담됐습니다. 그중에서 가장 비싼 것은 RDS여서 EC2 Instance를 선결제하여 EC2로 Private Subnet에 데이터베이스 띄워뒀습니다.
* 데이터베이스는 Prisma로 스키마를 관리하고 있어서 새로운 DB에 스키마를 Migrate 한 후에 백업 뜬 데이터를 Bulk insert 해서 금방 작업이 끝났습니다.
나머지 Elastic Beanstalk이 띄워주는 EC2도 적절한 스펙으로 적절한 가격으로 선결제를 해두었습니다.
Wait...
제가 개인적인 사정으로 바빠져서 잠시 이전 작업을 2주 정도 중지했습니다. 나머지 Elastic Beanstalk도 무료고 Code pipeline도 하나의 활성 파이프라인까지 무료이고 해서 일단 며칠 동안 비용이 얼마나 나가는지 지켜보았습니다.
그런데 생각보다 돈이 많이 빠져나가더군용! 하는 일도 거의 없는데 Elastic Load Balancer가 계속 활성화가 되어 있어서 1달에 16.75$가 나왔습니다.
* 위의 "EC2-기타" 비용은 제가 1년 선결제한 인스턴스의 값이라서 매달 나가는 비용은 아닙니다.
Replace!
예전에 한참 프로젝트 홍보할 때야 Auto Scaling을 하느라 Load Balancer의 역할이 중요했지만 현재 로드 밸런서는 그냥 AWS Certificate Manger에서 발급받은 인증서 붙이기 위해서 쓰고 있었습니다.
하는 것도 없는데 매달 16.75$를 내기에는 기분이 별로라서 Load Balancer를 제거하고 직접 https 프로토콜로 NestJS 앱을 생성했습니다. 금방 할 줄 알았는데 EC2에서는 AWS Certificate Manager에서 발급해 주는 인증서를 사용할 수 없었습니다. 그래서 무료 인증서를 서버 인스턴스에서 발급받아서 썼습니다.
미리 서버에 여러 앱과 인증서를 발급받아둬야 해서 그때그때 서버 인스턴스를 띄우는 방식인 Elastic Beanstalk은 사용할 수 없게 됩니다. 그래서 EC2를 하나 띄워서 미리 모든 구성을 해뒀고 Code Deploy로 그 인스턴스에 앱을 배포했습니다.
이참에 AWS 서비스를 여러 개 사용할 때야 외부 무료 파이프라인을 쓰는 것보다 빨라서 편했지만 이제는 오히려 번거로워서 불편함만 주게 되는 것들을 제거했습니다. Code Build, Code Pipeline, Elastic Beanstalk 대신 GitHub Actions로 대체했습니다.
현재는 서비스의 AWS에 거의 로그인할 일이 없는데 Actions로 바꾸니 Push 하는 순간 바로 GitHub 상에서 파이프라인을 확인할 수 있어서 편하네요.
앞으로 다루게 될 주제
구체적으로 어떻게 했는지 공유해보고자 합니다. 여러 내용이 섞여있어서 이번 글은 3가지 파트로 나눠서 써보려고 합니다.
파트 1. 무료 인증서를 발급받아서 NestJS 앱을 만드는 방법
- LetsEncrypt로 무료 인증서를 발급받아봅시다.
- CertBot을 이용해서 인증서를 자동 갱신하는 법을 배워봅시다.
- NodeJS(or NestJS) 앱을 인증서로 https로 실행해 봅시다.
파트 2. GitHub Actions에서 NodeJS 앱 빌드와 OIDC를 통한 AWS Credential 인증
- GitHub Actions에서 node(yarn)를 깔아서 사용합니다.
- GitHub Actions에서 OIDC를 사용해서 AWS Credential을 인증합니다.
- AWS IAM 유저를 만들어서 인증하는 것은 보이는데 3세대 OpenID인 OIDC로 AWS Role 기반으로 AWS를 사용하는 글은 잘 보이지 않더군용
- GitHub Actions에서 Code Deploy의 배포를 생성해 봅니다.
파트 3. NodeJS 애플리케이션을 배포하기 위한 서버 구성과 AWS Code Deploy 스크립트
- 앱을 배포하기 위해 EC2에 PM2를 깔아봅니다.
- Code Deploy를 이용해서 NodeJS 앱을 배포해 봅니다.
- 직접 작성한 간단한 appspec과 script들을 설명할 예정입니다.
댓글
이 글 공유하기
다른 글
-
[Oracle Cloud] 리소스 사용량 Limit 걸기
[Oracle Cloud] 리소스 사용량 Limit 걸기
2024.07.05 -
[AWS] 2월부터 늘어난 VPC 비용 - In-use Public IPv4 Address
[AWS] 2월부터 늘어난 VPC 비용 - In-use Public IPv4 Address
2024.03.03 -
[AWS] Route53 Domain 다른 AWS 계정으로 이전하기
[AWS] Route53 Domain 다른 AWS 계정으로 이전하기
2022.11.20 -
[AWS] Elastic Beanstalk graceful shutdown (feat. AutoScaling Lifecycle Hook - TERMINATING)
[AWS] Elastic Beanstalk graceful shutdown (feat. AutoScaling Lifecycle Hook - TERMINATING)
2022.11.10