Cloudflare R2 vs S3: VPS 앱을 위한 객체 스토리지

발행: (2026년 4월 29일 AM 11:14 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

번역을 진행하려면 실제 번역하고자 하는 텍스트(본문, 코드 블록을 제외한 내용)를 제공해 주시겠어요?
제공해 주신 내용을 그대로 유지하면서 한국어로 번역해 드리겠습니다.

일반적인 VPS 워크로드

오브젝트 스토리지는 다음과 같은 용도로 사용할 수 있는 내구성 있는 “블롭 버킷”입니다:

  • 사용자 업로드 (이미지, 비디오, PDF)
  • 백업 및 아카이브
  • 웹 앱용 정적 자산
  • 데이터 파이프라인 (로그, 내보내기)

결정 요인

  • 이그레스 비용 – 데이터를 퍼블릭 인터넷이나 VPS로 이동시키는 경우
  • 지연 시간 – 컴퓨팅 리소스와 스토리지 엔드포인트 사이의 거리
  • S3 API 호환성 – 도구 및 SDK 사용상의 마찰
  • 운영 편의성 – IAM, 정책, 수명 주기 규칙

R2가 돋보이는 이유

  • 많은 일반 시나리오에서 이그레스 요금이 없음으로, 파일 제공이나 지역 간 콘텐츠 동기화 시 비용 계산이 크게 바뀔 수 있습니다.
  • Cloudflare 엣지 네트워크 및 캐시 레이어와의 긴밀한 통합.

참고: “이그레스 없음”은 비용이 전혀 없다는 의미가 아닙니다. 여전히 스토리지와 운영 비용을 지불해야 하며, 요청 가격은 사용 패턴에 맞춰 검증해야 합니다.

비용 고려 사항

  • S3: 스토리지 가격은 보통 저렴하지만, 네트워킹(egress + 요청 요금)이 대부분을 차지합니다. 특히 공개 다운로드나 트래픽이 많은 워크로드에서 그렇습니다.
  • R2: 대부분의 egress 요금을 없애지만, 스토리지와 요청 요금은 여전히 발생합니다.

앱이 이미지, 다운로드, 미디어 등 자산이 무거운 경우, 먼저 egress를 모델링하세요. 작은 VPS에서 갑작스러운 트래픽 급증은 S3 egress가 예상치 못한 비용이 되어 재설계를 강요할 수 있습니다.

Latency & geography

  • VPS가 AWS 리전 근처에 있으면 S3 지연 시간이 예측 가능합니다.
  • 전 세계에 분산된 사용자에게는 두 서비스 중 어느 쪽이든 앞에 CDN을 두는 것이 순수 버킷 지연 시간보다 더 중요할 때가 많습니다.
  • R2는 Cloudflare 엣지에 더 가깝게 위치해 있어, 이미 Cloudflare의 CDN/DNS를 사용하고 있다면 자연스러운 선택이 됩니다.

기능 비교

기능Amazon S3Cloudflare R2
내구성 및 생태계 성숙도✔️ 뛰어난 내구성, 방대한 생태계✔️ 좋은 내구성, 성장 중인 생태계
데이터 전송 요금GB당 요금 부과 (비용이 많이 들 수 있음)많은 경우에 무료
요청 요금요청당 요금 부과요청당 요금 부과 (대체로 비슷함)
IAM 및 정책 도구성숙하고 세밀함단순하며 아직 진화 중
수명 주기 관리다양한 옵션(전환, 만료)기본 수명 주기 규칙
광범위한 통합백업, CI/CD, 데이터 플랫폼, 다수의 서드파티 도구많은 S3 인식 도구와 호환되지만 네이티브 통합은 적음
S3 호환성네이티브대부분의 작업에 대해 S3 호환 (대다수 SDK 호출 작동)
엣지 케이스 동작전체 AWS 기능 세트고급 IAM이나 특정 AWS 통합에서는 차이가 있을 수 있음

팁: 엣지 케이스 S3 동작에 의존한다면, 커밋하기 전에 R2에서 툴체인을 테스트하세요.

최소 Node.js 예제 (AWS SDK v3)

import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import fs from "node:fs";

const client = new S3Client({
  region: "auto",
  endpoint: process.env.R2_ENDPOINT, // e.g. https://.r2.cloudflarestorage.com
  credentials: {
    accessKeyId: process.env.R2_ACCESS_KEY_ID,
    secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
  },
});

async function upload() {
  const Body = fs.createReadStream("./avatar.png");
  const cmd = new PutObjectCommand({
    Bucket: process.env.R2_BUCKET,
    Key: "uploads/avatar.png",
    Body,
    ContentType: "image/png",
  });

  await client.send(cmd);
  console.log("Uploaded");
}

upload().catch(console.error);

기존 도구로 객체를 업로드하고, 목록을 확인하며, 읽을 수 있다면 대부분의 마이그레이션은 재작성보다는 가격 결정이 됩니다.

Decision guide

  • Choose S3 if you’re deeply tied to AWS services, need the most mature IAM/policy surface, or want maximum “it just works” integration with third‑party tools.
  • Choose Cloudflare R2 if egress is a major risk, you serve lots of public content, or you want an S3‑like workflow without typical bandwidth penalties.

For lean VPS stacks (e.g., DigitalOcean droplets or Hetzner servers), R2 can keep bills predictable while still using familiar S3 tooling. If you already use Cloudflare for DNS/CDN, the operational simplicity is a nice bonus—but it shouldn’t be the sole reason for the switch.

의사결정 가이드

  • S3를 선택하세요: AWS 서비스에 깊이 연결돼 있거나 가장 성숙한 IAM/정책 인터페이스가 필요하고, 서드파티 도구와 “그대로 작동”하는 통합을 최대로 원할 때.
  • Cloudflare R2를 선택하세요: 데이터 전송 비용이 큰 위험 요소이거나, 다량의 공개 콘텐츠를 제공하고, 일반적인 대역폭 비용 없이 S3와 유사한 워크플로우를 원할 때.

경량 VPS 스택(예: DigitalOcean Droplet이나 Hetzner 서버)에서는 R2를 사용하면 익숙한 S3 도구를 그대로 활용하면서도 비용을 예측 가능하게 유지할 수 있습니다. 이미 Cloudflare를 DNS/CDN에 사용하고 있다면 운영상의 단순함이 큰 장점이 되지만, 이것만을 이유로 전환해서는 안 됩니다.

0 조회
Back to Blog

관련 글

더 보기 »