Cloudflare R2 소개, 내부 아키텍처 알아보기 - AWS S3의 대항마가 가능할까

Cover Image for Cloudflare R2 소개, 내부 아키텍처 알아보기 - AWS S3의 대항마가 가능할까
swhan
· 5 min read

Cloudflare가 만든 글로벌 객체 스토리지 R2를 알아보겠습니다.

R2 소개

R2는 글로벌 CDN(Content Delivery Network) 회사 Cloudflare가 만든 객체 스토리지 서비스 입니다.

객체 스토리지란 Key-Value 구조로 비정형 데이터(로그, 동영상 및 사진 콘텐츠, 센서 데이터)를 저장 및 배포하기에 최적화된 클라우드 시대의 새로운 스토리지 유형인데요, AWS의 S3가 클라우드 시대를 열면서 많은 개발자들을 열광시켰지만, 세상에 공짜는 없는 법이죠.

S3가 처음 출시된 이후 20년 가까운 시간 동안 스토리지 단가($/GB)은 엄청나게 내려갔습니다. 하지만 끝내 내려가지 않는 비용, 개발자들의 지갑을 꾸준히 괴롭혀온 건 바로 네트워크 송신료(Egress fee)였죠.

들어올 때는 마음대로 짤

이에 Cloudflare는 자사의 CDN 인프라를 강점 삼아, 송신료 없는 객체 스토리지 서비스R2를 출시하며, AWS의 "들어올 땐 마음대로지만, 나갈 땐 아니란다" 철학에 도전장을 내밀게 되었습니다.

TMI: AWS도 발빠르게 대응해서 리전당 월 100GB, Cloudfront 월 1TB 무료 정책을 발표했습니다.

R2 아키텍처

클라우드플레어가 개발자 문서에서 R2가 어떻게 구성되어 있는지 설명해 놓았는데요, 각각의 구성 요소들이 뭐하는 친구들인지 알아보겠습니다.

  • R2 Gateway: 모든 API 요청을 받는 시작점으로 여기서 인증, 라우팅 로직을 담당. 내부적으로는 서버리스 플랫폼인 Workers를 이용한다고 합니다.
  • Metadata Service: 저희가 객체에 접근할 수 있게 내부적으로 관리하는 분산 메타데이터(객체 키, 체크섬 정보, 암호화 정보, 스토리지 노드 정보 등등) 관리 서비스.
  • Distributed Storage Infrastructure: 객체 데이터들을 암호화 후 물리적으로 저장하는 영구 스토리지(SSD, HDD)
  • Tiered Read Cache: R2 Gateway와 Distributed Storage Infrastructure 사이에 위치해서 읽기 속도를 높여주는 캐싱 레이어.

작동 방식

읽기

  • Request handling: R2 Gateway가 사용자와 가까운 데이터센터에서 요청을 받아서(edge) 인증을 처리합니다.
  • Metadata lookup: 이제 사용자가 요청한 객체가 어디에 있는지 Metadata Service를 통해 찾습니다.
  • Reading the object: 먼저 캐싱 레이어(Tiered Read Cache)를 찾아본 후, 없으면 분산 스토리지(SSD, HDD)시스템에 접근해서 객체를 가져와 사용자에게 제공합니다.

R2 읽기 작동 방식

쓰기

  • Request handling: 읽기 과정과 동일하게 사용자와 가까운 지역에서 요청 받은 후 인증을 처리합니다.
  • Encryption and routing: Metadata Service를 통해서 암호화 키를 검색하고, 암호화된 데이터를 저장할 스토리지 노드(클러스터)를 결정합니다.
  • Writing to storage: 이제 암호화된 데이터는 분산 스토리지 노드에 저장되고, 내구성을 위해 버킷 생성시 설정한 지역 내에서 복제됩니다(APAC: Asia-Pacific)

R2 쓰기 작동 방식

성능 최적화

S3가 성능 최적화를 위해 Cloudfront 함께 사용하듯이, R2 성능을 더욱 최적화하기 위해서는 Cloudflare Cache라는 서비스를 함께 사용해야 합니다.

위에 R2 아키텍처 문단에서 설명한 Tiered Read Cache는 클라우드플레어의 내부 최적화 요소(Gateway-Distributed Storage)인데요, Cloudflare Cache를 활성화하기 위해서는 사용자 지정 도메인을 설정해줘야 합니다. 이러면 이제 사용자는 R2 Gateway를 통하지 않고 사용자와 가장 가까운 지점(엣지)에서 캐싱된 데이터를 제공받을 수 있게 됩니다.

Cloudfront와 마찬가지로 최신 버전을 즉시 반영하지 않기 때문에, Cache Rules을 유의해서 설정해줘야 합니다.

R2 with cloudflare cache 작동 방식

가격 비교

  • 모든 비용은 서울 리전이 기준입니다.
  • Cloudfront 저장 비용은 오리진 서버로 S3를 사용한다는 가정으로 작성했습니다.
  • Cloudfront 쓰기 요청은 cloudfront-s3 구조로 가면 $0.06/GB 전송 비용이 발생하니 S3를 기준으로 잡았습니다.
  • R2는 어차피 자동으로 Cloudflare의 CDN을 통과하니 S3가 아닌 Cloudfront와 비교했습니다.
  • 모든 요청은 HTTPS 기준입니다.
단위: 백만(1M) 저장 전송 읽기 요청 쓰기 요청 무료 사용량
Cloudfront $0.025/GB $0.12/GB $1.2 $4.5 1TB 전송, 10M 읽기 요청
R2 $0.015/GB $0/GB $0.36 $4.5 1M 쓰기 요청, 10M 읽기 요청

장점은?

일단 제가 가볍게 써보고 느낀 장점부터 정리해 보도록 하겠습니다.

  1. Egress 비용 무료: 송신 비용이 없다는게 엄청난 겁니다.
  2. 저렴함: 데이터 전송 뿐 아니라, 요청에 드는 비용도 은근히 무시하지 못하는데요, 쓰기는 몰라도 읽기 비용도 압도적으로 저렴한 것 같습니다.
  3. S3 호환성: aws-cli, aws-sdk에 endpoint, credentials 정보만 바꿔주면 바로 사용 가능
  4. CDN 통합: cache-rule 설정만으로 심플하게 CDN 통합 가능

마무리

우선 간단하게 한국에서는 익숙하지 않은 R2라는 서비스에 대해 알아보았는데요, 앞으로 R2 캐시, S3 API와 호환성 설정, 응답 속도 측정 등 천천히 알아보면서 단점도 찾아보고, 클라우드플레어와 조금 더 친해지는 시간을 가져보도록 하겠습니다.