7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS EFS でHLS配信

Last updated at Posted at 2018-08-21

#はじめに

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

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

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?