이미지 SNS 서버 비용 줄이기

이상현·2024년 11월 19일

고민 과정

목록 보기
2/3
post-thumbnail

서버 비용을 줄이기 위한 과정을 기록한 게시글입니다.

상황

소수의 유저가 그룹을 만들어 사진을 공유할 수 있는 앱 서비스를 만들고 있다.
우리 서비스는 사진 업로드는 많지만, 폐쇄형 이므로 사진 다운로드가 그렇게 많지는 않다.
그럼에도 불구하고 예상 요금을 봤을때 상당한 비용이 들것으로 예상되어서, 사용자 경험을 해치지 않는 선에서 비용 절감을 해야한다.

예상 요금 시나리오 (금액 비교를 위한)

금액 비교를 위해 다음과 같은 가정을 했다.

  1. 한 그룹의 인원은 평균 6명이다
  2. 유저 한명당 평균 200장의 사진을 업로드 함
  3. 사진의 평균 용량은 3MB
  4. 모든 사진은 완벽히 캐싱된다.

실제 요금 예측이 아닌, 금액 비교를 위한 가정이므로 이상적인 상황으로 가정했습니다.

이렇게 할 경우 다음과 같은 스토리지 비용으로 지불해야 하는 유저 한명당 요금 계산은 다음과 같다. (요청 횟수에 대한 요금은 0에 수렴해 무시했습니다)

서비스: AWS S3 Standard
리전: 아시아 태평양(서울)

  • 스토리지 저장 요금
    ($0.025 / GB) * 200 장 * 3 MB = $0.015
  • 데이터 전송 요금 (유저가 그룹의 모든 사진 다운로드)
    ($0.126 / GB) * 200 장 * 3 MB * 6 명 = $0.4536

합계 = $0.4686

이상적인 상황에서 유저 한명이 앱을 사용할 시 스토리지 관련 비용으로만 약 0.5달러가 지불되는

성공하면 망하는 서비스가 되어버릴 확률이 높다.

(실제 요금은 훨씬 더 많이 나올 것이다)

*공개 SNS 서비스인 페이스북의 아시아권에서의 고객별 월 평균 수입 (ARPU)은 $5.52 이다.

우리 서비스는 폐쇄형 서비스라 광고 수익을 내기 어렵다. 게다가 초기 단계에서는 BM이 들어가지 않을 예정이였다.

기술 선택지

전체 요금중에 97%를 차지하는 데이터 전송 요금 을 줄여야 한다.

그러기 위해서는 다음과 같은 전략이 있다.

이미지 해상도 정책 설정

우리의 서비스의 메인 화면에서는 이미지가 작게 보인다.
기본적으로 썸네일을 보여주고, 이미지를 클릭해서 크게 볼 때만 고화질 사진을 보여주는 전략이다. 이는 로딩 속도가 빨라져 사용자 경험에도 좋다.

썸네일 전략으로 두가지 가정을 추가해서 요금을 계산해보자.

  1. 한 그룹의 인원은 평균 6명이다
  2. 유저 한명당 평균 200장의 사진을 업로드 함
  3. 사진의 평균 용량은 3MB
  4. 모든 사진은 완벽히 캐싱된다.
  5. 썸네일은 사진 원본 용량의 5%이다.
  6. 유저가 사진 원본을 보는 비율은 30%이고 나머지는 썸네일만 본다.
  • 스토리지 저장 요금
    ($0.025 / GB) * 200 장 * (3 MB + 0.3MB) = $0.0165
  • 데이터 전송 요금
    ($0.126 / GB) * 200 장 * (3 MB * 0.3 + 0.15MB) * 6 명 = $0.15876

합계 = $0.17526

썸네일 전략으로 전체 예상 요금이 원래 비용 대비 약 60% 감소했다.

하지만 이걸로는 부족하다. 추가로 리서치를 해봤다.

콘텐츠 전송 네트워크 (CDN)

CDN은 데이터 사용량이 많은 애플리케이션의 웹 페이지 로드 속도를 높이는 상호 연결된 서버 네트워크이다. *

예를 들면, 유튜브 서버가 미국에 있지만, 한국에도 서버를 두어 한국에서의 컨텐츠 요청에 대한 응답을 미국 서버에서 하는것이 아닌 한국 서버에서 하도록 하는 방식이다. 캐싱을 포함하는 개념이다.

CDN 을 사용할 경우 S3 단일 리전에서 데이터를 보내는 것보다 저렴하고 빠르다.

AWS CloudFront

AWS CloudFront 는 AWS 에서 제공하는 CDN 서비스이다.
CloudFront는 전 세계 여러 엣지 로케이션(Edge Location)에 데이터를 캐싱하여 사용자와 물리적으로 가까운 서버에서 콘텐츠를 제공함으로써 응답 시간을 줄이고 성능을 향상시킨다.

CloudFront와 S3의 데이터 송수신은 무료이고, 일반적인 데이터 전송 요금도 S3 보다는 저렴하다. ($0.126 / GB -> $0.120 / GB) 또한, 요청된 컨텐츠는 엣지 서버에 자동으로 캐시하여 S3 서버의 부하를 줄여준다.

(+ 프리티어 제한이 S3와 많이 차이난다. 캐시 데이터 스토리지는 크기 제한이 없고, 데이터 전송 요금 무료 용량이 10배로 1TB/월 이다.)

온디맨드 이미지 리사이징 (Ondemand Image Resizing)

AWS Lambda 와 함께 사용해서 온디멘드 이미지 리사이징을 구현할 수 있다.
썸네일 생성을 클라이언트에서 하지 않아도 되고, 이미지를 다운로드 할 때 여러가지 원하는 이미지의 크기를 지정할 수 있다.
더 다양한 크기의 사진을 사용자에 알맞게 제공하고, 추후 기능 개발 시에도 추가적인 썸네일 제작 과정이 필요없게 되어 매우 효율적이다.

위 기술을 활용해서 더 많은 이미지 사이즈 정책을 정하고, 예측 시나리오를 작성해서 비용을 다시 계산해봤다.

  1. 한 그룹의 인원은 평균 6명이다
  2. 유저 한명당 평균 200장의 사진을 업로드 함
  3. 사진의 평균 용량은 3MB
  4. 모든 사진은 완벽히 캐싱된다.
  5. 썸네일은 사진 원본 용량의 5%이다.
  6. 유저가 중간 크기 사진을 보는 비율은 30%이다.
  7. 중간 크기 사진은 원본 용량의 20%이다.
  8. 유저가 사진 원본을 다운 받는 비율은 5%이다.
  • 스토리지 저장 요금
    ($0.025 / GB) * 200 장 * 3 MB = $0.015
  • 데이터 전송 요금
    ($0.120 / GB) * 200 장 * ((3 MB * 0.2 * 0.3) + (0.15MB) + (3MB * 0.05)) * 6 명 = $0.06912

합계 = $0.08412

여러 이미지 크기 정책온디맨드 리사이징을 적용하여 으로 전체 예상 요금이 원래 비용 대비 약 82% 감소했다.

아키텍쳐

이미지 업로드

EC2 서버의 부하를 줄이기 위해 Presigned URL 을 통해 클라이언트에서 사진을 바로 S3로 업로드 하도록 구현했다.

이미지 다운로드

  1. 클라이언트에서 특정 크기의 이미지를 요청하면 CloudFront는 해당 크기의 이미지가 캐싱 되어있는지 확인한다.
  2. 캐싱 되어있다면 바로 응답한다.
  3. 캐싱 되어있지 않다면 Lambda 를 실행하여 S3의 원본 데이터를 리사이징 한다.
  4. 리사이징한 이미지를 캐시에 저장하고 응답한다.

결론

이미지 기반 SNS 서비스에서 발생할 수 있는 데이터 전송 비용을 효과적으로 줄일 수 있는 전략을 적용했다.

  1. 이미지 해상도 전략
  • 메인 화면에서 썸네일 이미지만 보여주고, 고화질 원본 이미지는 사용자가 필요로 할 때만 제공하여 사용자 경험을 유지하면서도 데이터 전송 비용을 크게 절감했다.
  1. AWS CloudFront 도입
  • CDN 서비스를 통해 S3 데이터 전송 요금을 절감하고, 엣지 로케이션의 캐싱을 활용하여 서버 부하를 줄이며 성능을 개선했다.
  1. 온디맨드 이미지 리사이징
  • AWS Lambda@Edge 를 이용해 필요한 크기의 이미지를 실시간으로 생성하도록 설계하여 추가적인 썸네일 저장 공간과 클라이언트의 리소스를 줄이고 효율적으로 이미지를 제공할 수 있게 했다.

결과적으로, 여러 비용 절감 전략을 통해 초기 예상 비용 대비 약 82% 의 비용 절감 효과를 달성했다.

이와 함께 사용자 경험을 저하시키지 않으면서 서비스의 안정성을 확보할 수 있었다.

이미지 기반 서비스의 핵심은 비용 절감과 사용자 경험의 균형이다.

앞으로도 지속적인 비용 모니터링과 최적화를 통해 서비스가 안정적으로 성장할 수 있는 기반을 마련할 것이다.

0개의 댓글