この記事は はてなエンジニア Advent Calendar 21日目の記事です。昨日は id:papix さんでした。
この記事では、はてなの開発合宿で AWS メディアサービスをつかってVOD動画配信の仕組みを作ったときの様子を紹介します。
合宿初日にチームメンバーの id:masawada と id:hokkai7go とAWSのドキュメントを眺め、以下のようなアーキテクチャを目指すことにしました。
配信までの流れは以下のとおりです。
- アップロード用のS3バケットに動画を保存する
- ファイル保存イベントをトリガとして MediaConvert に変換 job を投入する
- HLS フォーマットの配信データを配信準備用S3バケットに保存する
- m3u8 ファイルの作成をトリガに MediaPackage にアセットを登録する
- MediaPackage で HLS / MPEG-DASH で配信するためのエンドポイントを公開する
- 再生準備が整うと CloudWatch Event に <code>VodAssetPlayable</code> イベントが通知されるので、これをトリガに lambda を起動して配信アプリケーションにエンドポイントを登録する
また、 MediaPackage の前段に CloudFront を配置し、m3u8 ファイルの配信には短命な署名済みURLを用いることにしました。
実際に動かしてわかったこと
上記の構成は合宿初日の夜にはほぼ出来上がったのですが、MediaPackage で VOD 配信をする場合に、エンドポイントのアクセスコントロールができないことがわかりました*1
そこで、MediaPackage で行っていた処理をすべて MediaConvert で行うように変更しました。
- アップロード用のS3バケットに動画を保存する
- ファイル保存イベントをトリガとして MediaConvert に変換 job を投入する
- HLS / MPEG-DASHフォーマットの配信データを配信準備用S3バケットに保存する
- m3u8 / mpd ファイルの作成をトリガに配信アプリケーションにObjectKey を通知する
- s3 をバックエンドにした CloudFront を構成し、署名済み URL で配信する
今後の課題
このようにしてs3へのアップロードから配信まで自動化されたVOD配信システムを実現することができました。m3u8 / mpd の配信時には短命な署名済み URL を用いているので、閲覧権限のないユーザに URL を共有された場合でもすぐに URL が無効となるため不正な閲覧も保護できます。
一方で課題も有り、 m3u8 / mpd の中身について思いを馳せますと、これらには署名されていない状態のパスが保管されているため、現状では完全にURLが保護されている状態では有りません。
このため、コンテンツ保護については課題がある状態です。これについては m3u8/mpd の動的生成や、SPEKE での DRM などによって対応を進める必要があるでしょう。
感想
自宅のサーバで動画を管理していたころは ffmpeg の設定だけでも苦労したものですが、AWS Media サービスを利用することで手軽に HLS /MPEG-DASH での動画配信を実現でき、感動しました。また、DRMについてもソリューションプロバイダとの連携であれば比較的容易に実現できそうで、機会があれば触れてみたいです。
明日は id:nabe1216 さんです!