AWS Lambdaでffmpegを実行、ただしLambdaの運用までは背負わない
Lambdaはffmpegを実行できます。ただし、パッケージング・コールドスタート・運用はすべて自分で抱えることになります。Fotovidならその3つをまとめて肩代わりします。リクエストを送るだけでホスティングされたファイルが返ってきて、レイヤーのビルドも不要です。
// 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のエンコードがタイムアウトしないようメモリを調整し、最初のリクエストでコールドスタートを引き受け、それらすべてを永続的に保守していくことになります。動画にロゴを1つ入れるためだけに、これだけのインフラを立ち上げる必要があるのです。
- 解凍後250MBの上限内で、静的ffmpegバイナリをレイヤーとしてパッケージ化・バージョン管理する
- エンコードが15分の壁で失敗しないよう、操作ごとにメモリとタイムアウトを調整する
- ユーザーが待っているまさにそのリクエストで、コールドスタートの遅延を引き受ける
- 本当は持ちたくもなかったffmpeg Lambdaを、保守・パッチ適用・監視し続ける
チームがAWS Lambda上でffmpegを動かそうとする方法
Fotovidが登場する前は、これらが選択肢でした。どれも本当は抱えたくない作業です。
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpegをAWS Lambda関数に組み込む | 自分でパッケージ化・コールドスタート対応・調整したレイヤー経由でしか収まらない | |
| コンテナやVMを自前でホストする | 常時稼働のコストに加え、パッチ適用・スケーリング・監視が必要 | |
| ジョブキュー + ワーカーを運用する | 新たなインフラが必要:キュー、ワーカー、リトライ、デッドレター処理 | |
| ブラウザ内でトランスコードする(WASM) | 遅く、メモリを大量消費し、モバイルではクラッシュする | |
| Fotovid APIを呼び出す | HTTPSリクエスト1回だけ、実行・パッケージ化・スケーリングの必要は一切なし |
最初の呼び出しを3ステップで
- 1無料のAPIキーを取得する
Fotovidでキーを作成すると、p6_<key_id>:<secret>という形式のトークンが発行されます。これをすべてのリクエストでAuthorization: Bearerヘッダーとして送信してください。AWSのロールもレイヤーもビルドパイプラインも不要です。利用料金はcredits制です($1 = 100 credits、ほとんどの操作は1 creditで実行できます)。
- 2動画を/v1/video/watermarkにPOSTする
POST https://api.fotovid.co/v1/video/watermarkを、標準のエンベロープ形式で呼び出します。HTTPS経由で入力元を指すsource_urlと、paramsオブジェクトを渡します。透かしの場合はtype(image、text、combo)、watermark_image_urlまたはtext、bottom-rightのようなposition、さらに任意でopacity、scale、paddingを指定します。Fotovidが元ファイルを取得してffmpegを実行し、同期的にレスポンスを返します。ポーリングするキューも、ウォームアップし続けるLambdaも不要です。
- 3ホスティングされた結果のURLを使う
レスポンスはフラットなJSONで、id、type、そして完成したFotovidホスティングのファイルを指すurlが含まれます(さらにexpires_at、動画の場合はdurationも含まれます)。このURLをそのままフロントエンドに渡すか、ダウンロードして自分でコピーを保存してください。同じ流れは/v1/video/trim、/v1/video/extract-audio、/v1/video/extract-cover、/v1/video/probe、および画像・音声の各エンドポイントでも共通です。
