Netlify Functions에서 ffmpeg 실행

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가 없다면 선택지는 이것뿐이었어요 — 하나같이 직접 떠안고 싶지 않은 일이에요.

OptionWhat it costs youVerdict
ffmpeg를 Netlify 함수에 직접 번들링하기250MB 번들 제한을 초과하고 10초 함수 타임아웃에 걸려요
컨테이너나 VM을 직접 호스팅하기상시 가동 비용에 패치, 스케일링, 모니터링까지 떠안아야 해요
작업 큐 + 워커 직접 운영하기큐, 워커, 재시도, 데드레터 처리까지 — 새로운 인프라가 통째로 필요해요
브라우저에서 트랜스코딩하기(WASM)느리고 메모리를 많이 먹고, 모바일에서는 크래시가 나요
Fotovid API 호출하기HTTPS 요청 한 번이면 끝 — 실행할 것도, 패키징할 것도, 스케일링할 것도 없어요
How it works

세 단계로 끝내는 첫 API 호출

  1. 1
    무료 API 키 발급받기

    가입하고 키를 하나 만드세요. 인증은 Authorization: Bearer p6_<key_id>:<secret> 헤더 하나면 충분해요 — 바이너리도, Lambda 레이어도, Netlify Function에 번들링할 것도 전혀 없어요.

  2. 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. 3
    호스팅된 결과 URL 사용하기

    응답은 id, type, url, expires_at으로 구성된 플랫 JSON이에요. url은 완성되어 Fotovid에 호스팅된 영상을 가리켜요. 그대로 클라이언트에 반환하거나 직접 사본을 보관하세요 — 결과물은 일시적으로만 호스팅되므로, 다운로드해서 여러분이 관리하는 저장소에 다시 저장해 두는 게 좋아요.

자주 묻는 질문

API 호출 한 번으로 배포하세요

무료 키를 발급받고 5분 안에 첫 호출을 완료해보세요.