動画クリエイティブはデータ負荷の高いワークフローです。1つのAdstackerプロジェクトには、ソースクリップ、サムネイル、正規化された動画、抽出された音声、再利用可能なオーバーレイ、および完成したバリエーションが含まれることがあります。アプリケーションサーバーに過負荷をかけないアップロード、信頼できる検証、予測可能な出力場所、および放棄された作業のクリーンアップが必要です。
Amazon S3 は、このワークフローの背後にある耐久性のあるアセットレイヤーです。Adstacker は、クリエイターからストレージに直接大容量ファイルを移動させ、プロジェクトの各段階を整理し、完成した動画をダウンロード可能にするためにこれを使用します。
課題:動画アセットは急速に増加する
クリエイティブテストでは、少数のクリップから多くのバリエーションを生成でき、それがアセット管理の問題を生み出します。プロジェクトは、フック、本文、CTAのフッテージから始まり、正規化されたコピー、音声、キャプション付きオーバーレイ、サムネイル、そして最終的なMP4またはMOV出力が生成されることがあります。
すべてのバイトを API 経由で移動させると、アップロードが遅くなり、サーバーの帯域幅を消費します。ずさんなファイル名では再試行が困難になり、クリエイターがアップロード途中でタブを閉じると孤立したアセットが残ってしまいます。
ストレージは、制作パイプラインの意図的な一部である必要があります。
当社のアプローチ:アセットライフサイクル全体での S3 の活用
S3 はプロジェクト作成から最終ダウンロードまで関与します。バックエンドは認証、マニフェスト、検証、ジョブの状態を処理し、S3 は大容量オブジェクトを扱います。
アーキテクチャ

この分割により、メディアファイルはストレージへの直接的で耐久性のあるパスを得られます。
1. ブラウザから直接大容量動画をアップロード
クリエイターがプロジェクトを開始すると、Adstacker はソース動画のマニフェストを作成し、各ファイルに対して署名付き S3 POST を返します。ブラウザは、バックエンドを介してプロキシするのではなく、ファイルを直接 S3 に送信します。
S3 は、署名付きアップロードの制約(固定されたコンテンツタイプと許可されたサイズ範囲)を強制します。これにより、空または過大なサイズのアップロードが着地する前に阻止され、短命のリクエストはブラウザがアップロードできるものを制限します。
セッションが中断された場合、Adstacker は保留中の動画に対して新しい URL を再発行します。また、再開時に S3 をチェックするため、完了コールバックが欠落したオブジェクトでも、整合性を取って検証することができます。
2. 処理する前に到着したものを検証する
ブラウザでのアップロード完了だけでは、レンダリングを開始するには十分ではありません。バックエンドは S3 HEAD を使用してオブジェクトを確認し、そのサイズと ETag を読み取り、検証済み動画とともにその ETag を保存します。
次に、Adstacker は FFprobe 検証のためにオブジェクトを一時的にダウンロードします。それが読み取り可能であり、期間と実効解像度がプロジェクト要件を満たしていることを確認します。無効なファイルは、役立つ却下理由とともに削除されます。一時的な読み取りエラーの場合、オブジェクトは再試行のためにその場に残されます。
各動画は、保留中、アップロード中、アップロード済み、検証中、検証済み、または却下という明確なライフサイクルを経ます。プロジェクトは、すべての期待されるアセットが検証されて初めて進行し、アトミックな更新によって、重複するコールバックによる動画の二重カウントが防止されます。
3. すべての出力を予測可能かつ再利用可能にする
Adstacker は、プロジェクト、アセットタイプ、カテゴリ、バリエーションに基づいた決定論的な S3 パスを使用します。正規化されたメディアと抽出された音声は、レンダリングされたオーバーレイや最終的な組み合わせとは別に存在します。
この構成は、パイプラインを3つの方法で支援します。
- 直接検索: ワーカーは、プロジェクトおよびバリエーションに関連付けられた正確な入力または出力を見つけることができます。
- 効率的な再利用: 再利用可能なオーバーレイは一度保存され、複数の最終的な組み合わせをサポートできます。
- 冪等な再試行: 再試行は同じ期待されるキーに書き込み、重複エクスポートの増加を防ぎます。
最終的な動画レコードには、出力、サムネイル、および関連する場合は MOV バリアントの S3 キーと URL が保持されます。アプリケーションは、準備が整った形式を提供できます。
4. 安全なアクセスを提供し、未完了の作業をクリーンアップする
S3 バケットはプライベートです。Adstacker は、オプションでダウンロードファイル名付きの時限署名付きダウンロード URL を発行するため、アセットを公開する必要はありません。
すべてのアップロードが完成したプロジェクトになるわけではありません。スケジュールされたクリーンアップは、古い未完了のプロジェクトを識別し、残っている S3 ソースオブジェクトを削除します。拒否されたアップロードは、検証に失敗するとすぐに削除されます。
これらのライフサイクルルールは、プロジェクト履歴を保持しつつ、放棄されたストレージを制限します。
実例:中断されたアップロードは最初からやり直しを意味しない
マーケターが6つのクリップをアップロードし、4つが S3 に到達した後にブラウザを閉じたとします。戻ると、Adstacker はアップロードセッションを復元し、未完了のクリップに対して新しい署名付きリクエストを提供します。また、完了コールバックが失われた場合でも、ファイルが S3 に到達したかどうかを確認します。
6つのファイルすべてが検証され、承認されると、プロジェクトは処理に進みます。ソース、準備されたメディア、オーバーレイ、サムネイル、および最終的なバリエーションは、後のすべてのステップのために既知のキーの下で整理されたままになります。
クリエイティブな速度のために設計されたストレージ
Amazon S3 は、Adstacker が動画アセットをマネージドライフサイクルとして扱うことを可能にします。すなわち、直接アップロードし、オブジェクトを検証し、メディアをバリデートし、予測可能な出力を生成し、ダウンロードを承認し、未完了の作業をクリーンアップします。これにより、クリエイティブパイプラインは、クリップをテスト可能なバリエーションに変換することに集中できます。
アセットを Adstacker にアップロードし、テストしたい組み合わせを構築し、すべてのレンダリングの背後にあるストレージワークフローをプラットフォームに管理させましょう。
技術スタック: Amazon S3 · AWS SDK for JavaScript · Presigned S3 POSTs · NestJS · FFprobe · AWS ECS Fargate · MongoDB

