Cloudflare Workers & R2 비용 최적화: 숨겨진 과금 피하는 실전 전략
안녕하세요, 13년차 서버실 지킴이입니다. 오늘은 많은 분들이 관심 가질 만한 주제, 바로 Cloudflare Workers & R2 비용 최적화에 대한 이야기를 풀어보려고 합니다. 클라우드를 쓰다 보면 예상치 못한 과금에 당황하는 경우가 종종 있잖아요? 저도 처음엔 Cloudflare의 매력적인 Free Tier에 혹해서 이것저것 써보다가, 나중에 대시보드를 보고 '어라? 이 비용은 어디서 나온 거지?' 하고 삽질 좀 했습니다. 특히 Cloudflare Workers(클라우드플레어 워커스, 서버리스 엣지 컴퓨팅 플랫폼)와 Cloudflare R2(클라우드플레어 R2, S3 호환 오브젝트 스토리지)는 정말 강력한 조합이지만, 그만큼 숨겨진 과금 포인트들이 있거든요. 오늘은 제가 직접 겪었던 경험을 바탕으로, 어떻게 하면 이 숨겨진 과금들을 피하고 Cloudflare 비용 최적화를 할 수 있는지 실전 전략을 공유해 드릴게요.
Cloudflare Workers와 R2를 사용한 기본적인 데이터 흐름 아키텍처 다이어그램. 사용자의 요청이 Workers를 통해 R2에 저장된 데이터를 가져오거나 처리하는 과정을 보여줍니다.
Cloudflare Workers와 R2: 핵심 개념 이해하기
먼저, Cloudflare Workers와 R2가 무엇인지 간단하게 짚고 넘어갈게요. 이미 잘 아시는 분들도 계시겠지만, 비용 최적화의 기본은 서비스의 작동 방식을 정확히 이해하는 거거든요.
- Cloudflare Workers (클라우드플레어 워커스): 쉽게 말해, 전 세계 Cloudflare 엣지 네트워크에 배포되는 서버리스 JavaScript/WebAssembly 환경이에요. 사용자의 요청에 가장 가까운 엣지에서 코드가 실행되니 응답 속도가 빠르고, 서버 관리 부담이 없어서 정말 편합니다. Free Tier도 넉넉해서 개인 프로젝트나 소규모 서비스에 많이 쓰이죠.
- Cloudflare R2 (클라우드플레어 R2): Amazon S3(아마존 S3)와 호환되는 오브젝트 스토리지 서비스입니다. 가장 큰 특징은 바로 이그레스(Egress, 외부로 나가는 데이터 전송) 비용이 무료라는 점이에요! 이게 진짜 혁명적이거든요. 다른 클라우드 스토리지 서비스들은 데이터가 나갈 때마다 비용을 청구해서, 트래픽이 많아지면 배보다 배꼽이 커지는 경우가 많았거든요.
이 두 서비스는 조합하면 정적 파일 호스팅, API 게이트웨이, 이미지 리사이징 등 다양한 작업을 엣지에서 효율적으로 처리할 수 있습니다. 하지만 이 매력적인 무료 정책 뒤에는 몇 가지 주의해야 할 과금 포인트들이 숨어있어요.
실전 구현: Workers로 R2 데이터 서빙하기
제가 자주 사용하는 시나리오 중 하나는 Workers를 통해 R2에 저장된 정적 파일(이미지, 비디오 등)을 서빙하거나, 간단한 API 게이트웨이 역할을 하는 것입니다. 한번 기본적인 구현 과정을 살펴볼까요?
1. R2 버킷 생성
먼저 Cloudflare 대시보드에서 R2 버킷을 생성합니다. 버킷 이름은 고유해야 해요.
2. Workers 프로젝트 생성 및 R2 바인딩
<code>wrangler CLI(명령줄 인터페이스)를 사용해서 Workers 프로젝트를 만들고, R2 버킷을 바인딩해줍니다. 이 과정이 제일 중요해요.
npx wrangler generate my-r2-worker --ts
cd my-r2-worker
wrangler.toml 파일을 열어서 R2 바인딩을 추가합니다. bucket_name은 여러분이 생성한 R2 버킷 이름으로 바꿔주세요.
name = "my-r2-worker"
main = "src/index.ts"
compatibility_date = "2023-10-26"
[[r2_buckets]]
binding = "MY_BUCKET" # Workers 코드에서 사용할 변수 이름
bucket_name = "my-awesome-r2-bucket" # 실제 R2 버킷 이름
3. Workers 코드 작성: R2 데이터 반환
src/index.ts 파일에서 R2 버킷에서 파일을 읽어 반환하는 코드를 작성합니다. 여기서는 간단하게 모든 요청에 대해 index.html 파일을 반환한다고 가정해볼게요.
interface Env {
MY_BUCKET: R2Bucket;
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
const url = new URL(request.url);
const key = url.pathname.slice(1) || 'index.html'; // 요청 경로를 R2 객체 키로 사용
const object = await env.MY_BUCKET.get(key);
if (object === null) {
return new Response('File Not Found', { status: 404 });
}
const headers = new Headers();
object.writeHttpMetadata(headers);
headers.set('etag', object.httpEtag);
// R2 객체 스트림을 직접 반환하여 Workers Egress 비용 최적화
return new Response(object.body, {
headers,
});
},
};
여기서 중요한 포인트가 하나 있습니다. return new Response(object.body, { headers }); 이 부분인데요. R2에서 읽어온 object.body 스트림을 Workers가 직접 클라이언트로 전달하도록 하는 것이 중요합니다. 이렇게 하면 Workers가 데이터를 내부적으로 처리하는 시간을 최소화하고, R2 Egress Free 정책의 혜택을 최대한 받을 수 있어요. 만약 Workers가 이 데이터를 가공하거나 다른 곳으로 전달한다면, Workers Data Egress(워커스 데이터 이그레스) 비용으로 과금될 수 있거든요. 저도 처음엔 이 부분을 간과해서 예상치 못한 과금이 발생했었습니다 😅.
Cloudflare 대시보드에서 Workers 서비스에 R2 버킷이 올바르게 바인딩된 설정 화면을 보여줍니다.
⚠️ 숨겨진 과금 포인트와 실전 최적화 전략
이제 본격적으로 숨겨진 과금 포인트를 파헤쳐보고, 제가 직접 겪은 삽질 경험을 바탕으로 한 Cloudflare 비용 최적화 전략을 공유해 드릴게요.
1. Workers Compute Duration(워커스 컴퓨트 듀레이션) 과금 최소화
Workers는 코드가 실행되는 시간에 따라 과금되죠. Free Tier는 하루에 10만 건의 요청과 1,000,000ms(1초)의 CPU 시간이 주어지지만, 이를 초과하면 과금됩니다.
- 불필요한 작업 줄이기: Workers 내부에서 복잡한 연산, 외부 API 호출 대기 시간 등을 최소화해야 합니다. 특히 R2에서 데이터를 읽어오는 동안 Workers가 대기하는 시간도 Compute Duration에 포함될 수 있거든요.
- 스트리밍 활용: 위 코드 예시처럼 R2의
object.body를 직접Response로 반환하면, Workers가 모든 데이터를 메모리에 로드할 필요 없이 스트리밍으로 처리하여 Compute Duration을 줄일 수 있어요. - Durable Objects(듀러블 오브젝트) 사용 주의: Durable Objects는 상태 저장형 Workers로 매우 강력하지만, 일반 Workers보다 과금 기준이 복잡하고 비쌀 수 있습니다. 꼭 필요한 경우에만 사용하고, 사용 패턴을 면밀히 분석해야 해요.
2. R2 API Requests(R2 API 요청) 최적화
R2는 스토리지 용량 외에도 API 요청 횟수에 따라 과금됩니다. 특히 Class A(쓰기 작업) 요청이 Class B(읽기 작업) 요청보다 비싸죠.
- 캐싱 전략: Workers에서 R2 데이터를 읽어올 때, Cloudflare의 Cache API(캐시 API)를 적극 활용하세요. 자주 접근하는 데이터는 엣지 캐시에 저장하여 R2 API 호출 횟수를 줄일 수 있어요. 예를 들어, 이미지 파일 같은 정적 콘텐츠는 Cache API와 함께
Cache-Control헤더를 잘 설정하면 R2 요청을 확 줄일 수 있습니다. - Batch 작업: 여러 객체를 한 번에 처리해야 한다면, Batch API를 사용하여 요청 횟수를 줄일 수 있는지 고려해보세요.
3. 데이터 이그레스(Data Egress) 착시 효과 방지
⚠️ R2는 Egress Free가 맞지만, Workers의 Egress는 별도 과금됩니다. 제가 가장 크게 삽질했던 부분이 바로 여기인데요.
- Workers Data Egress: Workers가 R2에서 데이터를 읽어서 클라이언트에게 전달할 때, 이 데이터는 R2의 Egress가 아닌 Workers의 Data Egress로 계산됩니다. 하지만 위에서 설명한
return new Response(object.body, { headers });방식처럼 R2의 스트림을 그대로 전달하면, Cloudflare는 이를 R2 Egress로 간주하여 무료 혜택을 적용해줍니다. 즉, Workers가 R2 데이터를 "거의 가공 없이" 프록시처럼 전달할 때만 R2의 Egress Free 혜택을 받는다고 생각하는 게 좋아요. 만약 Workers가 R2 데이터를 읽어서 이미지 리사이징을 하거나, JSON 형태로 가공해서 보내면, 그건 Workers Data Egress로 과금될 수 있거든요. 이 부분은 공식 문서도 좀 헷갈리게 되어 있어서, 저처럼 삽질하는 분들이 많더라고요. - Cloudflare CDN(콘텐츠 전송 네트워크) 활용: R2에 직접 도메인을 연결하고 Cloudflare CDN을 사용하면, R2 Egress Free 혜택을 온전히 누릴 수 있습니다. Workers는 복잡한 로직이 필요할 때만 사용하고, 단순 정적 파일 서빙은 R2 + CDN 조합이 비용 효율적이에요.
4. 로그 분석으로 비용 낭비 요소 찾기
Cloudflare Workers는 요청 로그를 제공합니다. 이를 통해 어떤 요청이 Compute Duration을 많이 소모하는지, 어떤 Workers가 비정상적으로 많이 호출되는지 등을 파악할 수 있어요. 저도 주기적으로 로그를 보면서 최적화 포인트를 찾아냅니다.
Cloudflare 대시보드에서 Workers의 Compute Duration, Requests, R2 스토리지 및 API 요청 수 등 자세한 비용 분석 데이터를 보여주는 화면입니다.
검증 및 결과: 비용 모니터링의 중요성
최적화 전략을 적용했다면, 이제 그 효과를 검증할 차례입니다. Cloudflare 대시보드의 Analytics(분석) 섹션과 Billing(청구) 섹션을 주기적으로 확인하는 것이 중요해요.
- Workers Analytics: Workers의 요청 수, CPU 시간, 오류율 등을 자세히 볼 수 있습니다. 여기서 비정상적인 패턴이나 높은 CPU 시간을 소모하는 Workers를 찾아내 개선할 수 있어요.
- R2 Analytics: R2의 스토리지 사용량, Class A/B API 요청 수, 데이터 전송량 등을 확인할 수 있습니다. 특히 API 요청 수가 예상보다 높다면 캐싱 전략을 다시 점검해야 합니다.
- Billing Page: 마지막으로 청구 페이지에서 실제 과금 내역을 확인합니다. 과금 항목별로 상세 내역을 볼 수 있으니, 어떤 서비스에서 비용이 발생했는지 정확히 파악하고 다음 최적화 계획을 세울 수 있어요.
저도 처음에는 대시보드 보는 법도 익숙지 않아서 헤맸는데, 몇 번 해보니 금방 적응되더라고요. 실제 비용이 줄어드는 걸 보면 그렇게 뿌듯할 수가 없습니다 🎉.
Cloudflare Workers 및 R2 비용 절감을 위한 핵심 전략들을 시각적으로 요약한 인포그래픽. 캐싱, 스트리밍, 로깅, 모니터링 등의 키워드와 간략한 설명을 포함합니다.
마무리하며: 지속적인 관심이 최고의 비용 절감 전략
오늘은 Cloudflare Workers와 R2를 사용하면서 제가 직접 겪었던 Cloudflare 비용 최적화 경험과 실전 전략들을 공유해 드렸습니다. 핵심은 서비스의 과금 방식을 정확히 이해하고, 불필요한 자원 소모를 최소화하며, 지속적으로 모니터링하는 것입니다.
Cloudflare는 정말 매력적인 서비스들을 많이 제공하지만, 클라우드 서비스가 다 그렇듯 '무료'라는 말에 혹해서 무작정 사용하다 보면 예상치 못한 비용 폭탄을 맞을 수도 있어요. 하지만 오늘 알려드린 전략들을 잘 활용하시면, Cloudflare Workers와 R2의 강력한 성능과 R2의 Egress Free라는 엄청난 장점을 비용 걱정 없이 누릴 수 있을 겁니다.
저도 여전히 새로운 기술들을 실험하고 삽질하면서 배우고 있습니다. 여러분도 저의 경험을 발판 삼아 더 효율적인 인프라를 구축하시길 바랍니다! 다음번에는 Cloudflare의 다른 서비스, 예를 들어 KV(Key-Value Store)나 Durable Objects를 활용할 때의 비용 고려 사항에 대해 이야기해볼까 합니다. 그때까지 다들 즐거운 삽질(?) 되세요!
'IT > Cloud' 카테고리의 다른 글
| [Cloud] GitLab CI/CD, 월 300달러 린트 비용 낭비 막는 법 (1) | 2026.05.27 |
|---|---|
| [Cloud] 기존 인프라를 Pulumi로 전환하기: 마이그레이션 전략 및 체크리스트 (0) | 2026.05.24 |
| [Cloud] Jenkins 빌드 실패 디버깅: 흔한 문제와 해결 전략 5가지 (0) | 2026.05.24 |
| [Cloud] GitHub Actions 비용 폭탄 방지: 불필요한 과금 줄이는 실전 전략 (1) | 2026.05.22 |
| [Cloud] Cloudflare Zero Trust 구축: VPN 대체 및 보안 강화 실전 가이드 (1) | 2026.05.20 |
| [Cloud] Terraform vs Pulumi: IaC 도구 비교 및 선택 가이드 (0) | 2026.05.19 |