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

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)시스템에 접근해서 객체를 가져와 사용자에게 제공합니다.
쓰기
- Request handling: 읽기 과정과 동일하게 사용자와 가까운 지역에서 요청 받은 후 인증을 처리합니다.
- Encryption and routing: Metadata Service를 통해서 암호화 키를 검색하고, 암호화된 데이터를 저장할 스토리지 노드(클러스터)를 결정합니다.
- Writing to storage: 이제 암호화된 데이터는 분산 스토리지 노드에 저장되고, 내구성을 위해 버킷 생성시 설정한 지역 내에서 복제됩니다(APAC: Asia-Pacific)
성능 최적화
S3가 성능 최적화를 위해 Cloudfront 함께 사용하듯이, R2 성능을 더욱 최적화하기 위해서는 Cloudflare Cache라는 서비스를 함께 사용해야 합니다.
위에 R2 아키텍처 문단에서 설명한 Tiered Read Cache
는 클라우드플레어의 내부 최적화 요소(Gateway-Distributed Storage)인데요, Cloudflare Cache를 활성화하기 위해서는 사용자 지정 도메인을 설정해줘야 합니다. 이러면 이제 사용자는 R2 Gateway를 통하지 않고 사용자와 가장 가까운 지점(엣지)에서 캐싱된 데이터를 제공받을 수 있게 됩니다.
Cloudfront와 마찬가지로 최신 버전을 즉시 반영하지 않기 때문에, Cache Rules을 유의해서 설정해줘야 합니다.
가격 비교
- 모든 비용은 서울 리전이 기준입니다.
- 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 읽기 요청 |
장점은?
일단 제가 가볍게 써보고 느낀 장점부터 정리해 보도록 하겠습니다.
- Egress 비용 무료: 송신 비용이 없다는게 엄청난 겁니다.
- 저렴함: 데이터 전송 뿐 아니라, 요청에 드는 비용도 은근히 무시하지 못하는데요, 쓰기는 몰라도 읽기 비용도 압도적으로 저렴한 것 같습니다.
- S3 호환성: aws-cli, aws-sdk에 endpoint, credentials 정보만 바꿔주면 바로 사용 가능
- CDN 통합: cache-rule 설정만으로 심플하게 CDN 통합 가능
마무리
우선 간단하게 한국에서는 익숙하지 않은 R2라는 서비스에 대해 알아보았는데요, 앞으로 R2 캐시, S3 API와 호환성 설정, 응답 속도 측정 등 천천히 알아보면서 단점도 찾아보고, 클라우드플레어와 조금 더 친해지는 시간을 가져보도록 하겠습니다.