AWS S3에서 Cloudflare R2로: 블로그 이미지 호스팅 비용을 0원대로 낮추는 무중단 마이그레이션 가이드

블로그를 운영하다 보면 글의 개수가 늘어나고 방문자가 증가할수록 예상치 못한 비용 압박에 직면하게 됩니다. 특히 이미지, GIF 애니메이션, 혹은 첨부 파일이 많아질수록 서버 비용보다 ’네트워크 전송 비용(Egress Fee)’이 눈덩이처럼 불어나기 마련입니다.

고화질 이미지와 캡처 화면을 자주 올리는 블로그일수록 AWS S3와 CloudFront에서 발생하는 비용이 매달 부담스러운 수준으로 커지기 쉽습니다.

이 문제의 대안으로 주목받는 것이 바로 Cloudflare R2입니다. R2는 Egress(데이터 전송) 요금이 아예 없고 무료 제공량도 넉넉해서, 개인 블로그나 중소형 기술 블로그 규모라면 이미지 호스팅 비용을 사실상 0원대로 낮출 수 있습니다.

단순히 “R2가 더 저렴하다”는 추상적인 이야기가 아닙니다. 어떻게 이런 비용 절감이 가능한지, 그리고 서비스 중단 없이 기존 S3 링크를 그대로 유지하며 마이그레이션할 수 있는지 상세한 실전 노하우를 공유합니다.


왜 AWS S3는 비싸고, Cloudflare R2는 저렴할까?

많은 초보 블로거와 개발자가 간과하는 사실이 있습니다. AWS S3 자체의 저장 공간(Storage) 비용은 그리 비싸지 않습니다. 진짜 복병은 바로 **‘Egress 데이터 전송료(인터넷으로 나가는 트래픽 비용)’**입니다.

사용자가 블로그 글을 읽을 때마다 이미지가 서버(또는 CDN)에서 사용자의 브라우저로 전송됩니다. AWS S3는 이 전송량에 대해 기가바이트(GB)당 일정 비용을 부과합니다. CloudFront를 앞에 두어 캐싱하더라도 일정 수준 이상의 트래픽이 발생하면 여전히 비용이 청구됩니다.

반면, **Cloudflare R2는 ‘Egress 요금(데이터 전송 수수료)이 0원’**입니다. 이것이 가능한 이유는 Cloudflare가 전 세계적인 자체 네트워크 에지(Edge) 인프라를 보유하고 있으며, 대역폭 비용을 사용자에게 전가하지 않는 비즈니스 모델을 취하고 있기 때문입니다.

AWS S3 vs Cloudflare R2 비용 모델 비교

비교 항목 AWS S3 + CloudFront (일반적인 구성) Cloudflare R2
저장 용량 요금 GB당 약 $0.023 (표준 기준) GB당 $0.015 (첫 10GB 무료)
Egress (데이터 전송) 요금 지역별로 다름 (GB당 $0.08~0.11 수준) $0 (무제한 무료)
Class A 요청 (쓰기 등) 1,000건당 $0.005 100만 건당 $4.50 (매월 100만 건 무료)
Class B 요청 (읽기 등) 10,000건당 $0.004 100만 건당 $0.36 (매월 1,000만 건 무료)

블로그 이미지는 한 번 업로드(Class A)하면 수만 번 조회(Class B)되는 특성을 가집니다. R2는 무료 제공량(월 저장 10GB, 쓰기 100만 회, 읽기 1,000만 회)이 워낙 넉넉하여 개인 블로그나 중소형 규모의 기술 블로그라면 사실상 유료 과금 구간에 진입하기조차 어렵습니다.


마이그레이션 전후 비용을 직접 비교하는 법

마이그레이션 전후로 실제 비용이 얼마나 달라지는지는 블로그의 트래픽 양, 저장된 이미지 총용량, 기존 AWS 요금제 구성에 따라 크게 달라집니다. 일반화된 수치를 제시하기보다, 아래 항목을 자신의 환경에서 직접 확인해 비교하는 것이 정확합니다.

대부분의 개인 블로그나 중소형 기술 블로그는 이미지 저장 용량과 조회 수가 R2의 무료 제공량 이내에 들어오기 때문에, 전환 후 월 청구 비용이 0원에 가까워지는 경우가 많습니다.


다운타임 없는 무중단 이전 실전 가이드

기존에 AWS S3로 서비스 중이던 블로그 이미지를 중단 없이 R2로 옮기려면 치밀한 계획이 필요합니다. 이미 작성된 수백 개의 글 속 이미지 URL(https://s3.amazonaws.com/... 또는 custom CDN 도메인)이 깨지면 SEO(검색엔진 최적화)에 치명적인 타격을 입기 때문입니다.

이를 방지하려면 Cloudflare가 제공하는 핵심 기능인 **‘Sippy(Super Slurper의 실시간 마이그레이션 버전)’**를 활용해 무중단 전환을 진행하는 것이 좋습니다.

1단계: Cloudflare R2 버킷 생성 및 커스텀 도메인 설정

  1. Cloudflare 대시보드에 로그인한 후 [R2] 메뉴로 이동합니다.
  2. 새 버킷(Create Bucket)을 생성합니다. 버킷 이름은 식별하기 쉬운 이름으로 설정합니다.
  3. 버킷 세팅에서 **‘커스텀 도메인(Custom Domains)’**을 연결합니다. 기존에 AWS CloudFront에 연결해서 사용하던 이미지 서브도메인(예: img.myblog.com)이 있다면, 마이그레이션 최종 단계에서 이 도메인의 DNS 대상을 R2로 변경할 것입니다. 우선은 임시 도메인이나 서브도메인을 하나 더 연결해 둡니다.

2단계: Sippy를 활용한 실시간 증분 마이그레이션 활성화

기존 S3에 수 기가바이트의 데이터가 쌓여 있다면, 한 번에 다운로드받아 업로드하는 방식은 시간도 오래 걸리고 누락이 발생하기 쉽습니다. R2의 **Sippy(S3 호환 자동 마이그레이션)**를 켜면 이 문제가 완벽히 해결됩니다.

[동작 원리]
사용자 요청 -> R2 버킷에 이미지 요청 
  -> 이미지가 R2에 있음: 즉시 반환
  -> 이미지가 R2에 없음: R2가 자동으로 AWS S3에서 이미지를 가져와 저장(복사)한 후 사용자에게 반환

이 설정을 마치면, 이제부터 요청이 들어오는 이미지들은 자동으로 AWS S3에서 R2로 실시간 복사됩니다. 사용자는 어떠한 로딩 지연이나 이미지 깨짐도 느끼지 못합니다.

3단계: 점진적 데이터 이관 완료 및 DNS 전환

Sippy를 켜두면 트래픽이 유입되면서 자주 쓰이는 이미지들이 알아서 R2로 넘어옵니다. 하지만 한 번도 조회되지 않은 오래된 이미지까지 완벽히 옮기기 위해 백그라운드에서 전체 마이그레이션을 1회 실행해 줍니다.

  1. Cloudflare R2의 ‘데이터 이관(Data Migration)’ 도구를 실행합니다.
  2. S3 버킷 전체를 대상으로 마이그레이션 작업을 등록하면 파일이 누락 없이 R2로 복사됩니다. 소요 시간은 저장된 파일의 총량과 개수에 비례하므로, 작업을 등록한 뒤 진행 상황을 직접 모니터링하는 것이 정확합니다.
  3. 복사가 완료되었는지 파일 개수와 용량을 대조해 검증합니다.
  4. 검증이 완료되면 기존 이미지 도메인(img.myblog.com)의 DNS 레코드를 AWS CloudFront/S3에서 Cloudflare R2 버킷을 가리키도록 변경합니다.

이 절차를 따르면 기존 블로그 글의 이미지 소스 코드(src 주소)를 단 한 줄도 수정하지 않고, 뒷단의 호스팅 서버만 AWS에서 Cloudflare R2로 전환할 수 있습니다.


Cloudflare R2 도입 시 주의해야 할 점 (Gotchas)

Cloudflare R2가 비용적인 측면에서 압도적인 장점을 지니고 있지만, 전환 전에 반드시 고려해야 할 실무적인 주의 사항도 있습니다.


인프라 다이어트, 망설일 이유가 없습니다

블로그 운영자에게 매달 고정적으로 나가는 호스팅 비용은 콘텐츠 생산의 동력을 떨어뜨리는 요인 중 하나입니다. 특히 텍스트 위주의 블로그에서 가장 큰 리소스를 잡아먹는 것이 이미지 파일이라는 점을 감안하면, 이미지 호스팅 비용을 제로(0)로 만드는 것은 가장 먼저 실행해야 할 인프라 다이어트입니다.

AWS S3의 비싼 Egress 요금 때문에 매달 청구서를 보며 한숨을 쉬고 계셨다면, 무중단 마이그레이션이 지원되는 Cloudflare R2로 눈을 돌려보시기 바랍니다. 초기 설정에 한두 시간만 투자하면, 이후로는 비용 걱정 없이 고화질 이미지와 미디어를 마음껏 업로드하며 오직 양질의 글을 쓰는 데에만 집중할 수 있는 쾌적한 환경을 얻게 될 것입니다.