この記事は約7分で読めます。
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。
こんにちは、矢野(喬)です。
前回の記事 最低限のライブ配信環境を構築する(MediaLiveとMediaPackage) に続いて、CDN認証を行うライブ配信構成をご紹介します。
CloudFrontからのみ再生できること(CDN認証)、必要時のみ課金されるようにすること、配信しようと思ったら直ぐに始められる状態にすることを目標としています。
構成
- OBSから受け取った配信ソースをAWS Elemental Medialive(以降Medialive)に渡し、AWS Elemental MediaPackage(以降MediaPackage)に繋ぐ点は前回ブログと同様の構成として省略します
- 映像配信はMediaPackageから直接ではなく、CloudFrontなどのCDNを用いた配信が効率的且つ安全であるとして推奨されています
- MediaPackageで流す映像はAmazon CloudFront(以降CloudFront)からのみ視聴できるように、AWS Secrets Manager(以降Secrets Manager)を用いたCDN認証をします
手順概要と構築順
MediaPackage
- CloudFront連携とSecrets Managerを用いたCDN認証設定
Secrets Manager
- カスタム HTTP ヘッダーをシークレットとして管理し、MediaPackageがそれを読み込む。
- CloudFrontは指定したカスタム HTTP ヘッダーの有無を確認し認証する
CloudFront
- MediaPackageの映像をCDN認証を通して視聴できるディストリビューションを構築
構築順
0.MediaLiveとOBSの配信設定
1.MediaPackage設定
2.CDN認証設定
3.MediaLive設定
4.視聴確認
手順詳細
0.MediaLiveとOBSの配信設定
前述の通り省略させていただきます。OBSで映像や音声を組み合わせて配信画面を構成してください
MediaLiveのOutput groupsには、MediaPackageのchannel 作成後にchannel IDを入力することになるので、手順3.でMediaLiveのchannel設定をすることになります。
1.MediaPackage設定
1-1.AWS Elemental MediaPackageに移動し、「Create a new channel」をクリック
1-2.Channel details → ID に任意のIDを入力 (本記事ではCDN)、CloudFrontも併せて作成するので「Create a CloudFront ~」にチェックを入れて「Create」ボタンをクリック
1-3.チャンネルが作成されたことを確認
2.CDN認証設定
こちらのAWSユーザーガイドを元に進めていきます
2-1.認証に用いるUUID(v4)の作成
先ずは設定するUUID(v4)を用意します。作成できるサイト等方法は幾つかありますが、今回はuuidgen -r コマンドを使って作成します
2-2.Secrets Mangerでシークレットを作成
Secrets Mangerから「新しいシークレットを保存する」をクリック
「その他のシークレット」、シークレットキーに「MediaPackageCDNIdentifier」、値にUUID(v4)、暗号化キーはデフォルトのままとして「次へ」をクリック
シークレットの名前を付けて「次へ」をクリック(ユーザーガイド推奨のように MediaPackage/CDNとした)
自動ローテーションが無効であることを確認し「次へ」→「保存」をクリック
作成されたシークレットのARNをメモしておく
2-3.シークレット読み込み用のIAMロール作成
下記ガイドを元に作成します
許可する AWS Elemental MediaPackage 他の AWS サービス - AWS Elemental MediaPackage
Secrets ManagerのCDN認証であるため以下ページよりポリシーを作成
Secrets Manager CDN認証のアクセス - AWS Elemental MediaPackage
上記ポリシーをアタッチし、信頼関係をMediaPackageとしたIAMロール「MediaPackageWithSecretManager」を作成
2-4.MediaPackageチャンネルのエンドポイントとCDN認証有効化
作成したChannel ID から、Endpoints → 「Add Endpoints」をクリック
ID に任意のIDを入力 (本記事ではCDNendpoint)
Packager settings → Type から 「CMAF]を選択、HLS manifest → ID から任意のIDを入力 (本記事ではCDNendpoint)
Use authorizationにチェックを入れ、Secrets role ARNには作成したIAMロール「MediaPackageWithSecretManager」のARNを、CDN identifier secretには作成したシークレット「MediaPackage/CDN」を入力します
Endpointの項目入力が終わったら「Save」をクリックして作成
Endpointが作成されたことを確認
2-5.CloudFrontにカスタムヘッダーを設定
ユーザーガイドを参考にして、先程MediaPackageで作成したCloudFrontディストリビューションにカスタムヘッダーを設定します
MediaPackageのEndpointを作成するとデフォルトで設定されていたOrigin「TEMP~」とは別に「EMP~」が追加されます(謎のTが抜けたEMP)
「EMP~」のOriginの編集から、[ヘッダー名] に X-MediaPackage-CDNIdentifier と入力し、[Value (値)] に作成したUUID(v4)を入力します
3.MediaLive設定
3-0.AWS Elemental MediaLiveにて、前回記事にて作成したチャンネルの「Channel Acctions」から、「Download custom template」でテンプレートをダウンロードしておけば、次回から簡単にチャンネル設定を行うことが可能です
今回はこのテンプレートを用いて設定します
3-1.「チャネルの作成」をクリック
3-2.「Channel template」の「Select custom template」から、事前にダウンロードしておいたテンプレート.jsonを選択します
キャプチャのように各設定が入力されますが、一部設定はこの後に手動設定が必要です
3-3.残りの設定をそれぞれ設定します。詳細は前回記事をご確認ください
- Channel name (任意)
- Input attachments (前回と同じInputで良い)
- Output groups (今回作成したMediaPackageのIDを指定)
3-4.各設定を埋め、「Create channel」をクリックしMediaLiveチャンネル作成
↓
4.視聴確認
4-1.MediaLiveで作成したチャネルから「開始」をクリック。チャネルの状態が「Running」になるまで待機
4-2.OBSから「設定」→「配信」→ サービスを「カスタム」、MediaLiveの入力エンドポイントURLのアプリケーションを入力(本記事ではrtmp://~/live)、ストリームキーに入力エンドポイントURLのインスタンス名を入力(本記事ではbasic)
4-3.OBSの「配信」をクリック(配信が問題なく開始されるとOBS画面下のLIVEの時計が動く)
4-4.MediaPackageの作成したチャネルのEndpointから、MediaPackageで直接確認するPreviewでは映像が見られないこと、Show CloudFront URLで表示されるURLからなら映像が見られることを確認
Preview
Show CloudFront URL
料金
料金は前回同様にかなり大雑把に計算をする、且つ入力も出力も1つ(単一のビットレートで配信)、視聴者数十人で考えると、1時間200~300円に収まる程度となりました。
補足としてCloudFrontを通す場合、MediapackageからCloudFrontへのデータ送信(アウト)は無料になりますので、CloudFrontはよりセキュアという点以外に、キャッシュ機能が使える点でも推奨される理由となります。
詳細は公式ページをご参照ください。)
料金 - AWS Elemental MediaLive | AWS)
料金 - AWS Elemental MediaPackage | AWS
今回はCDN認証の為にSecrets Managerを利用している為、作成したシークレットも僅かながらコストが掛かることになります。)
- シークレットあたり 0.40USD/月。保存期間が 1 か月未満のシークレットについては、料金は (時間数に基づいて) 案分計算
- 10,000 件の API コールあたり0.05USD
料金 - AWS Secrets Manager | AWS
おわりに
MediaLive、MediaPackage、CloudFront、Secrets Managerを用いたCDN認証のライブ配信構成のご紹介となりました。
複数のサービスをいったりきたりしながら設定する必要があるので少々大変にはなりますが、CloudFrontを用いて視聴に制限することで、より安全にライブ配信を考えられるようになったと思います。CloudFront側でWAF等追加の制御も出来るのも安心ですね。
ありがとうございました。