暮らしの技術

暮らしを豊かにする技術や、特に暮らしを豊かにしない技術があります

開発合宿で AWS メディアサービスをつかってVOD動画配信の仕組みを作ったときの話

この記事は はてなエンジニア Advent Calendar 21日目の記事です。昨日は id:papix さんでした。

この記事では、はてなの開発合宿で AWS メディアサービスをつかってVOD動画配信の仕組みを作ったときの様子を紹介します。

初期のアーキテクチャ

合宿初日にチームメンバーの id:masawadaid:hokkai7goAWSのドキュメントを眺め、以下のようなアーキテクチャを目指すことにしました。

f:id:side_tana:20191221101655p:plain

配信までの流れは以下のとおりです。

- アップロード用の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 で行うように変更しました。

最終的なアーキテクチャ

f:id:side_tana:20191221103608p:plain

- アップロード用の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 さんです!

*1:これは今考えるとたしかに難しいですね。