Cloudflare R2 vs S3: VPS 호스트용 객체 스토리지
Source: Dev.to
Cloudflare R2 vs S3 Object Storage for VPS Hosts
VPS(가상 사설 서버)를 운영하면서 대용량 파일을 저장하고 서빙해야 할 때, 객체 스토리지는 필수입니다. 가장 널리 쓰이는 두 서비스가 Amazon S3와 Cloudflare R2인데, 각각의 장단점을 이해하고 자신의 워크로드에 맞는 선택을 하는 것이 중요합니다.
1️⃣ 가격 구조 비교
| 항목 | Amazon S3 | Cloudflare R2 |
|---|---|---|
| 저장 비용 | $0.023/GB (표준) | $0.015/GB |
| 데이터 전송(아웃바운드) | $0.09/GB (첫 10TB) | $0.00/GB (같은 Cloudflare 네트워크 내) |
| PUT/GET 요청 | $0.005/1,000 PUT, $0.0004/1,000 GET | $0.005/1,000 PUT, $0.0004/1,000 GET |
| 삭제 비용 | $0.01/GB (삭제 시) | 없음 |
핵심 포인트: R2는 동일한 Cloudflare 네트워크 내에서 전송되는 트래픽에 대해 비용을 부과하지 않으므로, Cloudflare Workers와 함께 사용할 경우 비용 절감 효과가 큽니다.
2️⃣ 성능 및 지연 시간
-
Amazon S3
- 전 세계에 걸친 리전(Region) 배포로, 대부분의 경우 수십 밀리초 수준의 응답 시간을 제공합니다.
- 특정 리전(예:
us-east-1)에 트래픽을 집중시키면 레이턴시가 더 낮아집니다.
-
Cloudflare R2
- Cloudflare의 전역 에지 네트워크에 직접 연결되므로, 사용자와 가장 가까운 엣지 포인트에서 데이터를 제공할 수 있습니다.
- 특히 동적 콘텐츠를 Workers와 결합할 때 5~15ms 수준의 초저지연을 경험할 수 있습니다.
3️⃣ API 호환성
-
S3 호환 API
- R2는 완전한 S3 호환 API를 제공하므로, 기존에 S3 SDK(예:
aws-sdk,boto3)를 사용하던 코드를 거의 그대로 사용할 수 있습니다. - 다만, 일부 고급 기능(예: S3 Event Notifications, S3 Batch Operations)은 아직 R2에서 지원되지 않습니다.
- R2는 완전한 S3 호환 API를 제공하므로, 기존에 S3 SDK(예:
-
전용 R2 API
- Cloudflare는 R2 전용 API와 Workers KV와의 통합을 강조합니다.
- 최신 기능(예: Object Lifecycle Rules, Automatic Image Optimization)을 활용하려면 R2 전용 SDK를 사용하는 것이 좋습니다.
4️⃣ 보안 및 접근 제어
| 기능 | Amazon S3 | Cloudflare R2 |
|---|---|---|
| IAM 정책 | 상세한 리소스 기반 정책 지원 | 현재는 R2 Access Tokens와 Workers KV와 연동된 제한적인 정책만 제공 |
| 버킷 정책 | 지원 | 지원 (S3 호환 API를 통해 동일하게 설정 가능) |
| 암호화 | 서버 측 암호화(SSE‑S3, SSE‑KMS) | 서버 측 암호화(SSE‑R2) 제공, KMS와 직접 연동은 아직 미지원 |
| 퍼블릭 액세스 차단 | 가능 | 가능 (R2 Access Tokens 사용 권장) |
5️⃣ 사용 사례 예시
✅ Cloudflare Workers + R2
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const object = await R2_BUCKET.get('example.jpg')
return new Response(object.body, {
headers: { 'Content-Type': object.httpMetadata.contentType }
})
}
- 장점: Workers와 동일한 엣지에서 객체를 직접 읽어와, 레이지 로딩이나 이미지 변환 같은 작업을 초저지연으로 수행 가능.
✅ VPS + S3 (전통적인 백업)
aws s3 sync /var/www/html s3://my-backup-bucket --delete
- 장점: 기존에 구축된 CI/CD 파이프라인과 쉽게 연동 가능하고, 버전 관리와 수명 주기 정책을 활용해 오래된 백업을 자동 삭제할 수 있음.
6️⃣ 마이그레이션 팁
-
데이터 복제
rclone혹은aws s3 sync명령을 사용해 S3 → R2 혹은 그 반대로 데이터를 복제합니다.- 예시:
rclone sync s3:my-bucket r2:my-r2-bucket --progress
-
DNS 설정
- R2에 커스텀 도메인을 연결하려면 Cloudflare 대시보드에서 CNAME 레코드를
*.r2.cloudflarestorage.com으로 지정합니다.
- R2에 커스텀 도메인을 연결하려면 Cloudflare 대시보드에서 CNAME 레코드를
-
테스트
- 작은 파일(예: 1KB 텍스트 파일)부터 업로드/다운로드 테스트를 진행해 응답 시간과 요금 청구을 확인합니다.
7️⃣ 결론
| 항목 | Amazon S3 | Cloudflare R2 |
|---|---|---|
| 가격 | 전송 비용이 높음 | 전송 비용 무료 (같은 네트워크 내) |
| 레이지 레이턴시 | 평균 20‑30ms | 평균 5‑15ms |
| 에코시스템 | 풍부한 도구와 서비스 | Workers와의 긴밀한 통합 |
| 마이그레이션 난이도 | 기존 인프라와 호환성 최상 | S3 호환 API 덕분에 비교적 쉬움 |
- VPS에서 전통적인 백업·아카이브 용도로는 Amazon S3가 여전히 강력한 선택입니다.
- 엣지에서 바로 파일을 제공하거나 Workers와 결합해 서버리스 아키텍처를 구현하고 싶다면 Cloudflare R2가 비용·성능 면에서 더 유리합니다.
추천: 현재 사용 중인 워크로드와 비용 구조를 먼저 분석하고, 필요에 따라 하이브리드 전략(핵심 데이터는 S3, 캐시 및 빈번히 접근되는 파일은 R2)으로 전환하는 것을 고려해 보세요.
VPS 호스트를 위한 객체 스토리지 사용 사례
- 정적 자산 및 미디어 업로드
- 백업 / 스냅샷 (앱 수준, 하이퍼바이저 수준이 아님)
- 로그 아카이브 및 데이터 내보내기
- 웹사이트용 CDN 오리진
DigitalOcean나 Hetzner와 같은 제공업체에 호스팅할 때, 일반적으로 비용을 예측 가능하게 유지하면서도 전 세계적인 성능을 얻으려 합니다. 객체 스토리지는 이를 실수로 크게 늘리기 가장 쉬운 곳입니다.
비용 비교
S3 경제성
- 스토리지: 경쟁력 있는 가격.
- 이그레스: 가장 큰 비용 항목; 전송된 GB당 비용을 지불합니다.
- 요청 및 기능: 라이프사이클 전환, 복제, 이벤트 알림 등은 추가 요금을 발생시킵니다.
- CDN: S3를 CloudFront 뒤에 두면 전달이 개선될 수 있지만, 여전히 AWS 청구 체계에 포함됩니다.
R2 경제성
- 스토리지: 저장된 GB당 청구됩니다.
- 작업: 요청당 청구됩니다 (PUT, GET, LIST 등).
- 이그레스: $0 이그레스 from R2; 퍼블릭 인터넷으로 전송되는 데이터는 Cloudflare 엣지 네트워크 내부에서 처리됩니다.
- 주의사항: “이그레스 없음”이 모든 네트워크 비용을 없애는 것은 아니며, VPS 제공업체가 여전히 아웃바운드(또는 인바운드) 대역폭에 대해 요금을 부과할 수 있습니다.
성능 및 아키텍처 영향
- S3는 지역 중심입니다. CDN 레이어를 추가하지 않으면 요청은 선택한 지역으로 이동합니다.
- R2는 Cloudflare 엣지에 가깝게 위치하며 Cloudflare 캐싱과 특히 잘 작동하여 별도 설정 없이 전 세계적으로 낮은 지연 시간의 읽기를 제공합니다.
일반적인 시나리오
| 시나리오 | 최적 선택 |
|---|---|
| 앱 서버와 사용자가 대부분 하나의 AWS 리전(예: us‑east‑1)에 위치함 | S3 |
| 전 세계 방문자이며 이미 Cloudflare를 DNS/WAF/CDN으로 사용 중 | R2 |
| 공개 읽기가 없는 내부 워크로드(백업, 데이터 파이프라인) | S3 (지역 모델이면 충분합니다) |
Choosing between S3 and R2
| When to pick S3 | When to pick R2 |
|---|---|
| 전체 S3 기능 세트가 필요합니다 (이벤트 알림, 객체 잠금, 여러 스토리지 클래스, 엄격한 규정 준수) | 공개 다운로드/스트리밍 트래픽이 많을 것으로 예상됩니다 |
| 컴퓨팅이 AWS에서 실행되고 데이터 로컬리티가 중요합니다 | 예측 가능한 비용과 CDN 친화적인 아키텍처를 원합니다 |
| 에지 전달의 혜택을 받지 못하는 무거운 내부 워크플로우 | 이미 Cloudflare를 DNS, WAF, CDN으로 사용하고 있습니다 |
Practical checklist for VPS hosting
- API compatibility – R2는 S3 API를 구현하지만 모든 희귀 기능을 지원하는 것은 아닙니다. 먼저 R2 엔드포인트에 대해 도구를 테스트하세요.
- Tooling – S3와 통신하는 대부분의 백업 유틸리티와 SDK는 사용자 지정 엔드포인트와 액세스 키를 제공하면 R2에서도 작동합니다.
- Lock‑in considerations –
- S3: “중력에 의한 락인” – 사실상 모든 클라우드 서비스가 이를 지원합니다.
- R2: “워크플로에 의한 락인” – 해당 기능에 크게 의존하면 Cloudflare의 엣지 기능에 종속됩니다.
Rule of thumb: 고급 규정 준수 제어나 특수한 S3 기능이 필요하면 S3를 사용하세요. 파일 제공에 대해 비용이 크게 부과되지 않는 객체 스토리지만 필요하다면 R2가 일반적으로 더 좋은 기본 선택입니다.
R2용 최소 AWS‑CLI‑스타일 설정
# 1) Configure a named profile for R2
aws configure set aws_access_key_id "$R2_ACCESS_KEY" --profile r2
aws configure set aws_secret_access_key "$R2_SECRET_KEY" --profile r2
aws configure set region auto --profile r2
# 2) Upload a backup (R2 is S3‑compatible, so use the S3 commands)
aws s3 cp ./backup.tar.gz s3://my-bucket/backups/backup.tar.gz \
--endpoint-url https://.r2.cloudflarestorage.com \
--profile r2
# 3) (Optional) List objects
aws s3 ls s3://my-bucket/backups/ \
--endpoint-url https://.r2.cloudflarestorage.com \
--profile r2
이 마이그레이션은 몇 분이면 완료됩니다—며칠이 아니라—앱이 S3 전용 기능에 의존하지 않는 한.
일반적인 VPS‑호스팅 사이트에 대한 권장 사항
- WordPress, Laravel, Node, Django 애플리케이션처럼 많은 공개 자산을 제공하는 경우: R2는 아웃바운드 트래픽이 큰 비용 요인인 점에서 강력한 기본 옵션이며, Cloudflare가 R2를 구축한 이유도 바로 그 고통을 없애기 위해서입니다.
- S3 선택: 전체 기능 세트가 필요하거나, 엄격한 규정 준수가 요구되거나, 컴퓨팅 환경이 이미 AWS에 있는 경우.
- R2 선택: 공개 다운로드량이 많을 것으로 예상되고, 비용을 예측 가능하게 유지하고 싶으며, 이미 Cloudflare 네트워크를 사용하고 있는 경우.
일반적인 VPS‑호스팅 패턴:
VPS on Hetzner or DigitalOcean → object storage on R2 for user uploads and backups → stateless app. If you later outgrow the VPS, the storage separation makes migration easier—without a hard commitment today.
이 글의 일부 링크는 제휴 링크입니다. 해당 링크를 통해 구매하시면 추가 비용 없이 커미션을 받을 수 있습니다.