Observability Conference 2022におけるライブ・アーカイブ配信を支える技術 AWS・アプリケーション編 #o11y2022
本投稿では、2022年3月11日に開催されたObservability Conference 2022 (以後、o11y2022)におけるライブ配信・アーカイブ配信をどのように実現したのか、主にRailsアプリケーションとAWSサービスについて紹介します。なお、OBSなどの配信基盤についてはこの投稿では触れません。
実現したいこと
o11y2022の配信アーキテクチャでは以下の3点の実現を目指しました。
- ライブセッションをできるだけ低遅延で配信する
- 事前録画セッションを配信する
- ライブセッション終了後にできるだけ早く、簡単にアーカイブ動画を配信する
アーキテクチャ
主にAWSとRails、Reactを用いています。
- AWS
- AWS Elemental MediaLive:配信チームからの配信データを受け取り、IVSやMediaPackageに流す
- AWS Elemental MediaPackage:MediaLiveから受け取った配信データを一定期間保持し、アーカイブ動画の作成を行う
- Amazon IVS:MediaLiveから受け取ったデータをカンファレンス参加者向けに配信する
- S3:事前録画セッション動画、アーカイブ動画を置く
- CloudFront:S3に置いた動画を配信する
- Dreamkast (Rails)
- MediaLive、MediaPackage、IVSリソースを作成する
- MediaPackage HarvestJobを作成する
- Dreamkast-UI (React)
- 配信視聴ページを提供する
ライブセッションをできるだけ低遅延で配信する
ライブセッションはMediaLiveとIVSを使用して配信します。OBSでMediaLiveに対してRTMP Pushすると、MediaLiveは受け取ったデータをIVSに流し、イベント参加者はIVSの配信データをDreamkast-UI経由で視聴します。
事前録画セッションを配信する
ライブセッションとは別に、事前に録画した動画を提出してもらい、それを流す形式の事前録画セッションもあります。事前録画セッションについてはあらかじめS3上に動画データを置き、CloudFront経由で配信します。イベント参加者はライブセッションと同様、Dreamkast-UI経由で視聴します。
ライブセッション終了後にできるだけ早く、簡単にアーカイブ動画を配信する
o11y2022に限らず、CloudNativeDaysではライブセッションをできるだけ早くアーカイブ動画として公開し、後からイベント参加者が視聴できることを目指しています。o11y2022ではアーカイブの作成にMediaPackageを利用しました。
MediaPackageは受け取った配信データを指定した期間保持し、タイムシフト再生を行うことのできるサービスです。また、MediaPackage HarvestJobというリソースを作ることで、保持された配信データからVODクリップを作成できます。これらの機能を活用することで、セッション終了後数十分程度でアーカイブ動画の公開を実現しました。
MediaPackageはMediaLiveから配信データを受け取っています。MediaLiveを使うことでIVSとMediaPackageに同じソースから配信データを送ることができ、便利です。
MediaPackage HarvestJobを作る際にはアーカイブ動画の開始時刻と終了時刻を指定する必要があります。これらの時刻をどう決めるのかがHarvestJobを使う時の難しさの一つです。Dreamkastでは、切り出し開始時刻と切り出し終了時刻を指定するとプレビューする機能を実装し、微調整できるようにしました。
タイムテーブル上はセッションの開始・終了時刻は決まっているのでその時刻を使ってHarvestJobを自動的に作れそうですが、実際には開始も終了も変わる可能性があります。なので、セッションの開始時刻と終了時刻を切り出し開始時刻と切り出し終了時刻の初期値とするだけにとどめておき、後は人が微調整するという方式としています。
HarvestJobのステータスはDreamkastの管理画面から確認できます。また、定期的にHarvestJobのステータスをポーリングし、ジョブが成功していた場合は切り出されたアーカイブ動画を視聴するためのURLをDreamkastのDBに登録し、イベント参加者がアーカイブ視聴できるようになっています。
過去のイベントでもアーカイブ動画の作成機能はあったのですが、オペレーターの職人芸的作業が必要でした。一発勝負でミスができない方法で非常にオペレーターに負担を強いることになっていました。o11y2022のMediaPackageを使った方法だと、事前にプレビューすることでミスしにくくなっていること、後でミスに気づいても再度HarvestJobを作ることでアーカイブ動画を作り直せることからオペレーターへの負担は小さくなっています。
しかし、実際にオペレーションしてもらった結果、切り出し開始時刻と切り出し終了時刻の微調整が意外と大変ということもわかりました。アーカイブ動画作成に限らず、オペレーションの省力化は今後も取り組みたいと考えています。
本投稿で紹介した仕組みを作っているDreamkastチームでは、開発に興味のある方を探しています。利用技術はRails・React・AWS各種サービスです。現在は基本的にRails上で開発していますが、別サービスに切り出せそうな機能についてはRuby以外の言語を使うことも可能です。関心がある方はご連絡ください。