楽曲ストリーミング配信のCDN移行を行った時のアーキテクチャについて
株式会社レコチョク / 山本 紘一
メンバー / バックエンドエンジニア / 従業員規模: 101名〜300名
アーキテクチャ
アーキテクチャの意図・工夫
AWS公式のブログに実現したかった内容があったため、こちらを参考にしました。
各サービスの役割は以下の通りです。
- CloudFront:CDN として利用し、キャッシュミス時に Lambda@Edge をトリガー
- Lambda (Lambda@Edge):オリジンリクエスト時に動作し、S3 内の HLS ファイル確認や楽曲取得を実施
- MediaConvert:m4aをHLS形式(m3u8 + AAC)に変換
- S3:変換済みのHLSファイル(m3u8 + AAC)を保存
処理フローは以下のようになります。
- ユーザー が CloudFront にリクエスト
- CloudFront がキャッシュを確認、キャッシュがあればそのまま返却
- キャッシュがない場合、Lambda@Edge をトリガー
- Lambda@Edge がS3をチェックし、HLSファイル(m3u8)があれば返却
- S3にHLSファイルがない場合、楽曲取得API にリクエストし m4a ファイルを取得
- 取得した m4a を MediaConvert で HLS (m3u8 + AAC) に変換
- HLS変換後の m3u8 + AAC ファイルを S3 に保存
- HLS変換後の m3u8 + AAC をユーザーへ返却
- CloudFront が変換後の HLS ファイルをキャッシュ
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
弊社では音楽配信サービスを提供しており、HLS(HTTP Live Streaming)を用いた楽曲のストリーミング配信を行っています。
これまで利用していた CDN 事業者から、サービス終了の通知を受けたことをきっかけに、約1か月という短期間で新たな CDN の選定・導入を行う必要がありました。
他の CDN 事業者も調査しましたが、日本国内で同様の要件を満たせるサービスを見つけることができませんでした。
その中で、AWS の CloudFront + Lambda@Edge + MediaConvert + S3 を組み合わせることで、既存の配信フローを再現できそうだという結論に至り、自前で実装する方針を採用しました。
どのような状態を目指していたか
今まで使用していたCDNでは以下のフローでHLS配信を行っていました。
- ユーザーが CDN に楽曲をリクエスト
- CDN がキャッシュを確認し、キャッシュがあればそのまま返却
- キャッシュがない場合は、楽曲取得API へリクエストを送信し m4a 形式の楽曲を取得
- CDN が m4a を HLS (m3u8 + TS) に変換
- HLS 変換後の m3u8 + TS をユーザーへ返却
- CDN が変換済みの HLS ファイルをキャッシュ
新しい構成においても、この配信フローを維持しつつ、HLS 変換を適切に処理できる仕組みを構築することを目標としていました。
導入の成果
改善したかった課題はどれくらい解決されたか
- 配信停止を発生させることなく CDN の切り替えを完了
- 既存アプリケーションの大きな改修を行わずに移行
- 事前 HLS 変換の導入により、初回再生時の待ち時間を解消
といった形で、主要な課題はほぼ解決でき、配信品質やユーザー体験を大きく損なうことなく、切り替えを完了できました。
導入時の苦労・悩み
全体の処理フローとしては、CloudFront から Lambda@Edge をトリガーし、Lambda@Edge 側で S3 内の HLS ファイルを確認、存在しない場合は MediaConvert を利用して m4a を HLS に変換し、S3 に配置するという構成です。
構築自体は大きな問題なく進みましたが、MediaConvert を利用した HLS 変換の処理時間とコストが大きな課題となりました。
具体的な課題は以下の通りです。
- 初回アクセス時の HLS 変換による再生遅延
初回の楽曲再生時には、S3 バケットに HLS 変換済みファイル(m3u8 + AAC)が存在しません。
そのため、初回アクセス時のみ MediaConvert による HLS 変換処理が発生します。
この変換処理には、楽曲の長さに関わらず 10秒前後かかり、その間、ユーザーは再生を開始できません。
すべての楽曲で初回再生時に待ち時間が発生することになり、ユーザー体験を大きく損なう可能性がありました。
- 変換中の再生が成立しない
課題1の回避策として、MediaConvert の設定で「変換中のデータを順次返却し、先行再生できないか」を検証しました。
しかし、アプリケーション側でシークバーを操作すると、変換が完了していない区間は再生できないという挙動が発生し、実用に耐えないことが分かりました。
結果として、HLS 変換が完全に完了するまで再生を開始できない構成となりました。
- MediaConvert のコスト
初回再生時の遅延を解消するため、イニシャル楽曲分は事前に HLS ファイルを生成しておく方針を検討しました。
しかし、配信楽曲数が多いため、すべてを MediaConvert で変換すると コストが大幅に増加することが判明しました。
課題の解決策
この課題を解決するため、リリース前に主要楽曲の HLS ファイルを事前生成する方針に切り替えました。
EC2 インスタンスに ffmpeg をインストールした変換環境を構築し、複数台を並行稼働させて数日間かけて事前変換を完了させました。
この対応により、
- ユーザーの初回再生時でも待ち時間なく再生を開始できるように改善
- MediaConvert を大量実行する場合と比較してコストを大幅に削減
という結果を得ることができました。
なお、事前変換していない楽曲については、初回アクセス時に MediaConvert による変換が発生する構成としています。
導入に向けた社内への説明
上長・チームへの説明
選定から導入までの期間が非常に短く、当初は今回の構成が本当に問題なく運用できるか不透明な状態でした。
そのため、他の CDN 事業者の調査も並行して進めていました。
最終的には、開発環境での検証において大きな問題が見つからなかったこと、およびリリース予定日までの期間を考慮すると、AWS上で自前実装したほうが最もスピーディーに対応できると判断し、今回の構成を採用しました。
活用方法
よく使う機能
楽曲のストリーミング再生
ツールの良い点
CloudFront は Lambda@Edge と組み合わせることで、キャッシュミス時の挙動を制御できる点が良い点でした。
今回のように、
- キャッシュがあれば即返却
- キャッシュがなければ S3 や外部 API を参照
- 状況に応じて HLS 変換処理を実行
といった条件分岐を CDN レイヤーで完結できるため、アプリケーション側の改修を最小限に抑えつつ構成を実現できました。
ツールの課題点
CloudFront + Lambda@Edge + MediaConvert の構成では、初回アクセス時のHLS変換に一定の時間がかかる点が課題となりました。
変換完了まで10秒前後の待ち時間が発生するため、リアルタイム性を求める場合には事前変換やキャッシュ戦略を組み合わせる前提で設計する必要があります。
株式会社レコチョク / 山本 紘一
メンバー / バックエンドエンジニア / 従業員規模: 101名〜300名
よく見られているレビュー
株式会社レコチョク / 山本 紘一
メンバー / バックエンドエンジニア / 従業員規模: 101名〜300名
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法

.jpg)
