AICosmus

Where tech meets the everyday — AI, fintech, swimming, and cars.
Cloudflare R2 오브젝트 스토리지 개념도

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 8/16화: Cloudflare R2 스토리지 완전 가이드: S3 대체 0원 송신

이 글은 「Cloudflare 완전 정복」 시리즈 8회입니다. 지난 7화까지 WARP VPN과 DNS 필터링으로 개인 보안 스택을 완성했다면, 이번에는 홈랩 데이터를 클라우드에 안전하게 백업하고 미디어를 전 세계에 뿌릴 수 있는 저장소, Cloudflare R2를 다룹니다.

AWS S3 송신료의 함정, R2가 해결합니다

오브젝트 스토리지를 써본 분이라면 한 번쯤 청구서에 놀란 적이 있을 겁니다. AWS S3에 사진 100GB를 올려두고 블로그 트래픽이 몰리면, 저장 비용보다 송신(egress) 요금이 몇 배로 나오는 구조입니다. 1TB 다운로드 시 S3는 약 $90, Google Cloud Storage도 비슷합니다.

Cloudflare R2는 이 공식을 깹니다. 송신료(egress fee)가 영구적으로 0원입니다. 데이터를 얼마나 내려받든, 어느 리전에서 접근하든 추가 요금이 없습니다. S3 호환 API를 그대로 쓰기 때문에 기존 도구(rclone, boto3, AWS CLI)를 코드 한 줄 안 고치고 붙일 수 있습니다.

클라우드 스토리지 송신료 비교표

R2 무료 한도 — 개인 홈랩이라면 충분

R2의 무료 티어는 개인 사용자에게 상당히 넉넉합니다.

  • 스토리지: 10GB (매월 갱신 아님, 상시 유지)
  • Class A 작업(PUT·POST·LIST 등): 월 100만 회
  • Class B 작업(GET·HEAD 등): 월 1,000만 회
  • 송신(egress): 무제한 무료

Synology NAS의 사진 백업, 블로그 이미지 호스팅, 소규모 데이터셋 공유 정도라면 무료 한도 안에서 운영할 수 있습니다. 10GB를 초과해도 1GB당 월 $0.015로, 100GB를 써도 월 $1.35에 불과합니다.

실습: R2 버킷 생성부터 파일 업로드까지

1단계 — 대시보드에서 버킷 만들기

Cloudflare 대시보드 → R2 Object StorageCreate bucket을 클릭합니다. 버킷 이름은 DNS 호환 형식(소문자, 하이픈 허용)으로 짓습니다. 위치는 Automatic을 선택하면 접속자 위치에 따라 Cloudflare가 최적 리전을 배정합니다. 아시아 고정이 필요하면 Asia-Pacific (APAC)을 선택하세요.

2단계 — API 토큰 발급

R2 대시보드 → Manage R2 API TokensCreate API token에서 해당 버킷에 대해 Object Read & Write 권한을 부여합니다. 생성 후 표시되는 Access Key IDSecret Access Key를 안전한 곳에 복사해 둡니다.

3단계 — rclone으로 NAS 백업 연결

Synology NAS에 SSH로 접속한 뒤 rclone을 설정합니다.

# Synology NAS SSH 세션에서 실행
# rclone이 없다면: curl https://rclone.org/install.sh | sudo bash

# R2 리모트 설정
rclone config create r2-backup s3 \
  provider=Cloudflare \
  access_key_id=YOUR_R2_ACCESS_KEY_ID \
  secret_access_key=YOUR_R2_SECRET_ACCESS_KEY \
  endpoint=https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com \
  acl=private

# 테스트: 버킷 목록 확인
rclone lsd r2-backup:

# NAS 사진 폴더를 R2 버킷으로 동기화
rclone sync /volume1/photo r2-backup:my-nas-backup/photo \
  --transfers=8 \
  --checkers=16 \
  --progress

YOUR_ACCOUNT_ID는 Cloudflare 대시보드 우측 사이드바의 Account ID 값입니다. rclone sync는 변경분만 전송하므로 매일 크론잡으로 돌리면 증분 백업이 완성됩니다.

4단계 — 크론잡으로 자동 백업 설정

# Synology NAS: DSM 제어판 → 작업 스케줄러 또는 직접 crontab
# 매일 새벽 3시 실행 예시
echo "0 3 * * * rclone sync /volume1/photo r2-backup:my-nas-backup/photo --transfers=8 --log-file=/var/log/r2-backup.log --log-level=NOTICE" | crontab -
NAS에서 R2로 자동 백업 구성도

커스텀 도메인으로 미디어 서빙하기

R2 버킷의 파일을 공개 URL로 서빙하려면 Public Access를 활성화합니다. R2 버킷 설정 → SettingsPublic access에서 커스텀 도메인(예: cdn.example.com)을 연결하면, Cloudflare CDN 캐시를 자동으로 타게 됩니다.

  • 블로그 이미지: https://cdn.example.com/blog/2026/06/cover.webp
  • 다운로드 파일: https://cdn.example.com/releases/app-v2.zip
  • 데이터셋 공유: https://cdn.example.com/datasets/korean-nlp-v3.parquet

5화에서 설정한 Cloudflare Tunnel과 조합하면, NAS에서 R2로 백업한 뒤 커스텀 도메인으로 전 세계에 서빙하는 구조가 완성됩니다. 송신료 걱정 없이요.

S3 호환 — 기존 코드 그대로 마이그레이션

R2는 S3 API와 호환되므로, Python boto3나 AWS CLI도 엔드포인트만 바꾸면 동작합니다.

# AWS CLI로 R2 사용 (프로필 설정)
aws configure --profile r2
# Access Key / Secret Key 입력 후:

# 파일 업로드
aws s3 cp ./backup.tar.gz s3://my-nas-backup/backup.tar.gz \
  --endpoint-url https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com \
  --profile r2

# 버킷 내 파일 목록
aws s3 ls s3://my-nas-backup/ \
  --endpoint-url https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com \
  --profile r2

Terraform, Pulumi 등 IaC 도구의 S3 프로바이더도 엔드포인트 오버라이드로 R2에 연결됩니다. 기존 S3 워크플로를 그대로 가져올 수 있다는 점이 R2의 가장 큰 실용적 장점입니다.

S3에서 R2로 마이그레이션 흐름

실전 활용 시나리오 3가지

시나리오 1: NAS 3-2-1 백업의 오프사이트 사본

NAS 로컬(1) + 외장 HDD(2) + R2 클라우드(3)로 3-2-1 백업 룰을 완성합니다. rclone의 --backup-dir 옵션을 쓰면 삭제·덮어쓰기된 파일도 별도 폴더에 보존됩니다.

시나리오 2: 블로그·포트폴리오 이미지 CDN

4화에서 배포한 Cloudflare Pages 사이트의 이미지를 R2에 호스팅하면, 빌드 크기를 줄이면서 CDN 캐시 히트율을 극대화할 수 있습니다.

시나리오 3: AI 학습 데이터셋 배포

수 GB짜리 데이터셋을 R2에 올리고 공개 URL로 공유하면 다운로드하는 사람이 아무리 많아도 송신료가 0원입니다. Hugging Face datasets 라이브러리도 HTTP URL을 직접 지원하므로 궁합이 좋습니다.

월 비용 명세표

항목 무료 한도 초과 시 단가 개인 홈랩 예상(50GB 기준)
스토리지 10GB $0.015/GB·월 $0.60/월
Class A 작업 (PUT 등) 100만 회/월 $4.50/100만 회 $0 (한도 이내)
Class B 작업 (GET 등) 1,000만 회/월 $0.36/100만 회 $0 (한도 이내)
송신(egress) 무제한 무료 $0 $0
월 합계 (50GB) 약 $0.60 (~₩830)

비교: AWS S3 같은 조건에서 송신 100GB 발생 시 약 $10 이상. R2는 송신이 아무리 커도 스토리지 비용만 내면 됩니다.

주의할 점 몇 가지

  • 버전 관리: R2도 객체 버저닝을 지원하지만, 버전마다 스토리지를 소비하므로 수명 주기 규칙(Lifecycle Rules)으로 오래된 버전을 자동 삭제하세요.
  • 멀티파트 업로드: 100MB 이상 파일은 멀티파트 업로드를 권장합니다. rclone은 기본으로 처리하지만, 직접 API를 쓸 때는 파트 크기를 지정해야 합니다.
  • 공개 버킷 보안: Public Access를 켜면 URL을 아는 누구나 파일에 접근합니다. 민감 파일은 반드시 프라이빗으로 유지하고, 필요시 Workers로 인증 레이어를 추가하세요(9화에서 다룹니다).
  • 리전 선택: Automatic이 대부분 최적이지만, 데이터 주권(data residency) 요건이 있다면 특정 리전을 고정하세요.

정리 — 홈랩 스토리지의 마지막 퍼즐

5화 Tunnel로 NAS를 외부에 공개하고, 6화 Zero Trust로 접근을 통제하고, 7화 WARP로 이동 중에도 안전하게 연결했습니다. 이번 8화 R2로 데이터의 오프사이트 백업과 글로벌 서빙까지 갖추면서, Phase 2 「홈랩·자가호스팅」 편이 마무리됩니다.

R2의 진짜 힘은 다른 Cloudflare 서비스와 결합할 때 나옵니다. Workers에서 R2를 바인딩하면 서버리스 함수가 스토리지를 직접 읽고 쓸 수 있고, D1 데이터베이스와 조합하면 풀스택 앱이 완성됩니다.

다음 9화에서는 Phase 3의 포문을 열며, Cloudflare Workers — 서버 없이 코드를 전 세계 엣지에 배포하는 서버리스 컴퓨팅을 다룹니다. R2에 올린 파일을 Workers로 가공하는 실전 예제도 함께 준비하겠습니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 8화)
이전 7화  (다음 차수는 아직 게시되지 않았습니다)

One thought on “[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 8/16화: Cloudflare R2 스토리지 완전 가이드: S3 대체 0원 송신

답글 남기기

Your email address will not be published. Required fields are marked *.

Warning: Undefined array key "cookies" in /var/www/html/wp-content/themes/personal-cv-resume/class/class-post-related.php on line 212
*
*

최신 댓글