Cloudflare에서 콘텐츠 에이전트를 운영하는 가장 저렴한 방법
Cloudflare Workers + Claude API에서 완전한 콘텐츠 생성 및 번역 파이프라인을 Sonnet 3.5로 게시물당 약 $0.50, Haiku로 약 $0.12에 운영할 수 있습니다. Cloudflare 무료 티어는 하루 10만 건의 요청을 처리합니다. 규모가 필요할 때만 비용이 발생합니다. 제약은 장시간 LLM 호출의 콜드 스타트 지연인데, Queues가 이를 해결합니다.
매주 수요일. 28,400명+ 구독자. 핵심만.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
목차
2026년 5월 업데이트.
TL;DR: Cloudflare Workers + Claude API에서 완전한 콘텐츠 생성 및 번역 파이프라인을 Sonnet 3.5로 게시물당 약 $0.50, Haiku로 약 $0.12에 운영할 수 있습니다. Cloudflare 무료 티어는 하루 10만 건의 요청을 처리합니다. 규모가 필요할 때만 비용이 발생합니다. 제약은 장시간 LLM 호출의 콜드 스타트 지연인데, Queues가 이를 해결합니다.
[운영자 시각] 저는 alejandrorioja.com에서 정확히 이 파이프라인을 운영합니다. TypeScript Worker 하나가 게시물을 작성하고, 12개의 번역 작업을 분배하며, 모든 것을 KV에 저장합니다. 모두 단일 HTTP 호출로 시작됩니다. 비용과 구성 방식을 정확히 공개합니다.
AWS나 Vercel이 아닌 Cloudflare를 선택하는 이유
AWS Lambda는 GB-초 단위로 과금합니다. Vercel은 실행당 과금하고 Hobby 티어에서 엄격한 속도 제한이 있습니다. 둘 다 규모에서 콜드 스타트 예측 불가능성을 추가합니다.
Cloudflare Workers는 컨테이너가 아닌 V8 아이솔레이트에서 실행됩니다. 콜드 스타트는 밀리초 미만입니다. 무료 티어는 실용적입니다: 하루 100,000 요청, 요청당 CPU 시간 10ms (실제 벽시계 시간은 더 깁니다). 유료 플랜은 1,000만 요청에 월 $5입니다.
AI 콘텐츠 파이프라인의 경우 Workers 계산 비용은 거의 0에 가깝습니다. 실제 비용은 Claude API입니다. 최적화해야 할 변수는 그것뿐입니다.
아키텍처 (텍스트 다이어그램)
HTTP 트리거 (cron 또는 webhook)
│
▼
Worker: 오케스트레이터
│
├─ KV에 작업 메타데이터 작성 (상태: "pending")
│
└─ EN 생성 작업 1개를 큐에 추가
│
▼
큐: content-jobs
│
┌──────┴──────┐
▼ ▼
Worker: 작성자 Worker: 번역자 (×12 로케일)
│ │
▼ ▼
Claude API Claude API
│ │
└──────┬─────────────┘
▼
KV: posts/{slug}/{locale}
│
▼
Webhook → GitHub → 배포오케스트레이터 Worker가 진입점입니다. KV에 초기 상태 레코드를 작성하고 Cloudflare Queue에 작업을 푸시합니다. Queue 팬아웃이 작성자 Worker(EN)를 시작하고, EN 본문이 준비되면 12개의 번역자 Worker를 병렬로 실행합니다. 모든 것이 {slug}/{locale} 키로 KV에 저장됩니다. 최종 webhook이 GitHub Actions 배포를 트리거합니다.
Cloudflare 비용 표
| 리소스 | 무료 티어 | 유료 ($5/월) | 실제 사용량 |
|---|---|---|---|
| Workers 요청 수 | 10만/일 | 1,000만/월 | ~500/일 |
| Workers CPU 시간 | 10ms/요청 | 30s/요청 | ~8ms/요청 |
| KV 읽기 | 10만/일 | 1,000만/월 | ~2K/일 |
| KV 쓰기 | 1K/일 | 100만/월 | ~300/일 |
| Queue 메시지 | — | 100만/월 (포함) | ~300/월 |
| KV 스토리지 | 1 GB | 1 GB (포함) | ~200 MB |
월 10개의 게시물을 발행하는 사이트의 경우 Cloudflare 청구서는 무료 티어에서 $0입니다. Workers는 무료입니다. 해당 볼륨에서 KV 읽기/쓰기도 무료입니다. 제가 사용하는 유일한 유료 기능은 Queues로, Workers Paid 플랜 월 $5가 필요하지만 해당 플랜에 100만 건의 큐 메시지가 포함됩니다.
내 Cloudflare 청구서: 월 5달러 고정, 게시물 볼륨과 무관하게 월 ~3,000개 게시물까지.
Claude API 비용 표
여기에 실제 비용이 집중됩니다. 게시물당 세부 분석.
EN 생성 (게시물 1개, 약 1,500단어):
| 모델 | 입력 토큰 | 출력 토큰 | 비용 |
|---|---|---|---|
| Claude Haiku 3.5 | ~2,000 | ~2,500 | $0.005 |
| Claude Sonnet 3.5 | ~2,000 | ~2,500 | $0.042 |
12개 번역 (각 약 1,500단어):
| 모델 | 입력 토큰 (×12) | 출력 토큰 (×12) | 비용 |
|---|---|---|---|
| Claude Haiku 3.5 | ~24,000 | ~30,000 | $0.054 |
| Claude Sonnet 3.5 | ~24,000 | ~30,000 | $0.500 |
게시물당 합계 (EN + 12개 번역):
| 모델 | 총 비용 |
|---|---|
| Claude Haiku 3.5 | ~$0.059 |
| Claude Sonnet 3.5 | ~$0.542 |
EN 생성에는 Sonnet을 사용하고 (정규 게시물의 품질이 중요), 번역에는 Haiku를 사용합니다 (원본 텍스트가 이미 작성되어 있으므로 모델은 충실히 번역만 하면 됩니다). 이 혼합 접근법은 실제로 게시물당 약 $0.10의 비용이 발생합니다.
TypeScript Worker: 오케스트레이터
// src/workers/orchestrator.ts
import { Queue } from "@cloudflare/workers-types";
interface Env {
CONTENT_QUEUE: Queue;
POSTS_KV: KVNamespace;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { slug, topic } = await request.json<{ slug: string; topic: string }>();
// 초기 상태 작성
await env.POSTS_KV.put(
`status:${slug}`,
JSON.stringify({ status: "pending", createdAt: Date.now() })
);
// EN 생성 작업을 큐에 추가
await env.CONTENT_QUEUE.send({
type: "generate",
slug,
topic,
locale: "en",
});
return Response.json({ queued: true, slug });
},
};TypeScript Worker: 작성자 + 번역자
// src/workers/content-processor.ts
interface Env {
CONTENT_QUEUE: Queue;
POSTS_KV: KVNamespace;
ANTHROPIC_API_KEY: string;
}
const LOCALES = ["ar","de","es","fr","hi","it","ja","ko","nl","pt","ru","zh"];
export default {
async queue(batch: MessageBatch<ContentJob>, env: Env): Promise<void> {
for (const msg of batch.messages) {
const job = msg.body;
if (job.type === "generate") {
const post = await generatePost(job.topic, env.ANTHROPIC_API_KEY);
await env.POSTS_KV.put(`post:${job.slug}:en`, post);
// 번역 작업 분배
for (const locale of LOCALES) {
await env.CONTENT_QUEUE.send({
type: "translate",
slug: job.slug,
locale,
sourceText: post,
});
}
}
if (job.type === "translate") {
const translated = await translatePost(
job.sourceText,
job.locale,
env.ANTHROPIC_API_KEY,
// 비용 절감을 위해 번역에 Haiku 사용
"claude-haiku-3-5-20241022"
);
await env.POSTS_KV.put(`post:${job.slug}:${job.locale}`, translated);
}
msg.ack();
}
},
};
async function generatePost(topic: string, apiKey: string): Promise<string> {
const res = await fetch("https://api.anthropic.com/v1/messages", {
method: "POST",
headers: {
"x-api-key": apiKey,
"anthropic-version": "2023-06-01",
"content-type": "application/json",
},
body: JSON.stringify({
model: "claude-sonnet-3-5-20241022",
max_tokens: 4096,
messages: [{ role: "user", content: `Write a detailed blog post about: ${topic}` }],
}),
});
const data = await res.json<{ content: Array<{ text: string }> }>();
return data.content[0].text;
}
async function translatePost(
text: string,
locale: string,
apiKey: string,
model: string
): Promise<string> {
const res = await fetch("https://api.anthropic.com/v1/messages", {
method: "POST",
headers: {
"x-api-key": apiKey,
"anthropic-version": "2023-06-01",
"content-type": "application/json",
},
body: JSON.stringify({
model,
max_tokens: 4096,
messages: [
{
role: "user",
content: `Translate the following blog post to ${locale}. Preserve all markdown. Keep code blocks in English.\n\n${text}`,
},
],
}),
});
const data = await res.json<{ content: Array<{ text: string }> }>();
return data.content[0].text;
}대안 비교
| 플랫폼 | 기본 비용 | 요청당 비용 | 콜드 스타트 | TypeScript DX |
|---|---|---|---|---|
| Cloudflare Workers | $0–$5/월 | 거의 0 | 밀리초 미만 | 우수 |
| AWS Lambda | $0 (제한) | $0.20/100만 요청 | 100ms–1s | 양호 |
| Vercel Functions | $0 (제한) | 사용량 기반 | 200ms–2s | 양호 |
| 자체 호스팅 VPS | $5–$20/월 | $0 | 없음 (항상 실행) | 자유 |
| Fly.io Machines | $0 (제한) | GB-초당 | ~500ms | 양호 |
자체 호스팅은 Cloudflare가 지는 유일한 경우입니다. 월 $6 Hetzner VPS는 콜드 스타트 없이, 요청당 비용 없이 Node를 24/7 실행합니다. 하지만 배포, 가동 시간, 스케일링을 직접 관리해야 합니다. 제 사용량에서는 Workers가 이 모든 것을 무료로 처리합니다.
AWS Lambda 비교는 종이에서 경쟁력 있어 보이지만, Lambda의 최대 실행 시간 15분은 긴 LLM 체인에 실제 제약입니다. Workers는 유료 플랜에서 CPU 제한이 30초인데, 더 나빠 보이지만 Queues를 비동기 작업에 사용하기 때문에 단일 Lambda를 블로킹하지 않는 한 문제 없습니다.
상태 관리를 위한 KV
KV는 Cloudflare의 전 세계 분산 키-값 저장소입니다. 읽기는 어디서나 빠릅니다 (엣지 캐시). 쓰기는 60초 이내에 전 세계로 전파됩니다.
콘텐츠 파이프라인에서 세 가지 키 패턴을 사용합니다:
// 작업 상태
await kv.put(`status:${slug}`, JSON.stringify({ status, updatedAt: Date.now() }));
// 게시물 콘텐츠
await kv.put(`post:${slug}:${locale}`, markdownContent);
// 목록을 위한 인덱스
const index = await kv.get<string[]>("index:posts", "json") ?? [];
await kv.put("index:posts", JSON.stringify([...index, slug]));제 규모에서 KV 비용: $0. 무료 티어는 하루 1K 쓰기와 10만 읽기를 제공합니다. 월 약 300개의 KV 항목을 씁니다 (25개 게시물 × 13개 로케일 = 325개). 한도와는 거리가 멉니다.
12개 언어로 월 100개 이상의 게시물을 발행하면 월 ~39,000건의 쓰기에 도달하겠지만, 여전히 $5 유료 플랜에 포함된 월 100만 건 미만입니다.
운영자의 최종 결론
전체 콘텐츠 파이프라인 - 생성, 번역, 저장, 배포 - 의 인프라 비용은 월 $5.10입니다 ($5 Cloudflare Workers Paid + 월 10개 게시물 기준 Claude API $0.10). 그게 전부입니다. 관리할 서버 없음, 컨테이너 오케스트레이션 없음, 프로비저닝된 동시성 임계값에 도달하는 Lambda 콜드 스타트로 인한 예상치 못한 청구 없음.
혼합 모델 전략 (EN에 Sonnet, 번역에 Haiku)으로 번역 품질을 눈에 띄게 낮추지 않으면서 Claude 비용을 80% 줄일 수 있습니다. 자신의 볼륨으로 계산해 보면 Cloudflare + Claude Haiku가 창업자 규모에서 이런 파이프라인을 운영하는 가장 저렴한 방법임을 알게 될 것입니다.
매주 수요일. 28,400명+ 구독자. 핵심만.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
AI 플레이북을 받아보세요
매주 수요일. 28,400명+ 구독자. 핵심만.
Check your inbox.
We sent you a confirmation email — click the link inside to complete your subscription. Check spam if you don't see it within a minute.
You're subscribed.
Welcome — the next edition lands in your inbox soon.
You're already on the list — look for it every Wednesday.