はじめに

東京リージョンでもEFSが出たのでEFSでのライブ配信を試します。

遅延を少し抑えられるのとスケールアウトがやりやすいかと思いますがCloudFrontに直接繋げられるMedia Storeがあるのであまり利用するケースが無いかもしれません。

MediaLiveを利用すれば出力をs3やMedia Storeに直接書き込みが出来それをCloudFrontのオリジンにすることも出来ます。

(ただMedia Store消すのが面倒なんですよねー、後MediaLive経由だとDestinationが2つ必要になるので。。。)

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


環境

ライブ構成案.png

構成はこんな感じになります。


流れ

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作成


  1. AWS EFSのトップページ を開く

スクリーンショット 2018-08-03 16.12.42.png


  1. ”ファイルシステム作成”をクリックし、”ファイルシステムアクセスの設定”と”マウントポイント設定”を行う。今回はデフォルトで設定

スクリーンショット 2018-08-03 16.15.14.png


  1. ”次のステップをクリック”しNameタグの値を入力そのほかはデフォルト設定で”次のステップ”へ

スクリーンショット 2018-08-03 16.31.59.png


  1. 設定した内容を確認し、”ファイルシステムの作成”を押下


  2. EFSが作成されます。


スクリーンショット 2018-08-03 16.36.37-1.png


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で問題なく再生

スクリーンショット 2018-08-20 12.06.59.png


負荷分散

EFSを利用する利点としてトランスコーダーとウェブサーバーのデータを共有することと共にウェブサーバー同士でも共有できることかと思います。

ストリームデータを共有することによってスケールアウトも出来、負荷分散も可能となります。

そこで構成図に記述しました2台目のウェブサーバーを立ち上げELBに追加します。


ELB作成、AMI 作成、インスタンス起動

今更感のところもあるので

ポチ、ポチ、ポチ


EFSマウント、nginx.conf、nginx起動

上記を参照


ELBに追加

ポチ


再生

ELBからの再生も問題ない

スクリーンショット 2018-08-20 12.53.02.png


最後に

EFSを長期的に利用した訳ではないので何ともいえませんが、利用方法によってはかなり便利だと思いました。

一つはスケールアウトが非常に簡単。EFSをウェブサーバーにマウントしてELBに追加するだけ。

もう一つはs3に転送するよりも圧倒的に簡単です。s3から配信するユースケースがあるとは思いますがライブ動画データをs3に置くまでが非常に面倒です。

今後ライブ配信環境に使えそうでいろいろ試したいと思います。