本格的なオンデマンド動画配信サービスを構築するソリューションを試してみる
押川 令 (監修 : 稲田 大陸)
みなさん、こんにちは。ソリューションアーキテクトの押川令です。
みなさんは AWS ソリューションライブラリをご存知でしょうか。AWS ソリューションライブラリでは、AWS CloudFormation のテンプレートと共に導入までの手順が用意されており、それらを使ってすぐにソリューションのデプロイを行いお客様の課題に対応することが可能です。また、アーキテクチャ図やその説明、コスト試算なども用意されています。
そこで今回は、「AWS のビデオオンデマンド」というオンデマンドな動画配信 (ビデオオンデマンド:以降 VOD) にフォーカスしたソリューションをご紹介します。
コロナ禍による在宅時間増などの影響により、動画配信サービスなどを利用して家で娯楽を楽しむ時間が増えたと思います。そのような動画配信サービスでは、HTTPS 通信を利用でき専用のプロトコルが必要ない、マルチビットレート配信に対応しており最適なビットレートの映像データを配信することが可能であるなどの利点から、HTTP Live Streaming (HLS) 形式や MPEG-DASH 形式での配信が一般的になっています。これらの形式を用いた動画配信サービスを構築するためには、アップロードされた mp4 などの動画ファイルを変換するトランスコーダーの実装や、配信用のサーバーのホスティングなどが必要となります。
トランスコーダーや配信用サーバーについて Amazon EC2 などのサービスを用いて構築することも可能ですが、実装や構築に手間がかかりますし、起動している間はずっと課金されてしまうため、コストをカットするためにはこまめにサーバーを落とすなどの運用が必要となってしまいます。また、構築には動画配信関連技術についての理解が必要となりますし、高い可用性をいかにして担保するかといった面も自分で考えて設計する必要があります。
「AWS のビデオオンデマンド」では、世界中の視聴者に動画配信コンテンツをコスト効率よく配信するための 「AWS のビデオオンデマンド Foundation」と「AWS のビデオオンデマンド」の 2 つのソリューションを提供しています。基礎的な動画配信ソリューションである「AWS のビデオオンデマンド Foundation」は「サーバーレスに動画をスケーラブルにオンデマンド配信 ! ~「Video on Demand on AWS - AWS のビデオオンデマンド Foundation」を試してみる」で紹介をしています。
このソリューションを利用して、 AWS のマネージドサービスを用いたスケーラブルでコスト効率がよく、運用上の優秀性を備えた VOD ワークロードを構築してみましょう。トランスコーダーには AWS Elemental MediaConvert を用い、配信には AWS Elemental MediaPackage や Amazon S3、Amazon CloudFront を用います。
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
この記事のデモを無料でお試しいただけます »
毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。
AWS のビデオオンデマンド とは
「AWS のビデオオンデマンド」では、「AWS のビデオオンデマンド Foundation」と「AWS のビデオオンデマンド」の 2 つのソリューションが提供されています。
「AWS のビデオオンデマンド Foundation」では、S3 にアップロードされた動画を AWS Elemental MediaConvert でトランスコードし、S3 と CloudFront で配信するという基本的なアーキテクチャを構築できます。
「AWS のビデオオンデマンド」では、 それに加えて AWS Step Functions を用いて取り込み・処理・公開のワークフローをカスタマイズしたり、デバイスからのリクエストに応じたメディアフォーマットの制御や著作権管理のためのアクセス制御などを AWS Elemental MediaPackage で行うことができます。
今回は「AWS のビデオオンデマンド」のご紹介を行います。
クリックすると再生します
AWS のビデオオンデマンド と AWS のビデオオンデマンド Foundation の違い
今回ご紹介する「AWS のビデオオンデマンド」では、「AWS のビデオオンデマンド Foundation」 ソリューションを拡張し、AWS Step Functions による自動化、AWS Elemental MediaPackage による大規模配信を意識したメディアフォーマットの制御やデジタル著作権管理のためのアクセス制御への発展機能などいくつかの機能を追加しています。 具体的には、「AWS のビデオオンデマンド Foundation」に加えて、以下のような機能を提供しています。
- AWS Step Functions による取り込み、処理、公開ステップのオーケストレーション
- Amazon DynamoDB に入力ファイルのメタデータ、ジョブ設定、及び出力の詳細を保存
- AWS Elemental MediaPackage によるジャストインタイムパッケージングや著作権管理のためのアクセス制御 (DRM 処理) の機能 (オプション)
- ストレージコストの削減に役立つ、動画入力の自動アーカイブ (オプション)
アーキテクチャ図は以下のようになります。
使用している AWS サービス
本ソリューションでは、以下の AWS サービスを使用しています。
データの格納:配信したい動画ファイルのオリジナルを格納
Amazon S3 | 動画ファイル (変換前後) やログ (Amazon CloudFront、Amazon S3) のデータ保存に利用します。 |
ワークフロー:動画の取り込み、変換処理、公開処理
AWS Step Functions | 取り込み、処理、公開のステップ関数を作成し、実行します。 |
AWS Elemental MediaConvert | メディアファイルをソース形式からスマートフォン、タブレット、PC、その他のデバイスで再生するバージョンに変換します。 |
AWS Lambda | Step Functions での各ステップの作業を実行し、エラーメッセージを処理します。 |
Amazon DynamoDB | ワークフローを通じて取得した動画の情報を保存します。 |
Amazon CloudWatch | AWS Elemental MediaConvert のエンコードジョブを追跡し、完了時に通知のための AWS Lambda 関数をキックします。 |
Amazon Simple Notification Service(Amazon SNS) | ジョブの完了通知をメールにて送信します。 |
配信:動画をエンドユーザーに向けて公開
AWS Elemental MediaPackage | 1 つのビデオ入力から複数のデバイスで再生できるようにフォーマットされたビデオストリームを作成します。ジャストインタイムパッケージングにより、リクエストがあるたびにパッケージングを行うことによってオリジンの容量を節約することができます。 |
Amazon S3 | ストレージとしてだけでなく、動画配信時のオリジンサーバーとして利用することで、99.99 % の可用性を持った配信サーバーをサーバー管理不要で実現できます。 |
Amazon CloudFront | 動画配信時の CDN として利用します。 Amazon S3 上の変換された動画ファイルをオリジンとします。 CDN を活用することで、各クライアントにより近いエッジロケーションから動画が配信され、配信時のネットワークレイテンシの向上が期待できます。 |
Amazon Simple Queue Service(Amazon SQS) | ワークフローの出力を取り込みます。 |
コスト試算の例
このソリューションを実行するための総コストは、動画のサイズ、作成される出力数、公開コンテンツが Amazon CloudFront を介した配信量によって異なります。 詳細については、このソリューションで使用する AWS の各サービスの料金表ウェブページを参照してください。
2023 年 4 月時点で、東京リージョンで、次の表に示す各サービスの課金モデルを使用して、動画 60 分でこのソリューションを実行する場合の推定コストは、約 3.57 USD です。これにはファイルの大きさに依存する S3 の料金は含まれていません。 4K の動画ファイルを入力するとコストが増加すると推測されます。
サービス | 項目 | 料金 |
AWS Elemental MediaConvert | AVC codec, 1パス, 30 fps, マルチビットレート配信(2 HD解像度+ 3 SD 解像度) | $3.57 |
Amazon CloudFront | 無料利用枠。コストは CloudFront を介してビデオをどれだけ見るかに依存します。最初の 1 TB 分は無料です。詳しくはCloudFront の料金ページへ。 | $0 |
AWS Step Functions | 無料利用枠。1 か月あたり 4,000 回の状態遷移が含まれます。 | $0 |
AWS Lambda | 無料利用枠。1 ヶ月あたり 100 万件のリクエストが含まれます。 | $0 |
Amazon S3 | 新規のお客様に関しては無料利用枠が利用できます。ビデオのファイルサイズと長さによって料金がかかります。詳しくは S3 の料金ページへ。 | $0 |
Amazon DynamoDB | 新規のお客様に関しては無料利用枠が利用できます。 | $0 |
Amazon CloudWatch | 無料利用枠。基本モニタリングのメトリクスが含まれます。 | $0 |
Amazon Simple Queue Service (Amazon SQS) | 無料利用枠。1 ヶ月あたり 100 万件のリクエストが含まれます。 | $0 |
Amazon Simple Notification Service (Amazon SNS) | 無料利用枠。1 ヶ月あたり 100 万件のリクエストと 1000 件のメール通知が含まれます。 | $0 |
合計 | $3.57 |
デプロイ方法 / 設定方法
今回は、Foundations 版には存在しないオプション設定である 、AWS Elemental MediaPackage を用いた複数のストリーミング形式へのパッケージ化と、動画の自動アーカイブ設定も利用してみましょう。
ステップ 1 : AWS CloudFormation スタックの作成
それでは、AWSソリューションのデプロイ方法を見ていきましょう !
本ソリューションにて使用する CloudFormation テンプレートを実行するために、AWS のビデオオンデマンド のランディングページにアクセスします。 右側のタブ (Foundation がついていない方) を選択し、「AWS コンソールで起動する」を選択します。
クリックすると拡大します
CloudFormation が起動されて、スタックの作成の画面になります。
このソリューションの実装では、リージョンとして「東京」を選択することが可能です。「前提条件 - テンプレートの準備」、「テンプレートの指定」は変更せずにそのまま「次へ 」を選択します。
クリックすると拡大します
「スタックの名前」に任意の名前を入力します。「パラメータ」で入力が必須となっているパラメータは 2 つです。 Notification email address として後ほど SNS による通知を受け取る管理用のメールアドレスを設定します。Workflow trigger により、メタデータを取り込むかどうかの指定ができます。VideoFile を選択すると、ソース動画のみを取り込みます。MetadataFile を選択すると、メタデータファイルとソース動画を取り込みます。
今回は、Archive source content パラメーターを GLACIER にしてソース用の Amazon S3 バケットの Amazon S3 ライフサイクルポリシーを有効にし、アップロードしてから 7 日後に該当するファイルを Amazon S3 Glacier に移動する設定を行いました。さらに Enable MediaPackage パラメータを Yes にして AWS Elemental MediaPackage を有効にしてみました。実装ガイドの 14 ページを見て、その他のパラメータも適切に変更することが可能です。
クリックすると拡大します
「スタックオプションの設定」、「詳細オプション」は変更せずに、「次へ」を選択します。
「レビュー」で、CloudFormation のパラメータが指定した値で設定されていることを確認します。
クリックすると拡大します
レビューを下へスクロールし、「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れ、「スタックの作成」を押下しましょう。
クリックすると拡大します
スタックの作成中に SNS の確認メールが届くため、 「Confirm subscription」を押下しましょう。
クリックすると拡大します
スタックの作成が成功したことを確認します。作成完了までに 5 分程度かかります。
ステップ 2 : S3 イベント通知設定の変更 (オプション)
現時点でのデフォルトだと変換元動画を配置する S3 バケットに、以下の拡張子の動画ファイルが配置された際に、動画変換のジョブがキックされる設定になっています。
.h264, .m2ts, .m3u8, .m4v, .mkv, .mov, .mo4, .mpeg, .mpg, .mxf, .webm, .wmv (大文字でも可)
ここに含まれない動画にも対応をさせたい場合は、適宜こちらの S3 イベント通知設定の変更をしてください。
クリックすると拡大します
動作の確認
このソリューションのデプロイが完了した時点で、変換元動画を配置する S3 バケットに動画を配置するだけで、動画がオンデマンド配信されるようになっています。早速確認をしてみましょう。
ステップ 1 : 変換元動画のアップロード
video-on-demand-on-aws-source から始まる S3 バケット内に、配信したい動画ファイルをアップロードしてみます。
今回はこちらの画像のように mp4 の動画ファイルをアップロードしてみました。
クリックすると拡大します
ステップ 2 : Step Functions の動作確認
AWS のビデオオンデマンド では、取り込み、処理、公開の 3 つの Step Functions ワークフローが準備されています。取り込みワークフローを例にとって、成功していることを確認してみましょう。Step Functions のコンソール画面に移動し、Video-on-Demand-on-AWS-ingest ステートマシンの詳細を表示します。実行タブから先ほどのアップロードによりトリガされた実行の詳細を表示してみましょう。右のように、グラフビューでステートマシンの実行状況を見ることができます。
クリックすると拡大します
ステップ 3 : SNS によるジョブ完了通知
SNS から Workflow Status:: Complete:: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx のようなタイトルで、ジョブ完了通知のメールがきます。メールには右のように、変換元の動画のパスやコーデックなどの詳細情報と、変換後の CloudFront URL が記載されています。オプションの Elemental MediaPackage を利用したので、HLS、CMAF、MSS、DASH 方式でパッケージ化されたエンドポイントが記載されています。
クリックすると拡大します
Eemental MediaPackage を利用していないときは右のように、HLS 形式のエンドポイントのみが記載されています。
クリックすると拡大します
ステップ 4 : AWS Elemental MediaConvert のジョブ確認と S3 バケットの確認
AWS Elemental MediaConvert でジョブが実行されていることが確認できます。「入力」に表示されているソースが、上記で動画をアップロードした S3 バケットであることが確認できます。Output を複数の解像度で定義していたため、それら複数の Output が「出力」に表示されています。Apple HLS というリンクをクリックすると変換された動画が配置されている、video-on-demand-on-aws-destination から始まる S3 バケットに画面遷移します。
クリックすると拡大します
こちらの S3 バケットには、HLS の構成要素であるプレイリストファイル (.m3u8) とセグメントファイル (.ts) が配置されています。このバケットは、上記 SNS にて通知された CloudFront の配信用 URL のオリジンに設定されています。
クリックすると拡大します
ステップ 5 : DynamoDB テーブルの確認
Foundation 版からの変更点として、DynamoDB にワークフローを通じて取得したデータを保存しています。
DynamoDB のメニューから「テーブル>項目を検索」 を選択し、 Video-on-Demand-on-AWS テーブルを選択します。情報を見たい動画の guid を選択すると、その動画の情報を見ることができます。(メールで通知されたものと同じ)
クリックすると拡大します
ステップ 6 : 配信動画の確認
SNS にて通知された CloudFront の URL を使って配信動画を確認します。ここでは、OSS の動画再生ライブラリである Video.js を使って確認してみます。例えば以下のような test.html を利用して動画再生用の HTML ファイルを作成します。 <source> タグ内に CloudFront の配信用 URL (http://~~~.m3u8 もしくは http://---.mpd ) を記載してください。 また、MSS 形式については Video.js が 2023 年 4 月現在対応していないので、試してみたい方は他のライブラリなどをお使いください。
test.html (HLS/CMAF 形式用)
<html>
<head>
<title>Video.js Sample</title>
<link href="https://vjs.zencdn.net/7.15.4/video-js.css" rel="stylesheet">
</head>
<body>
<video
id="my-video"
class="video-js"
controls
preload="auto"
width="640"
height="360"
data-setup="{}"
>
<source
src="https://xxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index.m3u8"
type="application/x-mpegURL">
</video>
<script src="https://vjs.zencdn.net/7.15.4/video.js"></script>
</body>
</html>
test.html (DASH 形式用)
<html>
<head>
<title>Video.js Sample</title>
<link href="https://vjs.zencdn.net/7.15.4/video-js.css" rel="stylesheet">
</head>
<body>
<video
id="my-video"
class="video-js"
controls
preload="auto"
width="640"
height="360"
data-setup="{}"
>
<source
src="https://xxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index.mpd"
type="application/dash+xml">
</video>
<script src="https://vjs.zencdn.net/7.15.4/video.js"></script>
</body>
</html>
HTMLファイルを開くと動画再生ページが表示され、再生ボタンにてオンデマンド再生されることを確認できます。
クリックすると拡大します
リソースの削除方法
CloudFormation から、このソリューションのスタックを選択して削除します。これにより、 このソリューションで使用されている AWS リソースが、S3 バケットを除きすべて削除されます
手動で削除すべき S3 バケットは以下の画像の通り 3 つ (destination, logs, source) あります。スタック名が先頭についているため、バケット名の検索窓で video-on-demand-on-aws と入力すると今回のソリューションで作成されたバケットが検索できます。 名前が分かりにくい場合は、コンソールの CloudFormation の中で、スタックの削除の前に、作成されている S3 バケットの名前を CloudFormation スタックのリソースの部分で確認しておくと良いでしょう。
クリックすると拡大します
まとめ
動画配信サービスを CloudFormation のテンプレートから簡単に構築できる「AWS のビデオオンデマンド」をご紹介しました。「AWS のビデオオンデマンド」を用いると、トランスコーダーの実装や配信用のサーバーのホスティングなどを管理することなく、S3 に動画をアップロードすると自動でトランスコードを行い、メタデータをデータベースに格納し、さまざまなフォーマットで配信するサーバーレスなアーキテクチャを構築できます。
builders.flash では定期的に AWS ソリューションライブラリからソリューションをピックアップして概要やユースケース、手順のご紹介をする記事の連載を行っていますので是非ご確認ください!
それでは、良いクラウドジャーニーを!
筆者プロフィール
押川令 (Ray Oshikawa @rayofhopejp)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
2022 年 4 月に新卒として入社したソリューションアーキテクトです。大学時代は自然言語処理や遺伝的アルゴリズムの研究をしていました。好きな AWS サービスは AWS Amplify。趣味は動画などのコンテンツを制作することです。
監修者プロフィール
稲田 大陸 (Riku Inada @inariku)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
2021 年 4 月に AWS Japan に入社し、筋トレが趣味なソリューションアーキテクトです。現在は製造業のお客様を中心にクラウド活用の技術支援を担当しています。好きな AWS のサービスは AWS Amplify と Amazon Location Service です。週末には美味しいお酒を求めてフラフラしています。
AWS を無料でお試しいただけます