Ant Media Serverを用いてWebRTCによる超低遅延ストリーミング配信

入社して３ヶ月半しか経っていないのに体重が６キロも増えてしまいました。幸せ太りなのでしょうか。どうも、streampackのfadoです。最近AWS Elementalのセミナーなどで新しい技術を学ぶ機会も増えてきてWebRTCについても触る機会がありましたので簡単ではありますがそれについて記事を書きたいと思います。

#WebRTCとは
* ウェブブラウザー上で専用プラグイン等がなくてもリアルタイムコミュニケーションを可能にする仕様です。
* 年々に仕様が改善されていき、注目度の高い技術です。
* オープンソースプロジェクトでGoogle,Mozilla,Operaなどにサポートされています。
* 基本的に通信プロトコルはリアルタイム性を実現させるためTCP/IPではなくUDP/IPを採用しています。

#注意事項
- Ant Media Server Enterpriseは料金がかかりますがFree trialで5日間無料お試し頂けます。
- こちらの手順はAWSアカウントをお持ちの方をターゲットにしています。
- 機能検証のため、推奨されているMongoDBのインスタンスタイプと全体構成をなるべく最小限にしています。
 - m5.2xlarge (Edge/Origin) , t2.micro (mongoDB)
 - Auto Scaling機能は利用していません。
 - EdgeとOriginサーバーに関してはt系ですとCPUクレジットの枯渇に陥る可能性があるため使いません。
 
#構築環境
AWS環境でAnt Media Serverを構築します。

https://antmedia.io/scalable-ultra-low-latency-streaming-service-on-aws/

Ant Media社が記載してくれた記事を参考に手順を説明していきます。

#構成
![N-Origin-N-Edge-Cluster-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/f611fe37-b8f3-13cd-678e-5aa30f891135.png)

出典：https://antmedia.io/scalable-ultra-low-latency-streaming-service-on-aws/

OriginとEdgeサーバーはクラスター構成となっています。

#リソース概要
1. **ALB**：パブリッシャーとプレイヤーからの接続を受け付けて、該当のターゲットグループにルーティングをさせます。
2. **Originサーバー（パブリッシャー）**：パブリッシュのリクエストを受け付けます。WebRTCストリームが入ってきたらストリーム情報をMongoDBサーバーに格納します。
3. **Edgeサーバー（プレイヤー)**：ストリーミングの視聴リクエストを受け付けます。該当するストリーム情報をMongoDBサーバーから参照し、Originサーバーからのストリームをプレイヤーに返します。
4. **MongoDBサーバー** ：Originサーバーからのストリーム情報を格納し、必要に応じてEdgeサーバーにその情報を提供します。

#リソースのセットアップ
**■MongoDBサーバー**
1. AWSマネジメントコンソールからAMIとしてUbuntu 16.04を選択します。
2. ディスク容量はデフォルトの８GBにします。
3. セキュリティグループは Inbound 22(tcp) と 27017(tcp)を許可。ソースは対象VPCにします。
4. インスタンスへのログインが確認できたら、下記コマンドを実行し、MongoDBをインストールします。

```
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
```

5. /etc/mongod.confのbind_ipの値を 0.0.0.0 に変更します。

6. MongoDBプロセスをrestartします。起動時にプロセスが立ち上がるように設定します。

```
sudo service mongod restart
sudo systemctl enable mongod.service
```

MongoDBサーバーのセットアップはこれで完了です。

**■Originサーバー**
1. AWS MarketplaceよりAnt Media Server EnterpriseのAMIを選択します。
2. インスタンスタイプは推奨されているm5.2xlargeにします。
3. 「高度な設定」→ユーザーデーターの欄には下記行を追加します。 {MongoIP}は先ほど設定したMongoDBのプライベートIPに設定します。

```
#!/bin/bash
cd /usr/local/antmedia
./change_server_mode.sh cluster {MongoIP}
```

4. セキュリテイグルーブはAMIデフォルトの設定に加えて、Inbound 5000 - 65000(tcp)を許可する必要があります。これはOrigin/edgeの間のreplicationにtcpプロトコルが使われるからです。

**■Edgeサーバー**
先ほどのOriginサーバーと同じ設定にします。

**■ALB**
1. Edgeサーバー用とOriginサーバー用1個ずつTargetグループを作成します。
2. リスナーは下記のように設定します。
http: 80 と http:5080　　　　転送先：Originサーバー用ターゲットグループ
https: 443 と https:5443 　転送先：Edgeサーバー用ターゲットグループ

#管理画面へのログイン

https://{ALBのドメイン名}/

![ant-media-loginpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/e6c6f259-def0-7042-bd81-c3efee53dc54.png)

ユーザー名：JamesBond (default)
パスワード：インスタンス ID （Originサーバー）

インスタンス IDはMongoDBサーバーにて下記コマンドで確認することも可能です。password フィールドをご参照下さい。

```
$ mongo
> use serverdb
> db.User.find()
```

```
{ "_id" : ObjectId("5d31612a4c79142df7c71914"), "className" : "io.antmedia.rest.model.User", "email" : "JamesBond", "password" : "i-1234567890abcdef0", "userType" : "ADMIN" }
```

ログイン後の画面は下記の通りです。各項目についてのご説明は今回は省かせていただきます。

![ant-media-loginpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/64ea06c3-b7a3-0605-1b60-3b864584a21c.png)

#WebRTCストリーミング配信のテスト

■ストリーミングのパブリッシュのテスト

https://ALBのドメイン名/WebRTCAppEE/ 

の「Start Publishing」で配信を開始できます。デフォルトストリーム名は stream1 です。

■ストリーミングの視聴のテスト

https://ALBのドメイン名:5443/WebRTCAppEE/player.html

の「Start Playing」で配信の視聴が可能です。

#結果
<img width="1421" alt="antmedia-webrtcstreaming.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/18817086-d3f3-8e9f-ac6e-18a13d410451.png">

- 検証ではWebRTC配信で0.5秒未満の超低遅延を実現できました。
- Auto Scaling機能と組み合わせればより耐障害性と可用性を高めることができます。
- 配信できるまでセットアップのハードルはそんなに高くないと感じました。
- 便利な世の中になりました。

#備考
- OriginとEdgeサーバーはCPUリソースを消費してしまうためインスタンスタイプのmシリーズよりもcシリーズが推奨されています。
- Ant Media Serverはあの有名なRed5から派生し、Java,C,C++で開発されています。
- 英語のみとなってしまいますがAnt Media社のサポートチームの対応はかなり早いです。

#参考文献
https://webrtc.org/
https://antmedia.io/scalable-ultra-low-latency-streaming-service-on-aws/
https://qiita.com/daitasu/items/ae21b16361eb9f65ed43
https://ja.wikipedia.org/wiki/WebRTC