WebRTC×Lambda × S3によるシンプルな録画システム

WebRTC は「リアルタイム通信」特に映像と音声を繋げるための技術ですが、実務では「あとから見返せる録画」も求められます。
一方で、録画の仕組みを常時サーバ上で動かすのは運用負担が大きく、コストや可用性の観点からサーバレス構成が有効です。

そこで今回は、
「WebRTC(例: SkyWay や mediasoup) → S3 → Lambda」
の3つで完結する「シンプルな録画システム」を紹介します。

構成の全体像

WebRTC(クライアント) + S3 + Lambdaによる全体の構成は以下のイメージです。

ポイントとしては以下のとおりです。

  • WebRTCクライアント側はユーザの録画開始/停止操作をトリガーに録画データをS3に送信
  • S3はアップロードをトリガーにLambdaを呼び出す
  • Lambdaは動画の結合・変換を担当
  • 今回の構成ではバックエンドAPI不要の完全イベント駆動構成

映像のアップロード

映像のアップロード方法は大きく2パターンあります。

  1. クライアント(PC/スマホ)から直接S3へアップロード
    • 映像を、署名付きURLやSDKを使ってS3へ直接アップロード。
    • メリット: サーバ負荷/コストが低い、スケールしやすい、遅延が少ない。
    • デメリット: モバイル回線の不安定さや一時中断に備えたレジューム/リトライ実装が必要。端末性能・電源管理の影響を受けやすい。
  2. SFU/メディアサーバ側でS3へアップロード
    • クライアントはSFU(例:SkyWay/mediasoup)に接続し、サーバが録画・保存を担当。
    • メリット: ネットワークが安定、サーバ側で一括結合/変換しやすい、クライアント実装が軽量。
    • デメリット: サーバ運用・転送料金の負担増、スケール設計(I/O帯域・ストレージ)が必要。

どちらを選ぶかは、同時接続数・端末環境(モバイル中心か)・コスト配分(端末 vs サーバ)で決めると良いです。
まずはクライアントから直接アップロードする形で、要件が固まってからサーバ録画に寄せるというのも一つの方法かと思います。

録画データの取得

S3 は、オブジェクトに対するアクションを“イベント”として通知でき、その受け口として Lambda / SQS / SNS / EventBridge を指定できます。今回の録画基盤では、映像がアップロードされたら自動でLambdaを実行し、結合や変換を行います。

運用のポイント

  1. 同じ処理が何度も実行されないようにする
  2. 保存できる容量に注意する
  3. 録画の同時実行を制限する
  4. コストを抑える工夫
1. 同じ処理が何度も実行されないようにする

S3はまれに「同じファイルが届いた」という通知を複数回送ることがあります。
そのため、Lambdaの処理が何度も走ってしまうと、同じ録画を重複して変換したり、無駄に保存してしまうことがあります。
これを防ぐために、「このファイルはもう処理済み」という印をデータベースに残すようにします。


2. 保存できる容量に注意する

Lambdaの中で一時的にファイルを扱うための場所(/tmp)には約500MBの上限があります。
長い録画や複数人分の映像を一度に扱うと容量オーバーになることがあります。
その場合は、ファイルをいくつかに分けて処理する、もしくは映像を再エンコードせずコピーするだけ(高速処理)などの工夫をします。


3. 録画の同時実行を制限する

多くの人が同時に録画をアップロードすると、Lambdaが同時に何十個も動き、処理が詰まることがあります。
この場合は「同時に動かせる数」を制限したり、場合によっては一度SQS(キュー)に溜めて順番に処理させるようにします。

4. コストを抑える工夫

録画データはサイズが大きく、長期間そのまま置いておくとストレージ費用がかさみます。
S3には「保存期間を過ぎたら自動で安価な保存領域(Glacier)に移す」設定があるので、「録画から30日経ったら自動アーカイブ」というルールを設定しておくと、放っておいてもコストが最適化されます。

録画映像の加工

録画された映像データは、そのままでも保存できますが、実際の運用では「再生しやすくする」「サイズを減らす」「一部だけ使う」といった加工処理を行うことが多くなります。これらの処理も、AWS Lambda を使って自動化できます。

1. 不要な音声を削除する(無音化)

会議や遠隔支援などの録画では、環境音や私語などを除外したい場面があります。
Lambda内で ffmpeg というツールを使い、音声を削除した映像だけを出力することが可能です。

2. 複数の映像をひとつにまとめる(結合)

録画は5〜10秒ごとなど、短いファイルに分割してアップロードされるのが一般的です。
LambdaがS3からそれらを受け取り、時系列順に自動でつなげることで、1本の連続した映像として再生できるようになります。

3. ファイル形式を変える(変換)

保存形式を .mp4 に変換しておくと、スマートフォンやWindows、Macなどどの端末でも再生しやすくなります。

4. サムネイル画像を作る

映像の冒頭や任意のタイミングから静止画を1枚切り出すこともできます。
これにより、一覧画面などでプレビュー表示を作ることが可能になります。

まとめ

本記事では、Lambda × S3 × WebRTC を組み合わせて、録画システムの仕組みを紹介しました。

この構成の最大の特徴は、サーバを常時動かす必要がないことです。
録画データがS3に届いたらLambdaが自動で動き、音声の削除や映像の結合、ファイル形式の変換までを一気に処理します。
エンジニアが手動でメンテナンスしたり、録画サーバを管理する手間をほとんど無くせるのが大きなメリットです。

また、S3やLambdaなどのAWSサービスは、使った分だけ課金される従量課金制のため、
録画が多い時期も少ない時期も、コストを柔軟に抑えられます。
録画ファイルは一定期間後に自動でアーカイブされるよう設定でき、運用もシンプルかつ安心です。

WebRTCの録画は、リアルタイム性と安定性の両立が難しい領域ですが、
このサーバレス構成を採用すれば、小規模な実験段階から本番運用までスムーズに拡張できます。