API Gateway + Lambda(Node.js 22) 구조인데, cold start가 10~14초씩 나옵니다. 워밍업 후에는 50ms로 빠른데, 트래픽 낮을 때 새 컨테이너 띄우면 사용자가 체감할 수준으로 느려요.
핸들러는 이런 구조입니다.
// handler.ts
import { PrismaClient } from "@prisma/client";
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { S3Client } from "@aws-sdk/client-s3";
import Stripe from "stripe";
import OpenAI from "openai";
const prisma = new PrismaClient();
const s3 = new S3Client({});
const ddb = new DynamoDBClient({});
const stripe = new Stripe(process.env.STRIPE_KEY!);
const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY! });
export const handler = async (event) => {
// ...
};
번들러는 esbuild, 최종 zip 사이즈는 15MB 정도. 메모리는 1024MB로 설정.
댓글 4
Cold start 10초는 "번들 크기 + init 시점 I/O"가 겹친 전형적 증상입니다. 해결은 여러 레이어로 같이 해야 합니다.
1) init 단계를 가볍게 — "지연 초기화" 패턴
현재는 모든 SDK 클라이언트가 모듈 로드 시점에 초기화됩니다. 대부분의 요청이 쓰는 건 한두 개뿐일 거예요. lazy getter로 바꾸세요.
Prisma는 특히 무거워서 안 쓰는 핸들러에서는 로드하지 마세요.
2) 번들 사이즈 줄이기
aws-sdk는 v3 모듈별 import만 쓰고, v2 금지external: ['@aws-sdk/*']지정하면 런타임에 SDK 사용(런타임에 AWS SDK 포함된 Node 22 런타임도 옵션)binaryTargets를["rhel-openssl-3.0.x"]로)openai,stripev5+ 사용목표는 zip 5MB 이내.
3) Lambda SnapStart (Node 런타임도 지원)
2026년부터 SnapStart가 Node.js까지 확장됐습니다. 초기화된 상태의 스냅샷을 저장해 두고 cold start 시 즉시 복원합니다. cold start 80% 이상 단축 사례 많습니다.
단, 초기화 시점에 랜덤 시드·커넥션·토큰 같은 요청별 state를 만들면 안 됩니다. 스냅샷에 박혀서 모든 요청이 같은 값을 쓰게 되니 주의.
4) 메모리 올리기 (CPU도 같이 커짐)
Lambda는 메모리에 비례해 vCPU가 배분됩니다. 1024MB → 1769MB로 올리면 1 vCPU 풀이 되어 init이 빨라집니다. 비용은 약간 오르지만 cold start 단축 효과가 훨씬 큽니다.
5) Provisioned Concurrency
정말 중요한 공개 엔드포인트만 최소 1~2개 예약. 비싸긴 합니다.
우선 순위
① lazy init + ② 번들 슬림화 → 여기서 cold start 2~3초로 떨어집니다. 그래도 부족하면 ③ SnapStart.
저는 차라리 Lambda Web Adapter + container image로 옮겼습니다. Fastify 그대로 돌고, image 레이어 캐시가 있어서 init이 훨씬 빠릅니다. Lambda zip의 한계에 부딪히면 컨테이너가 답인 경우 많아요. 그리고 진짜 cold 민감한 워크로드면 Cloudflare Workers나 Deno Deploy도 후보입니다(cold start 거의 없음).
lazy init 패턴으로 바꾸고 Prisma binary target 정리하니까 zip이 4.8MB로 줄었고, cold start가 1.4초까지 떨어졌습니다. SnapStart 적용 준비 중인데, 혹시 Prisma 커넥션 풀은 snapshot 시점에 생성해도 되는 건가요, 아니면 요청마다 만들어야 되나요?
중요한 질문입니다. Prisma 커넥션 풀은 snapshot 시점에 만들면 위험합니다. SnapStart는 초기 상태를 메모리 덤프로 복원하는데, TCP 커넥션은 복원 후 유효하지 않을 가능성이 큽니다(대상 DB가 끊었을 수 있음).
권장:
PrismaClient인스턴스 생성은 init에 해도 OK (아직 커넥션 없음)$connect()또는 첫 쿼리는 핸들러 내부에서 실행BeforeSnapshot/AfterRestore훅을 써서 restore 직후 커넥션을 정리/재생성동일 원칙이 OpenAI·Stripe 클라이언트의 인증 토큰 캐시에도 적용됩니다. 스냅샷에 박힌 만료 토큰이 문제를 일으킬 수 있어요.