#はじめに
東京リージョンでも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のトップページ を開く
- ”ファイルシステム作成”をクリックし、”ファイルシステムアクセスの設定”と”マウントポイント設定”を行う。今回はデフォルトで設定
- ”次のステップをクリック”しNameタグの値を入力そのほかはデフォルト設定で”次のステップ”へ
-
設定した内容を確認し、”ファイルシステムの作成”を押下
-
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に置くまでが非常に面倒です。
今後ライブ配信環境に使えそうでいろいろ試したいと思います。