こんにちはhagiです。
前回AWS EFS でHLS配信を書きました。
MediaServicesが出る前にNFSやs3fsで共有領域をマウントして配信を検討していた時期があったので「あの時あればどうなっていたかな?」という疑問を解決するためにやってみます。
そこで”ああ!s3格納の事書いてなかった”、となり今回はライブ配信をs3に格納する方法を記述したいと思います。
はじめに
今回はライブ配信をAmazon s3に格納する方法を記述します。
もう少し細かく書くとHLSライブストリーミングサーバーの構築 (ABR対応)で作成したHLSデータをs3から配信します。
Amazon s3とは
s3は格納ですがwebコンテンツの配信も可能です。
その上s3は 99.999999999% の耐久性
でスタティックコンテンツ配信するのには最強ではないでしょうか?
(個人的意見です)
Amazon s3 どこからでもお好みの量のデータの保存と取得が簡単に行えるオブジェクトストレージ
(https://aws.amazon.com/jp/s3/)
ストリーミングサーバーの構築
まずは下記に記述している手順でHLSストリーミングサーバーを構築します。
HLSライブストリーミングサーバーの構築 (ABR対応)をご確認ください。
s3への転送
ライブ配信はコンテンツの提供タイミングが非常に重要です。
HLSはそもそもセグメントに分けられており、プレイリストはセグメント毎に更新されクライアント(視聴)はプレイリストに記述されたデータファイルを取りにきます。
そこでEC2上で作成したストリーミングサーバー(この構成の場合はトランスコーダーですが。。。)でセグメントやプレイリストが出来次第s3に転送する必要があります。
いろいろ方法はあると思いますが今回紹介したいのがinotifyを使ったincrondです。
incrond
inotifyのcronデーモンとなります。
inotifyの仕組みを使ったcronデーモンでファイルの作成、編集、削除を検知しそれに合わせてコマンドやスクリプトをcronのように実行できます。
inotifyとは
inotify (inode notify) とは、ファイルシステムへの変更を通知するようファイルシステムを拡張して、その変更をアプリケーションに報告するLinuxカーネルサブシステムである。inotifyに先行して存在し、類似の目標を持つdnotify(英語版)は、inotifyに取って代わられている。
https://ja.wikipedia.org/wiki/Inotify
incronのインストール
$ sudo yum install incron
デーモンの起動
$ sudo /etc/init.d/incrond start
デーモンのヘルプ
$ incrond -h incrond - inotify cron daemon (c) Lukas Jelinek, 2006, 2007, 2008 usage: incrond [<options>] <operation> may be one of the following: These options may be used: -?, --about gives short information about program -h, --help prints this help text -n, --foreground runs on foreground (no daemonizing) -k, --kill terminates running instance of incrond -f <FILE>, --config=<FILE> overrides default configuration file (requires root privileges) -V, --version prints program version For reporting bugs please use http://bts.aiken.cz
incrontab
incrondにて登録をする際incrontabコマンドを利用します。crontabと利用方法は似ています。
incrontab man ページ
$ man incrontab : : -l (or --list) option causes the current table is printed to the standard output. -r (or --remove) option causes the current table (if any) is permanently remove without any warning or confirmation. Use with caution! -e (or --edit) option causes executing an editor for editting the user table (see below for the information about editor selection). You can edit your incron table now. If the table is changed it stores the modified version. -t (or --types) option causes the list of supported event types (delimited by commas) is printed to the standard output. This feature is intended for front-end applications to find out which event types was compiled in. -d (or --reload) option causes reloading the current table by incrond(8). It is done through "touching" the table (writing into it without modifying it). This feature is intended e.g. for creating watches on newly created files (with already existing rules) or for rearming IN_ONESHOT watches.
incrontab man ページ セクション5
$ man 5 incrontab : : EVENT SYMBOLS These basic event mask symbols are defined: IN_ACCESS File was accessed (read) (*) IN_ATTRIB Metadata changed (permissions, timestamps, extended attributes, etc.) (*) IN_CLOSE_WRITE File opened for writing was closed (*) IN_CLOSE_NOWRITE File not opened for writing was closed (*) IN_CREATE File/directory created in watched directory (*) IN_DELETE File/directory deleted from watched directory (*) IN_DELETE_SELF Watched file/directory was itself deleted IN_MODIFY File was modified (*) IN_MOVE_SELF Watched file/directory was itself moved IN_MOVED_FROM File moved out of watched directory (*) IN_MOVED_TO File moved into watched directory (*) IN_OPEN File was opened (*) : : IN_DONT_FOLLOW Don't dereference pathname if it is a symbolic link IN_ONESHOT Monitor pathname for only one event IN_ONLYDIR Only watch pathname if it is a directory
登録内容確認
$ sudo incrontab -l
登録
$ sudo incrontab -e
ライブ配信の転送
上記のincrondを利用してm3u8の書き込みが完了した際にs3に転送するよう設定することができます。
例:
例えばtest.m3u8が変更、作成、削除された場合、s3_sync.shを実行し一度だけ実行して重複して実行しない。
$ sudo incrontab -l /live/test.m3u8 IN_MODIFY,IN_CREATE,IN_DELETE,IN_NO_LOOP s3_sync.sh
それでs3_sync.shに下記のようにs3 syncコマンドで実行する。
aws s3 sync /live s3://XXXXXXX/live/
最後に
結論としてはs3にHLSのファイルを転送するにはincrondは使えます。
転送されたあとs3から配信が可能となり配信サーバーのスケールを考える必要は無くなります。