Concrete CMS で有料課金も視野に入れたライブ配信システムを考える (YouTube Live や AWS Media Service)



## 最初におことわり & 結論

この記事は、かなり支離滅裂になってしまいました。

もともとは Amazon が発売開始した、Amazon Elemental Link という、$995 のデバイスを使って気軽に AWS のライブ配信ができるのではないかと思ったのですが、まだ東京リージョンではサービスを開始していないのと、一つの AWS アカウントにしか紐付けられないという欠点もあることが分かったので、単純に concrete5 CMS と AWS Media Services を使って、有料も可能な安価な配信ネットワーク構築ができるよという記事になってしまいました。

なので文章の流れがおかしかったりしますが。僕のシステム構築の脳みその中身を見たつもりで生暖かく見守ってください。

補足：2020年7月、AWS が Instant Video Service (IVS) というサービスを開始しました。これは、他の MediaServices 以上に迅速にライブ配信を開始できるサービスです。まだ東京リージョンでは開始していないのですが。

**結論：視聴者 100名ぐらいで1時間のライブ動画配信をしようとしたら、だいたい、インフラの原価は $40~50 ぐらいでできそうです。**

concrete5 CMS などのセットアップ、ライブ配信の機材などは考慮しないといけませんが。

## はじめに

Concrete CMS と、YouTube か AWS 等のサービスを使うことで、動画のライブ配信ソリューションを作れるのではないかと考えたので、そのながーいメモです。

YouTube では、チケットを販売して有償で見るようにすることは、1000名以上の登録者と過去12ヶ月に4000時間の視聴時間を稼いでいるチャンネルでしか出来ません。支払いは Google に対して行い、手数料も 40% ほど徴収されます。（手数料の40%は、実は「格安」なんですが・・・。）

また、YouTube を使わないでプライベートで配信したいときもあります。企業の株主総会や社内向けメッセージ、プライバシーに厳しい学校・団体の行事の配信を行いたいときです。

YouTube は、誰にでも「限定公開」を使うとなんちゃってプライベート配信が出来ます。しかし、リンク先が漏れてしまう可能性があります。

そこで、concrete5 CMS と YouTube や AWS Media Services を使って少しセキュアなライブ動画配信プラットフォームを考えてみました。

## 会員管理は concrete5 で

### concrete5 と標準で搭載されている強力な会員システム

concrete5 は、ISO27001 情報セキュリティシステムの認証を受けた CMS です。

基本的な会員管理の仕組みが備わっており、

会員登録、Facebook・Twitter・Google ログイン連携、グループ管理、権限機能もアドオンなしで標準搭載されています。

手動でよければ、会員登録をユーザーにさせるけれど、一時的に保留にし、目視確認をして手動でアカウントを有効化させることができます。

加えてカスタマイズを行うことで、様々な会員登録を行うことができます。

企業の社員システム (AD, SAML, SSO) と連携して全社員数千人分のデータと連携する仕組みも大企業数社ですでに実践済。部署に応じて閲覧できるページを制限する仕組みも出来ています。

マガジンサイトの月額定期購読システムも作って、定額課金のシステムと組み合わせて、会員限定コンテンツを閲覧できるようにしています。

concrete5 ではすでに会員管理の仕組みはできているので、あとは、この concrete5 のログインしたユーザーだけに動画を埋め込んだページを見せれば良いです。


### ライブ配信の会員管理のパターン

いくつか会員をどう管理するかを考えてみました。

#### 案1: 購入者全員に共通の ID & Password 発行案

Doorkeeper や Peatix などのオンライン決済でチケット販売をします。
そして、購入者全員に、共有のID & Password を一斉に送って、同じ ID & PW でログインしてもらいます。

※ concrete5 の一部のセキュリティ保護設定 (別IPログイン、別 User Agent でのログアウト機能) をオフにする必要があります。

#### 案2: 購入者全員のアカウントを concrete5 で作成し、アカウントが登録されたことを案内する

- Doorkeeper & Peatix などで、購入者のメールアドレス一覧を入手
    - Peatix 等では申込みフォームにメールアドレスを収集できるようフォームを作成しておく
- concrete5 でメールアドレスでログイン許可をするように設定変更
- メールアドレスをベースに会員登録
    - コンクリートファイブジャパン社製の [CSV 一括インポートアドオン](https://github.com/concrete5cojp/addon_csv_user_import_export) などで一括インポート
- 会員登録後、concrete5 のグローバルリセット機能を使い会員全員にパスワードを設定するようメールを送信。(グローバルリセットの文言を一時的にカスタマイズして配信も可能)
    - インポートアドオンを修正し、インポート時にユーザーアカウントが生成されたメッセージを送付することも可能。
    - メモ: V9 でグループ一括メッセージ機能も標準装備される。

#### 案3: なんらかの形でユーザーを自動連携 & 決済対応する

Active Directory (LDAP), SAML サーバーと連携ができたり、SSO との統合も可能。
なんらかの形でユーザーが自動連携できるような仕組みを作ることが可能。

今までも以下のシステムと連携したことがあるのでいろいろ可能かと。

- LDAP
- SAML
- CSV
- SSO
- Amazon Pay, Stripe 決済対応等
  

### concrete5 サイトのインストール先サーバー

concrete5 サイトの運用には共用サーバーか AWS では EC2 インスタンスを走らせる必要があります。

予想される同時アクセス数に応じてインスタンスサイズを変更する必要がありますが、

視聴者が、数十人程度であれば、 t3.micro。100名ほどであれば、t3.small ぐらいでしょうか。
AWS の利用料金としては、月額$10～$30ほどになります。

また、セキュリティ的に問題がなければ、concrete5 自体は、AWS 上に存在する必要はないので、視聴者が十数名程度であれば共用サーバーで開催しても問題はないと思います。

予想する視聴者が百名を超えそうでされば、AWS の専用サーバーを考慮しても良いかと思います。

一番考慮するべき点は、合計のアクセス数ではなく、視聴開始時にサーバーに秒間での同時アクセス数がどれほどになりそうかが基準になります。


## 配信プラットフォームソリューションを考える：第1候補は YouTube

1つ目の質問は、YouTube のシステムで良いか、NGか。

YouTube のシステムで良ければ、絶対にそっちのほうが楽です。そっちを使いましょう。視聴者参加型にしたくて Zoom などの少人数か、より高いウェビナーライセンスでも構わないというのであれば、Zoom も選択肢になると思います。但し Zoom はページの埋め込みができません。

とにかく、YouTube を使うのがいちばん手っ取り早い、この配信が商業目的ではなければ、案1が有効です。


## ソリューション案1: YouTube ライブ & concrete5 でログイン保護する：フロー手順

- concrete5 で会員管理
- YouTube アカウントを取得もしくはすでにあるアカウントを使う（アカウント取得であると数日準備が必要。）
- YouTube Live の公開を「限定公開」に設定する
- 作成した YouTube リンクを、concrete5 の視聴者限定ページに入れる。標準で搭載されている「YouTube Video」ブロックに、URL を入れる


### YouTube Live 利点

- 圧倒的に安価でできる
- 動画エンコーディング、圧縮、データ配信の手間が省ける (後述の AWS がどれだけ面倒かを参考にしてください)
- concrete5 の会員登録の仕組みだけに集中できる

### YouTube Live の欠点

- YouTube の利用規約に反した配信ができない（特にチケット販売をして商売をすること）
- YouTube のプラットフォームで動画を流すことは、会社のコンプライアンスや視聴者のプライバシーを気にする方には合わない
- HTML のソースコードを解読すれば YouTube の動画情報を取得できるので外部に漏れてしまう。

なので、ソリューション案1は、商用利用をしないし、もし万が一、YouTube のリンクが外部に漏れてしまっても大丈夫な対策などを行う場合に有効です。

YouTube のリンクが漏れないように、動画埋め込みページは、動画配信開始の30分前まで公開しない (concrete5 にはスケジュール公開機能がついています）

ライブ動画配信が終わったらアーカイブ録画公開はせずにすぐに動画をクローズすることで、YouTube のリンクを知っていても後日視聴はできません。


### YouTube Live 案のユースケース

会員を限定させたいけれど、漏れてもそんなに大事にならない、視聴者にはお金を徴収しない配信。

- 学校の入学・卒業式
- 地元の商店街・商工会の会合
- NPOや任意団体の会議
- 自治体の一般公開向けのライブ配信


## いままで：秘密の情報を扱っている場合は他の高額配信プラットフォーム

YouTube の限定公開では出来ない配信はたくさんあります。

- チケット販売をしての有償の配信
- 会社の社員向けのビデオメッセージ
- 株主総会

こういう時は YouTube 以外のビデオライブ配信プラットフォームを使う必要があります。

しかし、それらのプラットフォームは、だいたい初期費用10万円スタートの1配信、数十万からが多いです。



## これから：自前で比較的安価にスタートできるようになってきた

クラウドサービスを使っていくことと、すでにビデオカメラやパソコンが手元にある人は、
自前で準備することで実現できるようになってきました。


## その前に：自分が準備に費やす時間も価値があることを忘れずに

ただ結局は、自分がタダ働きをすることになりかねません。
料金が従量課金制になってくるので、ある程度の視聴者予測もしないといけなくなります。

イベント主催者などとの連絡の折衝も時間がかかります。

有料会員の登録作業など流れのフローを考えるのも時間がかかりますので、総合的に考えましょう。

結局、難しくて実現できず、業者さんにお金を払って頼んだほうが早かったという結果になりかねないです。


## ソリューション案2: AWS の Media Service を使って構築する

YouTube Live で配信したら考えなくて良いはずの（苦笑）ライブ動画配信の仕組みを作っていきます。

今回は AWS のサービスを使って配信するサービスを作っていきます。

利用するサービスは以下の通り

- AWS Elemental MediaLive
- AWS Elemental MediaPackage
- Amazon CloudFront

OBS などのソフトを使って、AWS Elemental Live に配信し、MediaStore もしくは MediaPackage を介して CloudFront で配信を行います。

今回は具体的に1時間のライブ配信を100名程度の視聴者を想定して AWS のセットアップの手順と利用料金を算出してみました。


※ AWS Elemental MediaStore も考えたのですが、ファイルの削除などが必要になるのとライブ配信に特化していることを考慮して今回は除外します。


### STEP 1: AWS Elemental MediaLive を設定する

AWS Elemental MediaLive とは、大元のライブ動画を、各デバイスに最適化したストリーミングを作成するサービスです。

例えば 30fps の9Mbps HD 画質を入力し、1080p 5Mbps、720p HD 2Mbps、576p SD 1.2Mbps、432p SD 0.8Mbps、288p SD 0.5Mbps の5本のストリームを配信する設定をします。

ここで、OBS などの配信システムから送るための URL をゲットします。

項目 | 価格
----|-----
入力 | $0.414 / 時間
出力 | $0.7452+0.7452+0.3708+0.3708+0.3708
合計 | $3.0168 / 時間 (冗長化させるのであれば倍)

もしも、継続的にライブ配信を行うのであれば、$995 で発売される、Elemental Live エンコーダーを購入するのも良いかもしれません。ただ、このデバイスはアカウントに紐付けられるということなので配信先・AWS からの請求が限定されてしまいます。


### STEP 2: AWS Elemental MediaPackage + Amazon CloudFront を設定

ライブ用に複数の動画エンコーディングを行ったら実際に配信できるファイルなどをパッケージングする作業をします。
この時には一般的には CDN と呼ばれるコンテンツ配信ネットワークを介して配信します。

ここで、ウェブサイトに埋め込みをするための「.m3u8」ファイルのリンク先を生成します。

料金は、さきほどの5本のストリーミングを基本に計算します。

視聴者が100名で、1人平均3Mbpsぐらいである


3/1024bps x 60秒 x 60分 x 100名/8 = 131GB
131GB x 0.114 = $14.934

CloudFront キャッシュ率が90%ととして、

131x0.10 = 13.1GB


項目 | 価格
----|-----
入力 | 0.3674 USD (冗長化させるのであれば倍) / 時間
出力 | $0.655 / 100名時間
CloudFront | $14.934 / 100名時間 
合計 | $15.589

ここの料金は視聴者が増えていくと価格がどんどん増えていきます。

また、よりセキュアな配信を行うため、CloudFront の署名付きURLの AWS 側の設定もここの段階で行います。(1行だけですがちょっと複雑)


### STEP 3: concrete5 の会員限定ページに AWS Elemental MediaPackage+CloudFront で生成されたマニフェストファイルを埋め込む

生成されたCloudFront のエンドポイントを、会員限定ページに埋め込みます。
video.js などのライブラリを使って埋め込むのが良いです。

ここでは手順を省きますが、concrete5 のHTML ブロックなどを使って埋め込んでいきます。

```
<head>
...
    <link href="https://vjs.zencdn.net/7.7.5/video-js.css" rel="stylesheet" />
...
</head>

<body>
  <video
    id="my-video"
    class="video-js"
    controls
    width="1280"
    height="720"
    poster="【サムネイル画像】"
    data-setup="{}"
    >
    <source src="https://XXXXXXXX.cloudfront.net/out/v1/XXXXXX/XXXXX.m3u8" type="application/x-mpegURL" /> /* URL は変更 */
    <p class="vjs-no-js">
      To view this video please enable JavaScript, and consider upgrading to a
      web browser that
      <a href="https://videojs.com/html5-video-support/" target="_blank"
        >supports HTML5 video</a
      >
    </p>
  </video>
  <script src="https://vjs.zencdn.net/7.7.5/video.js"></script>
</body>
```

【検証中】concrete5 では、CloudFrontのファイルを署名付きURLを生成配信するプログラムを作成することで、有効期限付き、そして追加でIPアドレス単位別々のURLを発行できるようになり、単純に配信先のURLを知っているだけでライブ配信を視聴できなくなります。

#### 考慮する点：ユーザーとのコミュニケーション

ここで、YouTube Live のようなチャットを受け付けるのかなど必要に応じてページに機能を追加する必要があります。リアルタイムチャット機能の導入はサーバーにより過剰な負荷を与えることになります。

Facebook Messenger、LINE グループ、チャットサービス、Slack などの既存のチャットを使ってグループチャットを別に使ったり、[slido](https://www.sli.do/)などのサービスを利用しても良いと思います。


### STEP 4: OBS などの配信ソフトに MediaLive のエンドポイントを設定

AWS Elemental MediaLive で設定した配信先の URL を入力。 OBS や Wirecast などのソフトや、 ATEM Mini Pro、LiveWedge、LiveShellX などハードウエアエンコーダーで設定します。。

```
rtmp://XXX.XXX.XXX.XXX:1935/XXXXX/XXXXXXXXXXX
```

### STEP 5: 配信本番

AWS Elemental MediaLive を有効にします。
ここで本格的な AWS 側の配信コンテンツの課金が始まります。

エンコーダーからも映像を送信開始します。

ユーザーに告知・案内・視聴をし、concrete5 の配信ページも公開します。

本番配信の開始です。

### STEP 6: 配信終了

Amazon MediaLive を停止します。

停止をするまで Amazon MediaLive は1時間毎に課金されます。最小単位は10分で毎分ごとに切り上げられるので、頻繁に開始・停止をすると料金がかさみます。


### AWS 料金見積合計金額

元ソースが 10Mbps 以下の HD ストリーミングを、5本の HD & SD ストリーミングに生成し、100名に1時間配信した時の見積です。

concrete5 だけ1ヶ月の見積にしています。


項目 | 合計
------|-------
会員管理 CMS (concrete5) | $20~ / 月
エンコーディング | $3.0168 / 時間
配信 | $15.589 / 100名時間
**合計** | $38.6058 / 100名時間


### 検証中

今回、検証できなかったのは、まだ、URL が漏れると他の人に動画を見られてしまう可能性があるので

- CloudFront のマニフェストファイルを有効期限付き URL の時間制限や IP アドレスをもうちょっと考える
- CloudFront の Cokkie 付き制限機能を加える

を検証中です。

有効期限付きURLにするのは別のシステムでは検証済なのでおそらくできると願います。

## 参考資料

AWS Elemental Live
https://aws.amazon.com/jp/medialive/
AWS MediaPackage
https://aws.amazon.com/jp/mediapackage/
AWS でライブ配信システムを構築する （１） 概要
https://qiita.com/masa_yam/items/9d4f491b3a1e310476f0
OBSとAWS Elemental MediaLiveでライブ配信をしてみた
https://dev.classmethod.jp/articles/live-aws-elemental-medialive-with-obs/
Video.jsのvideojs-http-streaming(VHS)を使ってHLS形式のストリーミング配信を再生する最低限度の設定
https://dev.classmethod.jp/articles/videojs-http-streaming-vhs-hls-streaming-minimum-setting/
HLS（HTTP Live Streaming）で動画を配信・再生してみよう
https://www.yaz.co.jp/tec-blog/web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/212
HTTP Live Streaming - Wikipedia
https://en.wikipedia.org/wiki/HTTP_Live_Streaming