AWS Lambda에서 Cloudflare Workers로 마이그레이션: 서버리스 이그레스 비용 95% 절감기

서버리스(Serverless) 아키텍처를 채택한 초기 서비스가 성장할 때, 청구서에서 가장 먼저 눈에 띄는 폭탄 항목은 바로 **데이터 전송 요금(Egress Fee)**이다. 컴퓨팅 파워나 요청 횟수는 예측 가능한 범위 내에서 청구되지만, API 응답 데이터를 사용자에게 전송할 때 발생하는 이그레스 비용은 트래픽이 조금만 몰려도 기하급수적으로 폭증한다.
AWS Lambda와 API Gateway 조합을 사용하던 당사 서비스는 월간 데이터 전송량이 5TB를 돌파하면서 한 달 서버리스 청구액의 75% 이상이 오직 네트워크 Outbound 비용으로 나가는 상황에 직면했다. 이에 따라 Edge Computing 기반인 Cloudflare Workers로 마이그레이션을 단행하였고, 결과적으로 이그레스 비용을 95% 이상 절감하는 동시에 평균 콜드 스타트(Cold Start) 대기시간을 80% 줄이는 성과를 거두었다.
이 글에서는 AWS Lambda에서 Cloudflare Workers로 전환하는 구조적 이유, 요금 비교 체계, Node.js 기반 핸들러 코드의 V8 Isolate 리팩토링 기법, 그리고 데이터베이스 커넥션 병목 해결 방안을 상세히 공유한다.
핵심 요약
- 이그레스 비용 제로(Zero Egress): AWS는 인터넷 outbound 데이터에 GB당 $0.09를 과금하지만, Cloudflare Workers는 Worker 응답 데이터 전송에 대한 이그레스 비용이 $0이다.
- 콜드 스타트 혁신: AWS Lambda는 VPC 연동 및 실행 환경 생성으로 200ms~800ms의 콜드 스타트가 존재하나, V8 Isolate 기반의 Cloudflare Workers는 5ms 미만으로 시작된다.
- 아키텍처 전환 수칙: Node.js 전용 모듈(
fs,net등)에 의존하던 핸들러를 Fetch API 및 Web Standard API 기반(또는 Hono 프레임워크)으로 전환해야 한다.- DB 커넥션 처리: PostgreSQL/MySQL 연동 시 서버리스 커넥션 풀링 서비스(Cloudflare Hyperdrive, Supabase, Neon 등)를 경유하도록 구성해야 라인 타임아웃을 방지할 수 있다.
1. 마이그레이션 배경: AWS의 숨은 복병, Egress 비용
AWS 환경에서 Lambda 함수를 외부 HTTP API로 노출하려면 필수적으로 Amazon API Gateway 또는 **Application Load Balancer(ALB)**를 앞단에 붙이게 된다. 이때 발생하는 요금 구조는 세 가지로 나뉜다.
- Lambda 컴퓨팅 비용: Memory(GB) × 실행시간(초) + 요청 건수
- API Gateway 요청 비용: REST API 기준 100만 건당 $3.50, HTTP API 기준 $1.00
- AWS Data Transfer Out (Egress): 인터넷으로 나가는 데이터 GB당 $0.09 (리전별 차이 존재)
문제는 이미지 바이너리, JSON 페이로드, API 응답 데이터가 커질수록 3번 Egress 비용이 다른 모든 서버리스 컴퓨팅 요금을 압도한다는 점이다.
5TB/월 Egress 트래픽 청구액 실측 비교
아래 표는 월간 요청 1,000만 건, 평균 응답 크기 500KB (총 5TB Egress) 기준의 두 플랫폼 실제 청구액 산출 결과이다.
| 항목 | AWS (Lambda + API Gateway HTTP API) | Cloudflare Workers (Paid 플랜) | 절감율 |
|---|---|---|---|
| 기본 / 유효 플랜 | 월 기본료 없음 (요금제 종량제) | $5.00/월 (1,000만 요청 포함) | - |
| 요청 건수 비용 | $10.00 (1,000만 건 × $1/1M) | $0.00 (Paid 기본 1,000만 건 포함) | 100% |
| 컴퓨팅 / CPU 비용 | 약 $18.50 (256MB, 200ms 대기 기준) | $0.00 (CPU시간 1,000만ms 기본 포함) | 100% |
| 네트워크 Egress 비용 | $450.00 (5,000GB × $0.09) | $0.00 (응답 데이터 Egress 무료) | 100% |
| 총 월간 청구액 | $478.50 | $5.00 | 98.9% 절감 |
Cloudflare Workers Paid 플랜($5/월)은 1,000만 건의 인보케이션과 3,000만 ms의 CPU 실행 시간, 그리고 **무제한 응답 데이터 전송(Egress)**을 포함하므로, 데이터 전송량이 많은 서비스일수록 절감 효과가 폭발적이다.
2. 핸들러 코드 리팩토링: AWS Lambda → Cloudflare Workers
AWS Lambda는 AWS 전용 (event, context) 핸들러 구조를 사용하는 반면, Cloudflare Workers는 **W3C Web Standards (FetchEvent, Request, Response)**를 준수한다.
AWS Lambda 기존 코드 (Node.js)
// AWS Lambda (API Gateway HTTP API v2)
exports.handler = async (event) => {
const body = JSON.parse(event.body || '{}');
const userId = event.queryStringParameters?.userId;
// 비즈니스 로직 수행
const result = {
message: "Success",
userId: userId,
processedAt: new Date().toISOString()
};
return {
statusCode: 200,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify(result)
};
};
Cloudflare Workers 전환 코드 (ES Modules & Hono)
Cloudflare Workers에서는 Web Standard를 직접 사용하거나, 경량 웹 프레임워크인 Hono를 사용해 깔끔하게 라우팅을 구현할 수 있다.
// Cloudflare Worker (Hono Framework)
import { Hono } from 'hono';
import { cors } from 'hono/cors';
type Bindings = {
API_KEY: string;
DB_URL: string;
};
const app = new Hono<{ Bindings: Bindings }>();
// CORS 미들웨어 적용
app.use('*', cors());
app.post('/api/process', async (c) => {
const body = await c.req.json();
const userId = c.req.query('userId');
const apiKey = c.env.API_KEY; // 환경 변수 (Wrangler secret)
const result = {
message: "Success",
userId: userId,
processedAt: new Date().toISOString(),
workerRegion: c.req.raw.cf?.colo || 'UNKNOWN' // Cloudflare Edge 리전 정보
};
return c.json(result, 200);
});
export default app;
3. 데이터베이스 커넥션 문제와 해결책 (Hyperdrive)
Lambda에서 PostgreSQL/MySQL 같은 RDBMS에 직결할 때는 AWS RDS Proxy를 사용했으나, Cloudflare Workers는 세계 전역의 300여 개 에지 노드에서 실행되므로 DB 커넥션 수 폭발(Connection Exhaustion) 위험이 존재한다.
이를 해결하기 위한 대표적인 두 가지 접근법은 다음과 같다.
- Cloudflare Hyperdrive 사용: 에지 노드 가까이 커넥션 풀을 생성하고, SQL 쿼리를 캐싱하여 50ms 이상 걸리던 데이터베이스 응답 시간을 10ms 수준으로 단축한다.
- HTTP API 기반 데이터베이스 전환: Supabase Data API, Neon Serverless Driver, PlanetScale 등 HTTP REST/WebSocket 기반의 드라이버를 활용한다.
Cloudflare Hyperdrive 설정 예시
wrangler.toml 파일에 Hyperdrive 바인딩을 추가한다:
name = "api-worker"
main = "src/index.ts"
compatibility_date = "2026-07-01"
[hyperdrive]
binding = "HYPERDRIVE"
id = "your-hyperdrive-id"
Worker 코드 내에서 Hyperdrive 연결 사용:
import { Client } from 'pg';
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// Hyperdrive가 제공하는 가상ized 커넥션 스트링 사용
const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
await client.connect();
const { rows } = await client.query('SELECT * FROM users WHERE active = true LIMIT 10');
await client.end();
return Response.json(rows);
}
};
4. Wrangler CLI를 활용한 CI/CD 배포 자동화
Cloudflare는 강력한 CLI 도구인 wrangler를 통해 로컬 에뮬레이션과 프로덕션 배포를 단순화한다.
# 로컬 개발 서버 실행 (V8 Isolate 에뮬레이션)
npx wrangler dev
# 프로덕션 환경 변수/시크릿 등록
npx wrangler secret put API_KEY
# 프로덕션 즉시 배포
npx wrangler deploy
GitHub Actions 자동화 워크플로우 (.github/workflows/deploy.yml):
name: Deploy Worker
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- name: Deploy to Cloudflare Workers
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
결론: 서버리스 아키텍처의 미래
AWS Lambda는 대규모 컴퓨팅과 AWS 생태계(SQS, SNS, DynamoDB)와의 밀집한 연동에 장점이 있으나, API 서버 역할을 맡길 때는 이그레스 비용과 API Gateway의 과금 체계가 부담이 된다.
응답 데이터를 전송할 때 이그레스 비용이 전무한 Cloudflare Workers로 전환함으로써, 데이터 집약적인 글로벌 서버리스 백엔드의 운영 비용을 95% 이상 감축할 수 있었다. 서버리스 비용 절감을 고민 중이라면, Edge로의 이전을 적극 검토해보길 권한다.