この記事は「もくもく会ブログリレー」 7日目 の記事です。

アイレット社内でLT大会のイベント配信を、趣味の一環として行っております佐藤です。
先日開催された「もくもく会LT大会」でも社内向けに配信対応をさせていただきました。

若手の情熱炸裂!社内で開催したもくもく会発LT会

嬉しいことにイベント開催後に「アーカイブが見たい!」という声もあがりました。
が、録画を忘れているという失態…。

しかし幸運なことに、裏で練習としてAmazon Interactive Video Service(Amazon IVS)へもひっそりと配信し、設定で「配信記録を有効化」としていました。
S3バケットを確認すると、確かにデータ保存されている。なんという僥倖。

下図のようにS3に保存されていたAmazon IVSの録画データ(HLS形式)をアーカイブ公開できないか?と考え、公開方法について模索しましたのでシェアさせていただきます。

アーカイブ公開方法

今回調べていく過程で、下記3つのアーカイブ公開方法を検討しました。

  • CloudFront経由でS3保存のアーカイブデータを公開する
  • プレイヤー用のWebサーバを構築してアーカイブデータを公開する
  • HLS形式をMP4に変換して共有フォルダへ保存する

それぞれの良し悪しを確認していきます。

アーカイブ公開方法を検討する

結論、最終的にはコストや運用の容易さを考慮し、下記2パターンを採用しました。

今回は下記2パターンでデータを提供しました。

  • メイン:HLS形式をMP4に変換して共有フォルダへ保存(PCユーザ)
  • サブ:CloudFront + S3によるアーカイブ配信(モバイルユーザ)

考えにたどり着くまでの迷走について下記記載しますので良ければご覧ください。

CloudFront + S3によるアーカイブ配信

一番簡単な構成ですが、Chromeでアクセスした際に「m3u8」ファイルのダウンロードとなってしまいました。

  • メリット
    • CloudFront  + S3の組み合わせで簡単に作成ができる
  • デメリット
    • 閲覧可能なデバイスやブラウザがある
      • PCブラウザの場合は「Safari、Edge」での閲覧が必要。
      • Chromeは拡張機能の利用など、クライアント側で別途対応が必要。
      • 社内限定としたい場合、IP制限のためにWAF設定が必要。

SafariやEdgeでアクセス、もしくはモバイルユーザを想定していれば問題なさそうです。
クライアント側に依存する方式のため、最終案としては保留となりました。

プレイヤー用にWebサーバを構築してアーカイブ配信

先ほどのCloudFront + S3構成に、追加でプレイヤー用のWebサーバを構築する方式です。
クライアント依存が無くなるため、こちらが理想形でした。

  • メリット
    • クライアント環境に関係なくHLS形式の動画が閲覧可能
    • セキュリティグループでIP制限が可能
  • デメリット
    • Webサーバ構築のコストと手間が発生する

しかし、残念なことにインフラ畑で育ったフロントエンド弱者のわたしです。
各種公開されているプレイヤー構築用のリポジトリに敗北しました。
また、Webサーバを常時起動させるコストを考えると、社内イベントのオマケ提供としてはやり過ぎ感が出てしまうため保留となります。

HLS形式をMP4に変換して共有フォルダへ保存

いっそのことMP4に変換して保存すれば良いのでは?と考えに至りました。
AWSサービス「AWS Elemental MediaConvert」を利用することでm3u8をmp4に変換を行えることに気づき、AWSサービスで完結出来ました。

また、クライアント提供時にクライアント側でのダウンロード通信量は発生しますが、各自見たい時に見れる&長期保存可能という点では最強の手法と考えます。

  • メリット
    • オンラインストレージや、社内共有フォルダなどに保存可能
    • コストが安価で済む
    • 会議ツールの録画機能で保存したデータを格納する運用と変わりがない
  • デメリット
    • MP4データの管理が必要
    • m3u8データをmp4に変換する手間がある

コストやクライアント側の手間を考えた結果、今回はこちらのmp4変換方式でのアーカイブ公開を採用に至りました。

設定方法/使い方

続いて設定方法等についてご紹介します。

ログ保存先の前提
・AmazonIVS ログ保存先S3バケット名:ivs-log-s3testbucket

CloudFront+S3公開方式

設定手順は下記を参考にします。
・手順参考:プライベートバケットからの録画コンテンツの再生

AWSマネジメントコンソール > CloudFront > ディストリビューションを作成をクリック

オリジン:設定参考

Origin domain ivs-log-s3testbucket.s3.ap-northeast-1.amazonaws.com
Origin path /ivs/v1/(AWSアカウントID)/…./media/hls
名前 ivs-log-s3testbucket.s3.ap-northeast-1.amazonaws.com
オリジンアクセス Origin access control settings (recommended)
Origin access control OACを新規作成して設定

※Origin pathは設定したほうがアクセスする際のURL指定が短くなったり、AWSアカウントIDを隠せます。状況に応じて設定しておくと良いです。

デフォルトのキャッシュビヘイビア:設定参考

AWS公式ユーザーガイドにも記載されている通り「キャッシュキーとオリジンリクエスト」の箇所で「CORS-S3 オリジンリクエストポリシー」と「SimpleCORS レスポンスヘッダーポリシー」を設定します。

ウェブブラウザから再生するには、必ず と S3 バケットの両方で CloudFront CORS を設定してください。 CloudFront 設定については、「オリジンリクエストポリシーの作成」の手順に従って、CORS-S3 オリジンリクエストポリシーと SimpleCORS レスポンスヘッダーポリシーを CloudFront ディストリビューションにアタッチします。以下の設定コンソールページの例を参照してください。

キャッシュキーとオリジンリクエスト Cache policy and origin request policy (recommended)
キャッシュポリシー CachingOptimized
オリジンリクエストポリシー CORS-S3Origin
レスポンスヘッダーポリシー SimpleCORS

他の設定項目については、各自の環境に合わせて設定を行います。
今回は一時的に公開するため、上記以外はデフォルト設定として発行されたCloudFrontのURLにアクセスします。

SafariやEdgeで「https://(ディストリビューションドメイン名)/master.m3u8」で動画が再生されればアーカイブ公開完了です。

m3u8→mp4変換方式

今回は変換にAWSサービスとして「AWS Elemental MediaConvert」を利用します。

AWS Elemental MediaConvert は、あらゆるサイズのコンテンツライブラリを持つ動画プロバイダーが、ブロードキャストおよびマルチスクリーン配信向けに、オンデマンドコンテンツを簡単かつ信頼性の高い方法でコード変換できるファイルベースの動画処理サービスです。

AWSマネジメントコンソール > AWS Elemental MediaConver > ジョブの作成を選択します。

入力ジョブの設定

入力ファイルに変換したいHLS形式の動画となる「master.m3u8」を指定します。

出力グループの設定

続いて出力グループ > 追加をクリックします。
今回はm3u8形式からMP4形式に変換したいため、「ファイルグループ」を選択します。

ファイルグループの設定を図の通り設定します。
設定値は出力したいS3バケットやプレフィックスを設定します。

「出力:名前修飾子」は変換後のmp4のファイル名になるので、任意の値を設定します。

ジョブを作成すると、変換が開始されます。
下図の通りジョブのステータスが「COMPLETE」になると出力先のS3バケットにMP4データが保存されます。

変換にかかったコストなど補足情報

  • 録画データ:1時間20分
  • MP4変換に掛かった時間:20分程度
  • コスト:約 $1.5
    • $0.017/min – Asia Pacific (Tokyo) – HD, AVC/H.264, <=30 fps, Single pass, Basic Tier

AWS Elemental MediaConvert 料金」にも記載されている通り、動画時間80分程度の変換に対しての従量課金となりました。

出力するビデオの再生時間 (分) に応じたシンプルな料金体系です。

専用ソフトウェアを購入しなくても低価格で変換が出来たため、今回利用したなかでオススメのサービスのひとつとなりました。
今後も何かとお世話になる機能となるため、使い方は覚えておこうと思います。

最後に

配信初心者で模索しながら楽しんでいます。
AWSにも多くの配信に関わるサービスがあるため、引き続き配信をしながら紐づくAWSサービスを触ってみたいと思います。

明日の記事は、DX開発事業部山中 さんの「Route Handlersを使った秘匿化について」です。
今まで開発と交わることが無く経験の無い領域ですが、ブログリレーをきっかけに新しい技術領域に踏み込んでいければという所存です!