はじめに
東京リージョンでもEFSが出たのでEFSでのライブ配信を試します。
遅延を少し抑えられるのとスケールアウトがやりやすいかと思いますがCloudFrontに直接繋げられるMedia Storeがあるのであまり利用するケースが無いかもしれません。
MediaLiveを利用すれば出力をs3やMedia Storeに直接書き込みが出来それをCloudFrontのオリジンにすることも出来ます。
(ただMedia Store消すのが面倒なんですよねー、後MediaLive経由だとDestinationが2つ必要になるので。。。)
MediaServicesが出る前にNFSやs3fsで共有領域をマウントして配信を検討していた時期があったので「あの時あればどうなっていたかな?」という疑問を解決するためにやってみます。
環境
構成はこんな感じになります。
流れ
1. Videoを撮影
2. Encoderで取り込みtranscoderにrtmpで送出
3. TranscoderでrtmpをHLSに変換してEFSに格納
4. ViewerがELB経由でWebserverにマウントされたEFSのHLSコンテンツを閲覧
Video、Encoder
こちらはなんでもいいですがトランスコーダーはnginxのrtmpモジュールを利用するのでrtmpで配信できるエンコーダーを利用します。
私はMacbook Proの内部カメラと無料のOBSエンコーダーでrtmpを投げます。
OBSの使い方の詳細が気になる方はobsprojectをご参考ください。
Transcoder
トランスコーダーはnginx+rtmpモジュールを利用。
構築方法は以前の記事HLSライブストリーミングサーバーの構築 (ABR対応) をご参考ください。
Webserver
ウエブサーバーはなんでも良いのですが今回はnginx(https://nginx.org) で行います。
EFS
EFS作成
AWS EFSのトップページ を開く
1.”ファイルシステム作成”をクリックし、”ファイルシステムアクセスの設定”と”マウントポイント設定”を行う。今回はデフォルトで設定
1.”次のステップをクリック”しNameタグの値を入力そのほかはデフォルト設定で”次のステップ”へ
1.設定した内容を確認し、”ファイルシステムの作成”を押下
2.EFSが作成されます。
EC2でマウント
amazon-efs-utilsインストール
Amazon Linuxでマウントする場合、amazon-efs-utils パッケージが提供されています。こちらインストールするとstunnelパッケージもインストールされます。
amazon-efs-utils.noarch : This package provides utilities for simplifying the use of EFS file systems
stunnel.x86_64 : An SSL-encrypting socket wrapper
$ sudo yum install amazon-efs-utils
マウント
$ sudo mkdir /efs_mnt $ sudo mount -t efs fs-XXXXXXXX:/ efs_mount
マウント確認
# mount proc on /proc type proc (rw,relatime) sysfs on /sys type sysfs (rw,relatime) /dev/xvda1 on / type ext4 (rw,noatime,data=ordered) devtmpfs on /dev type devtmpfs (rw,relatime,size=2010440k,nr_inodes=502610,mode=755) devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /dev/shm type tmpfs (rw,relatime) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime) fs-XXXXXXXX.efs.ap-northeast-1.amazonaws.com:/ on /efs_mnt type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=XXX.XXX.XXX.XXX,local_lock=none,addr=XXX.XXX.XXX.XXX)
ライブ利用ディレクトリーの作成
$ mkdir /efs_mnt/livetest
EFSのアンマウント
(すごくどうでもいいことなのですがアンマウントのコマンドが”ユーマウント”、一文字足して”unmount”にした方がよかったんじゃないのとこのコマンド打つ度に思う)
$ sudo umount /efs_mnt
ライブ利用領域のみマウント
EFS上にディレクトリーlivetestを作成してそこをマウントしました。
$ sudo mount -t efs fs-XXXXXXXX:/livetest /efs_mnt $ mount proc on /proc type proc (rw,relatime) sysfs on /sys type sysfs (rw,relatime) /dev/xvda1 on / type ext4 (rw,noatime,data=ordered) devtmpfs on /dev type devtmpfs (rw,relatime,size=2010440k,nr_inodes=502610,mode=755) devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /dev/shm type tmpfs (rw,relatime) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime) fs-XXXXXXXX.efs.ap-northeast-1.amazonaws.com:/livetest on /efs_mnt type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=XXX.XXX.XXX.XXX,local_lock=none,addr=XXX.XXX.XXX.XXX)
Transcoder
上記にも書きましたがトランスコーダーはnginx+rtmpモジュールを利用。
構築方法は以前の記事HLSライブストリーミングサーバーの構築 (ABR対応) 同様に作成します。
違いとしてはnginx.conf内のhls_pathをEFSを指定します。
nginx.conf抜粋
hls_path /efs_mnt/;
配信
配信方法はこちら
今回はOBSを使って投げています。
トランスコード確認
Transcoderで確認したけど問題なく書き込みが行われています。
削除も問題無いようです。
# ls /efs_mnt/ hagitest_high hagitest_low hagitest.m3u8 hagitest_mid # ls /efs_mnt/hagitest_high/ 19.ts 20.ts 21.ts 22.ts 23.ts 24.ts 25.ts 26.ts 27.ts 28.ts 29.ts 30.ts 31.ts index.m3u8
Webserver
ウェブサーバーはなんでも良いのですが今回はnginxで確認します。
EFSマウント
上記に記述した手順でEFSをウェブサーバーにもマウントをする。
トランスコーダーはlivetestをマウントしたのになぜウェブサーバーはEFS全体をマウントしたのか? - 複数のトランスコーダーを繋げてEFS上でディレクトリーをトランスコーダー別で分ける予定だったからです。
# mkdir /efs_mnt # mount -t efs fs-XXXXXXXX:/ /efs_mnt # ls /efs_mnt/ livetest
Nginx設定
簡易な設定
http { server { listen 80; include mime.types; default_type application/octet-stream; server_name localhost; add_header Cache-Control no-cache; add_header 'Access-Control-Allow-Origin' '*'; location / { types { application/vnd.apple.mpegurl m3u8; } root /efs_mnt/livetest; } }
Safariで問題なく再生
負荷分散
EFSを利用する利点としてトランスコーダーとウェブサーバーのデータを共有することと共にウェブサーバー同士でも共有できることかと思います。
ストリームデータを共有することによってスケールアウトも出来、負荷分散も可能となります。
そこで構成図に記述しました2台目のウェブサーバーを立ち上げELBに追加します。
ELB作成、AMI 作成、インスタンス起動
今更感のところもあるので
ポチ、ポチ、ポチ
EFSマウント、nginx.conf、nginx起動
上記を参照
ELBに追加
ポチ
再生
ELBからの再生も問題ない
最後に
EFSを長期的に利用した訳ではないので何ともいえませんが、利用方法によってはかなり便利だと思いました。
一つはスケールアウトが非常に簡単。EFSをウェブサーバーにマウントしてELBに追加するだけ。
もう一つはs3に転送するよりも圧倒的に簡単です。s3から配信するユースケースがあるとは思いますがライブ動画データをs3に置くまでが非常に面倒です。
今後ライブ配信環境に使えそうでいろいろ試したいと思います。