[프로젝트]/[백엔드] LAITEU

AWS 개발 환경 비용 최적화하기

danhan 2024. 11. 20. 15:36

들어가며

AWS로 개발/운영 환경을 구축하고 있던 중, AWS Billing 대시보드를 검토하다가 예상보다 많은 비용이 발생하고 있는 것을 발견했습니다. Cost Explorer로 지난 3개월간의 비용 추이를 분석해보니 매월 약 15% 정도 비용이 증가하고 있었고, EC2 인스턴스와 관련 리소스들이 전체 비용의 80% 이상을 차지하고 있었습니다.

문제 상황

1. 높은 EC2 비용

현재 prod 서버와 dev 서버를 모두 운영 중이었습니다. prod 서버는 m6g.medium($33.84), dev 서버는 t4g.medium($29.95) 인스턴스를 사용하고 있었는데, 월 EC2 비용만 $63.79가 발생하고 있었습니다.

처음에는 dev 서버의 인스턴스 타입을 t4g.small로 다운그레이드하는 것을 고려했습니다. 하지만 실제 사용 패턴을 분석해보니 더 근본적인 문제가 있었습니다:

  • 하루 사용 시간: 1-2시간 (배포 테스트 시에만)
  • 서버 상태: 24시간 실행 중
  • 불필요한 유휴 시간: 약 22-23시간/일

2. 스토리지(EBS) 비용

디스크 사용량을 분석해보니 81GB의 gp3 볼륨을 사용 중이었고, 여기에 $7.39/월의 비용이 발생하고 있었습니다. du -sh /* 명령어로 확인해보니 주요 공간은 다음과 같이 사용되고 있었습니다:

/var/lib/docker: 3.4GB
/var/log: 777M (journal), 여러 로그 파일들

처음에는 비용 절감을 위해 EBS 볼륨 타입을 gp3에서 st1으로 변경하는 것을 검토했습니다. 하지만 성능 테스트 결과 배포 과정에서 발생하는 I/O 요청을 처리하기에는 성능이 부족할 것으로 판단되었습니다.

3. 네트워크 관련 비용

Elastic IP 비용으로 월 $5.23이 발생하고 있었습니다. 또한 사용하지 않는 CloudFront 배포가 활성화되어 있었는데, 이는 이전 테스트 과정에서 설정했다가 제대로 정리되지 않은 것이었습니다.

해결 과정

1. 개발 서버 최적화

여러 대안을 검토했습니다:

  1. 첫 번째 시도: 야간에만 자동 중지/시작
    • CloudWatch Events로 스케줄링 설정
    • 문제점: 예상치 못한 테스트 필요 시 대응 어려움
  2. 두 번째 시도: Spot Instance 사용
    • 비용 70-80% 절감 가능
    • 문제점: 갑작스러운 인스턴스 종료 위험
  3. 최종 선택: 필요할 때만 시작하는 방식장점:
    • 비용 최소화 (필요한 시간만큼만 과금)
    • 환경 일관성 유지 (AMI 사용)
    • 리소스 낭비 제거
    단점:
    • 서버 시작에 5-10분 소요
    • 수동 시작/종료 필요
  4. # 1. 현재 서버 상태를 AMI로 백업 # 2. 불필요한 리소스 정리 후 서버 종료(Terminate) # 3. 연결된 EBS 볼륨도 함께 정리

2. EBS 볼륨 최적화

디스크 공간 문제 해결을 위해 다음과 같은 접근을 시도했습니다:

  1. 로그 관리 방안 검토:
    • CloudWatch Logs 연동 검토
    • 문제점: 추가 비용 발생 가능성
  2. 최종 선택: 로그 정리 및 관리 정책 수립
  3. # 도커 정리 docker system prune -a # 로그 파일 정리 sudo rm /var/log/messages-* sudo journalctl --vacuum-time=7d
  4. 향후 로그 관리를 위한 Docker 설정 추가:
  5. { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }

이 과정에서 특히 중요했던 점은:

  • 로그 파일이 예상보다 빠르게 증가한다는 것
  • Docker 컨테이너 로그 관리가 매우 중요하다는 것
  • 자동화된 정리 정책이 필수적이라는 것

3. 불필요한 리소스 정리

CloudFront와 관련 리소스 정리는 다음 단계로 진행했습니다:

  1. 영향도 분석
    • 현재 서비스 영향도 체크
    • 연관된 리소스 파악
  2. 단계적 제거
    • WAF 규칙 비활성화 테스트 (1주일)
    • CloudFront 배포 비활성화 모니터링
    • 문제 없음 확인 후 최종 삭제

최적화 결과

  1. EC2 비용: $63.79 → $33.84 (47% 감소)
    • dev 서버 필요시만 사용으로 전환
    • 예상 추가 절감: 월 $20-25
  2. EBS 비용: $7.64 → $5.50 (28% 감소)
    • 디스크 사용량 45% 감소
    • 로그 관리 정책으로 추가 비용 증가 방지
  3. 불필요한 리소스 제거
    • WAF, CloudFront 관련 비용 제거
    • Elastic IP 최적화로 $5.23 절감

이 과정에서 배운 점

AWS 리소스 관리에서 가장 중요한 것은 지속적인 모니터링과 분석이라는 것을 배웠습니다. 특히 다음 사항들이 중요했습니다:

  1. 비용 모니터링
    • 정기적인 Cost Explorer 검토
    • 리소스별 비용 추이 분석
  2. 리소스 최적화 원칙
    • '항상 켜두는 것'이 아닌 '필요할 때 사용'
    • 자동화된 관리 정책 수립
    • 테스트 환경과 운영 환경의 차별화
  3. 기술적 고려사항
    • 로그 관리의 중요성
    • 컨테이너 관리 전략
    • 리소스 의존성 파악

앞으로의 계획

  1. CloudWatch를 활용한 리소스 모니터링 강화
  2. prod 서버에 대한 Auto Scaling 도입 검토
  3. 정기적인 리소스 사용량 검토와 최적화 진행

이번 최적화 경험을 통해 클라우드 리소스 관리의 중요성을 실감했습니다. 특히 개발 환경에서는 필요한 시점에만 리소스를 사용하는 것이 비용 효율적이며, 이는 적절한 도구와 정책을 통해 달성할 수 있다는 것을 배웠습니다.