この記事は、 AWS S3 + CloudFront で動画ストリーム に関連する続きです。
目的
- ストリーミングをiOSに対応 事前調査はこちら
- プライベート(閲覧制限あり)にCloudFrontで配信 事前調査はこちら
- iOS用にHLSに対応させつつ、プライベート最新を実現 <今回はこれが主目的
方法
JAWS Days 2014 の発表に方法が記載されています。
CloudFrontで実現するセキュアコンテンツ配信と効果のトラッキング のp17に記述があります。
Signed URLの生成
Signed URLはURL個々にワンタイムURLを生成して、一定時間閲覧を解除しますが、ワイルドカードでURLを指定でき、それを用いることで、 .ts ファイルを含むディレクトリに対して有効な署名を手に入れることが出来るようです。
boto (Pythonモジュール)の場合、create_signed_urlメソッドに、policy_url (str)を与えれば生成可能。
http://boto.readthedocs.org/en/latest/ref/cloudfront.html
マニフェストファイルの書き換え
先に紹介した、JAWS Daysの資料によると、 .m3u8 という拡張子のマニュフェストファイル内の .tsファイルのURIを、ドメインを付加して、さらにSigned URLにして書き換えるというものです。
これを動画閲覧のタイミングで動的に行えば可能になる。
マニフェストファイルは以下の様な簡単なフォーマットだったので、 "#" から始まらない行を書き換えれば良さそう。(簡単なパーサで実現可能)
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXTINF:10.866922,
hls_400_00000.ts
#EXTINF:10.817778,
hls_400_00001.ts
#EXTINF:10.815044,
hls_400_00002.ts
.
.
.
#EXT-X-ENDLIST
マニフェストファイルの動的書き換え
これをどこで、どのタイミングで行うかが悩みどころ・・。
検討している方法としては、アプリケーションサーバ(今回はPloneを想定)で、S3(又はCloudFront)から、オリジナルマニフェストを取得し、Signed URLに書き換えて、それを配信。
URLにアクセスが有るたびに、毎回この書き換えを行う付加がどのくらいかの検討が必要そう。とくに、PCアクセスの場合は、HLSではなく、RTMPでの閲覧になるのでこの変換が不要。
アプリケーションサーバのマニフェストファイルへのアクセスが発生した時に行えば、RTMPの時は不用意に変換する必要がないので、問題が無いかも。(Video.jsが2つのSourceを選択してくれるので、これで大丈夫そうな気がしてきた)
まとめ
各種技術を統合することで、希望の機能の実装が実現できそうな状況になったと思う。
実際には、この方法でストリーミングが出来るかどうかを実験してみようと思う。
TODO
- Signed URL Custom Policy (ワイルドカードで許可コンテンツの指定) を試す
- マニフェストファイルを書き換えて対応可能かどうか実験