Netlify Functions에서 ffmpeg: 번들에 담기엔 너무 커서, 대신 호스팅해 드려요.
Netlify Functions는 AWS Lambda 위에서 실행되기 때문에, ffmpeg는 번들 용량 제한과 기본 타임아웃을 모두 넘어버려요. 이 작업은 Fotovid에 맡기세요: 요청 하나를 보내면 완성된 결과 URL이 돌아와요 — 어떤 타임아웃보다도 훨씬 빨라요.
// netlify/functions/watermark.mts
export default async (req: Request) => {
const { videoUrl, logoUrl } = await req.json();
const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
method: "POST",
headers: {
Authorization: `Bearer ${Netlify.env.get("FOTOVID_API_KEY")}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
source_url: videoUrl,
params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
}),
});
const { url } = await res.json();
return Response.json({ url });
};Netlify에서 ffmpeg가 계속 실패하는 이유
Netlify Functions는 AWS Lambda 위에서 실행되는데, ffmpeg가 벽에 부딪히는 지점이 바로 여기예요. 정적으로 빌드된 ffmpeg 바이너리는 약 50MB(압축) / 250MB(압축 해제) 번들 용량 제한에 비해 너무 커서, 배포가 아예 실패하거나 바이너리가 조용히 빠진 채로 배포돼요. 어떻게든 욱여넣는다 해도 기본 10초 함수 타임아웃이 제대로 된 트랜스코딩을 중간에 끊어버려요 — 백그라운드 함수는 26초까지 늘어나지만, 그래도 대부분의 영상 작업에는 부족해요. '로컬에서는 잘 됐는데 프로덕션에서는 타임아웃'이라는 전형적인 함정이에요.
- ffmpeg 바이너리와 라이브러리가 Lambda의 250MB(압축 해제) 번들 용량 제한을 초과해요
- 기본 10초 타임아웃(백그라운드 함수는 26초)이 실제 트랜스코딩을 도중에 끊어요
- 콜드 스타트와 레이어 관리가 지연 시간과 패키징 부담을 더해요
- 로컬에서 성공해도 배포된 함수에서는 재현되지 않아요
Netlify에서 ffmpeg를 돌려보려는 시도들
Fotovid가 없다면 선택지는 이것뿐이었어요 — 하나같이 직접 떠안고 싶지 않은 일이에요.
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpeg를 Netlify 함수에 직접 번들링하기 | 250MB 번들 제한을 초과하고 10초 함수 타임아웃에 걸려요 | |
| 컨테이너나 VM을 직접 호스팅하기 | 상시 가동 비용에 패치, 스케일링, 모니터링까지 떠안아야 해요 | |
| 작업 큐 + 워커 직접 운영하기 | 큐, 워커, 재시도, 데드레터 처리까지 — 새로운 인프라가 통째로 필요해요 | |
| 브라우저에서 트랜스코딩하기(WASM) | 느리고 메모리를 많이 먹고, 모바일에서는 크래시가 나요 | |
| Fotovid API 호출하기 | HTTPS 요청 한 번이면 끝 — 실행할 것도, 패키징할 것도, 스케일링할 것도 없어요 |
세 단계로 끝내는 첫 API 호출
- 1무료 API 키 발급받기
가입하고 키를 하나 만드세요. 인증은 Authorization: Bearer p6_<key_id>:<secret> 헤더 하나면 충분해요 — 바이너리도, Lambda 레이어도, Netlify Function에 번들링할 것도 전혀 없어요.
- 2워터마크 엔드포인트로 영상 POST하기
Netlify Function 안에서 https://api.fotovid.co의 POST /v1/video/watermark를 호출하세요. 표준 envelope 형태로 요청을 보내면 돼요: 입력 영상을 가리키는 source_url과 params 객체 — type을 image, text, combo 중 하나로 지정하고, bottom-right 같은 position에 opacity, scale, padding까지 함께 지정할 수 있어요. ffmpeg 작업은 Fotovid가 플랫폼 밖에서 처리하므로, 함수는 배포할 수도 없는 바이너리를 shell로 호출하는 대신 빠른 HTTPS 요청 하나만 보내면 돼요.
- 3호스팅된 결과 URL 사용하기
응답은 id, type, url, expires_at으로 구성된 플랫 JSON이에요. url은 완성되어 Fotovid에 호스팅된 영상을 가리켜요. 그대로 클라이언트에 반환하거나 직접 사본을 보관하세요 — 결과물은 일시적으로만 호스팅되므로, 다운로드해서 여러분이 관리하는 저장소에 다시 저장해 두는 게 좋아요.
