Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

AWS EFS でHLS配信

はじめに

東京リージョンでも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に置くまでが非常に面倒です。

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?