AWS Lambda에서 ffmpeg 실행

AWS Lambda를 직접 운영하지 않고 ffmpeg 쓰기

Lambda에서도 ffmpeg를 돌릴 수는 있어요 — 다만 패키징, 콜드 스타트, 운영까지 전부 떠안게 되죠. Fotovid는 이 세 가지를 모두 대신 처리해요: 요청 보내기, 호스팅된 파일 받기, 레이어 빌드 건너뛰기.

// handler.mjs — Node 18+ runtime (global fetch)
export const handler = async (event) => {
  const { videoUrl, logoUrl } = JSON.parse(event.body);

  const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.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 { statusCode: 200, body: JSON.stringify({ url }) };
};

그냥 업로드에 워터마크 하나 찍고 싶었을 뿐인데

맞아요, Lambda에서도 ffmpeg를 돌릴 수 있어요. 250MB 압축 해제 제한 안에 맞춰 레이어를 빌드하고, /tmp를 스크래치 공간(최대 10GB)으로 연결하고, 15분 제한 안에서 작업을 마쳐야 해요. 그다음부터가 진짜 시작이에요: 정적 ffmpeg 빌드를 고정하고, 1080p 인코딩이 타임아웃 나지 않도록 메모리를 튜닝하고, 첫 요청의 콜드 스타트를 감수하고, 이 모든 걸 영원히 유지보수해야 하죠. 영상에 로고 하나 찍으려고 세우기에는 너무 많은 인프라예요.

  • 정적 ffmpeg 바이너리를 250MB 압축 해제 제한 안에서 레이어로 패키징하고 버전 관리하기
  • 작업별로 메모리와 타임아웃을 튜닝해서 15분 제한에 걸려 인코딩이 실패하지 않게 하기
  • 사용자가 기다리고 있는 바로 그 요청에서 콜드 스타트 지연을 그대로 감수하기
  • 원하지도 않았던 ffmpeg Lambda를 유지보수하고, 패치하고, 모니터링하기

팀들이 AWS Lambda에서 ffmpeg를 돌리는 방법

Fotovid가 없던 시절엔 이런 선택지들뿐이었어요 — 하나같이 직접 떠안고 싶지 않은 일이죠.

OptionWhat it costs youVerdict
ffmpeg를 AWS Lambda 함수에 번들로 넣기패키징, 콜드 스타트 감수, 튜닝까지 전부 직접 해야 맞는 레이어
컨테이너나 VM을 직접 호스팅하기상시 가동 비용에 더해 패치, 스케일링, 모니터링까지
잡 큐 + 워커 운영하기새로운 인프라: 큐, 워커, 재시도, 데드레터 처리까지
브라우저에서 트랜스코딩하기 (WASM)느리고, 메모리를 많이 잡아먹고, 모바일에서는 크래시가 나요
Fotovid API 호출하기HTTPS 요청 한 번으로 끝 — 실행도, 패키징도, 스케일링도 필요 없음
How it works

세 단계로 끝내는 첫 호출

  1. 1
    무료 API 키 받기

    Fotovid 키를 발급하면 p6_<key_id>:<secret> 형식의 토큰을 받아요. 모든 요청에 Authorization: Bearer 헤더로 담아 보내면 돼요. AWS 역할도, 레이어도, 빌드 파이프라인도 필요 없어요 — 사용량은 credits로 처리돼요($1 = 100 credits, 대부분의 작업은 1 credit이에요).

  2. 2
    POST /v1/video/watermark로 영상 보내기

    POST https://api.fotovid.co/v1/video/watermark를 표준 envelope로 호출해요: HTTPS로 접근 가능한 입력 파일을 가리키는 source_url과 params 객체를 담아 보내요. 워터마크의 경우 type(image, text, combo 중 하나), watermark_image_url 또는 text, bottom-right 같은 position, 그리고 선택적으로 opacity, scale, padding을 지정해요. Fotovid가 소스를 가져와 ffmpeg를 실행하고 동기적으로 결과를 반환해요 — 폴링할 큐도, 계속 켜둬야 할 Lambda도 없어요.

  3. 3
    호스팅된 결과 URL 사용하기

    응답은 평탄한(flat) JSON이에요: id, type, 완성된 Fotovid 호스팅 파일을 가리키는 url, 그리고 expires_at이 담기고, 영상의 경우 duration도 함께 담겨요. 이 URL을 그대로 프론트엔드에 넘기거나 다운로드해서 직접 보관하면 돼요. /v1/video/trim, /v1/video/extract-audio, /v1/video/extract-cover, /v1/video/probe, 그리고 이미지·오디오 엔드포인트도 동일한 흐름으로 동작해요.

자주 묻는 질문

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

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