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가 없던 시절엔 이런 선택지들뿐이었어요 — 하나같이 직접 떠안고 싶지 않은 일이죠.
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpeg를 AWS Lambda 함수에 번들로 넣기 | 패키징, 콜드 스타트 감수, 튜닝까지 전부 직접 해야 맞는 레이어 | |
| 컨테이너나 VM을 직접 호스팅하기 | 상시 가동 비용에 더해 패치, 스케일링, 모니터링까지 | |
| 잡 큐 + 워커 운영하기 | 새로운 인프라: 큐, 워커, 재시도, 데드레터 처리까지 | |
| 브라우저에서 트랜스코딩하기 (WASM) | 느리고, 메모리를 많이 잡아먹고, 모바일에서는 크래시가 나요 | |
| Fotovid API 호출하기 | HTTPS 요청 한 번으로 끝 — 실행도, 패키징도, 스케일링도 필요 없음 |
세 단계로 끝내는 첫 호출
- 1무료 API 키 받기
Fotovid 키를 발급하면 p6_<key_id>:<secret> 형식의 토큰을 받아요. 모든 요청에 Authorization: Bearer 헤더로 담아 보내면 돼요. AWS 역할도, 레이어도, 빌드 파이프라인도 필요 없어요 — 사용량은 credits로 처리돼요($1 = 100 credits, 대부분의 작업은 1 credit이에요).
- 2POST /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호스팅된 결과 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, 그리고 이미지·오디오 엔드포인트도 동일한 흐름으로 동작해요.
