HLSライブストリーミングサーバーs3配信

こんにちはhagiです。

前回[AWS EFS でHLS配信](https://qiita.com/khagi/items/04421f4a80a5e3766203)を書きました。

>MediaServicesが出る前にNFSやs3fsで共有領域をマウントして配信を検討していた時期があったので「あの時あればどうなっていたかな？」という疑問を解決するためにやってみます。

そこで”ああ！s3格納の事書いてなかった”、となり今回はライブ配信をs3に格納する方法を記述したいと思います。

#はじめに

今回はライブ配信をAmazon s3に格納する方法を記述します。
もう少し細かく書くと[HLSライブストリーミングサーバーの構築 (ABR対応)](https://qiita.com/khagi/items/b99f5a36846d9ab65daa)で作成したHLSデータをs3から配信します。

![s3env.png](https://qiita-image-store.s3.amazonaws.com/0/226670/297382a1-997a-64f2-f19b-9ad4e254f1ae.png)


#Amazon s3とは

s3は格納ですがwebコンテンツの配信も可能です。
その上s3は `99.999999999% の耐久性` でスタティックコンテンツ配信するのには最強ではないでしょうか？
(個人的意見です)

```
Amazon s3
どこからでもお好みの量のデータの保存と取得が簡単に行えるオブジェクトストレージ
```
(https://aws.amazon.com/jp/s3/)

#ストリーミングサーバーの構築

まずは下記に記述している手順でHLSストリーミングサーバーを構築します。

[HLSライブストリーミングサーバーの構築 (ABR対応)](https://qiita.com/khagi/items/b99f5a36846d9ab65daa)をご確認ください。

##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から配信が可能となり配信サーバーのスケールを考える必要は無くなります。