배경 및 문제
서비스의 핵심 기능 중 하나가 사용자가 생성하는 이미지 콘텐츠의 저장과 공유에 있었습니다.
이런 이미지 콘텐츠들은 모두 S3 이미지 저장용 버킷에 저장하고 관리되고 있었습니다.
그런데 AWS S3 버킷에서 예상치 못한 비용 상승이 발생했습니다.
출시 초반을 가정한 분석에서 S3 버킷에서 일기장 하나 당 하루에 약 600건의 GET 요청이 발생할 것이라는 분석이 있었고, 이는 월간 약 527.34GB의 트래픽으로, 약 66.40 USD의 비용이 청구될 것으로 예상되는 트래픽이었습니다. 서비스의 성장을 고려할 때, 이는 지속 가능한 수준이 아니었습니다.
해결 방안
비용을 절감할 수 있는 방안에 대해 팀원들과 다양한 의견을 공유하였고, 이를 바탕으로 다음과 같은 해결책을 도입하기로 결정했습니다.
1.
AWS CloudFront 도입: S3보다 비용 체계가 저렴한 CloudFront를 도입하고, S3 버킷에 대한 퍼블릭 액세스를 차단하기로 결정했습니다. 이로 인해 월간 63.24 USD로 비용 절감 효과를 확인할 수 있었습니다.
2.
이미지 리사이징: 버킷에 저장되는 이미지 파일의 크기를 줄이기 위해 클라이언트 측에서 이미지를 업로드할 때, 이미지를 리사이징하여 업로드하도록 변경했습니다. 이미지 자체의 용량이 줄어들어 마찬가지로 전체 트래픽 양을 크게 개선할 수 있었습니다. 이로 인해 월간 12.66 USD로 비용 절감 효과를 확인할 수 있었습니다.
3.
클라이언트 측 캐싱 구현: 이미지 파일과 콘텐츠 주소를 클라이언트 측에서 캐싱하도록 했습니다. 이는 불필요한 반복 다운로드를 줄이고, 전체 트래픽 양을 상당히 감소시킬 수 있었습니다. 최종적으로 이로 인해 월간 0.63 USD로 비용 절감 효과를 확인할 수 있었습니다.
느낀점
이 과정들은 팀워크와 긴밀한 커뮤니케이션 없이는 불가능했습니다.
클라이언트 개발 팀 입장에서는 안정성 있는 소프트웨어의 로직을 건드리는 상황을 반기지 않을 수 있습니다.
때문에 저는 객관적 데이터를 기반으로 한 아키텍처 개선으로 얻을 수 있는 비용 절감 효과를 제안함으로써 동기를 부여했습니다.
덕분에 클라이언트 팀원들로부터 적극적으로 상황에 대한 공감과 이해를 얻을 수 있었고, 그 결과 저희는 비용 절감뿐만 아니라 사용자 경험까지 향상시키는 결과를 달성할 수 있었습니다.