動画自動化パイプラインのコストを計算する
執筆: RenderComp チーム 編集方針
Remotion はビデオを React コンポーネントとして記述し、各フレームを useCurrentFrame が返す整数から決定論的に計算します。同じフレーム番号を入力すれば、環境を問わず同じピクセル列が出力されます。この性質は、コスト予測を現実的にする基盤でもあります。フレームごとの計算量が推測できれば、レンダリング全体のコストも事前に近似できるからです。
Remotion Lambda はレンダリングを実行している時間分だけ課金されます。アイドル状態のサーバーを維持するコストはゼロです。多くのユーザーが数分間の動画を数ペニー程度でレンダリングしています。
ただし正確な金額はリージョン・割り当てメモリ・動画の種類・並列化などのパラメータに依存します。これらを把握せずにパイプラインを設計すると、本番稼働後に想定外の費用差が生じます。
コストを決める4つの変数
リージョン
AWS Lambda の単価はリージョンによって異なります。deployFunction でデプロイするリージョンと、renderMediaOnLambda を呼ぶリージョンは一致させる必要があります。
import { deployFunction } from "@remotion/lambda";
await deployFunction({
region: "ap-northeast-1", // 単価はリージョンごとに異なる
memorySizeInMb: 1769,
timeoutInSeconds: 120,
createCloudWatchLogGroup: true,
});
どのリージョンを選ぶかはユーザーの所在地や他の AWS サービスとの連携方針によって変わります。コストの観点では、計測前にリージョンを固定してベースラインを取ることが先決です。
メモリ割り当て
AWS Lambda はメモリを 128MB から 10,240MB まで 1MB 単位で設定できます。1,769MB に設定すると 1 vCPU 相当の計算力が割り当てられ、それ以上はメモリに比例して CPU も増えます。3,538MB(1,769 × 2)は 2 vCPU 相当です。
CPU リソースがメモリに比例するため、レンダリングが CPU バウンドなら、メモリを 2 倍にすると実行時間が約半分になります。Lambda の課金は GB×秒であるため、実行時間の短縮が費用を相殺する場合があります。実際の損益分岐点はコンポジションの複雑さによって変わるため、後述の実測手順で確認します。
// vCPU の境界を意識したメモリ設定
// 1,769 MB → 1 vCPU 相当(AWS Lambda 仕様)
// 3,538 MB → 2 vCPU 相当(1,769 × 2)
await deployFunction({
region: "ap-northeast-1",
memorySizeInMb: 1769,
timeoutInSeconds: 120,
createCloudWatchLogGroup: true,
});
動画の種類
spring() や interpolate() を多用するコンポジションは、静止画中心の構成より 1 フレームあたりの計算量が増えます。特に spring() をリスト要素ごとに呼ぶ場合、アイテム数 n が多いほど毎フレームの処理が線形に増加します。
import { useCurrentFrame, useVideoConfig, spring } from "remotion";
export const AnimatedList: React.FC<{ items: string[] }> = ({ items }) => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
return (
<>
{items.map((item, i) => {
const scale = spring({
frame: frame - i * 4, // 4フレームずつスタッガー
fps,
config: { stiffness: 80, damping: 14 },
});
return (
<div key={i} style={{ transform: `scale(${scale})` }}>
{item}
</div>
);
})}
</>
);
};
items が 50 件であれば毎フレーム 50 回の spring 計算が走ります。同じ動画の長さでも、このコンポジションと静止画テキストだけの構成では実行時間に差が出ます。コスト削減を検討する場合、spring() の呼び出し数を減らすか、同じ動きを interpolate() の線形近似で代替できるか確認します。
並列化
Remotion Lambda はフレームを複数の invocation に分割して並列処理します。framesPerLambda が 1 invocation あたりのフレーム数を決定します。AWS Lambda の 1 回の実行上限は 15 分であり、1 invocation がこの制限内に収まる設定が必要です。
例えば 30fps・10 分の動画は 18,000 フレームです。framesPerLambda: 100 に設定すると 180 の invocation が並列起動します。framesPerLambda を小さくしすぎると、短時間の invocation が大量に起動してコールドスタートのオーバーヘッドが目立ちます。
import { renderMediaOnLambda } from "@remotion/lambda/client";
const { renderId, bucketName } = await renderMediaOnLambda({
region: "ap-northeast-1",
functionName: "remotion-render-4-0-0-mem1769mb-disk512mb-120sec",
serveUrl: process.env.REMOTION_SERVE_URL!,
composition: "MyVideo",
codec: "h264",
framesPerLambda: 100, // 総フレーム数 ÷ この値 = invocation 数
maxRetries: 1,
outName: {
key: `renders/${Date.now()}/output.mp4`,
bucketName: process.env.REMOTION_BUCKET_NAME!,
},
});
コストを実測する
変数の組み合わせが出力コストにどう影響するか把握するには、基準となる短い動画で実測します。getRenderProgress のレスポンスにはコスト情報が含まれており、レンダリング完了後に参照できます。
import { getRenderProgress } from "@remotion/lambda/client";
const progress = await getRenderProgress({
renderId,
bucketName,
functionName: "remotion-render-4-0-0-mem1769mb-disk512mb-120sec",
region: "ap-northeast-1",
});
if (progress.done) {
// costs.accruedSoFar と costs.estimatedCost は USD 建て
console.log(progress.costs);
}
costs.estimatedCost を動画の秒数で割ると、1 秒あたりの単価が算出できます。コンポジションの種類ごとにこの値を記録しておくと、新しい動画のコスト見積もりの基準になります。CI/CD に短いベンチマーク動画のレンダリングを組み込み、costs と timeToFinish を継続記録すれば、コンポジションの変更が費用に与える影響を追跡できます。
無料50本
テンプレート50本を ZIP で受け取る
メールアドレスを入れると、50本の ZIP のリンクをすぐにお送りします。
50本の ZIP をメールで受け取ります。あわせて RenderComp テンプレートの更新と、有料ライブラリを含む製品のご案内を受け取ることに同意します(メールは数通・ワンクリック解除)。 プライバシーポリシー(英語)
メールを使わずに受け取ることもできます。GitHub のリポジトリは公開のままで、登録も不要です。 リポジトリを開く
送信しました
ZIP のリンクを記載したメールをお送りしました。届かない場合は迷惑メールをご確認ください。いますぐ受け取る場合はこちらから直接ダウンロードできます。