AWSを使ってCDN認証をするライブ配信環境を用意する

記事タイトルとURLをコピーする

こんにちは、矢野(喬)です。
前回の記事 最低限のライブ配信環境を構築する(MediaLiveとMediaPackage) に続いて、CDN認証を行うライブ配信構成をご紹介します。
CloudFrontからのみ再生できること(CDN認証)、必要時のみ課金されるようにすること、配信しようと思ったら直ぐに始められる状態にすることを目標としています。

blog.serverworks.co.jp

構成

f:id:swx-kyosuke-yano:20201210152729p:plain

  • OBSから受け取った配信ソースをAWS Elemental Medialive(以降Medialive)に渡し、AWS Elemental MediaPackage(以降MediaPackage)に繋ぐ点は前回ブログと同様の構成として省略します
  • 映像配信はMediaPackageから直接ではなく、CloudFrontなどのCDNを用いた配信が効率的且つ安全であるとして推奨されています
  • MediaPackageで流す映像はAmazon CloudFront(以降CloudFront)からのみ視聴できるように、AWS Secrets Manager(以降Secrets Manager)を用いたCDN認証をします

手順概要と構築順

MediaPackage

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」をクリック f:id:swx-kyosuke-yano:20201114203445j:plain
1-2.Channel details → ID に任意のIDを入力 (本記事ではCDN)、CloudFrontも併せて作成するので「Create a CloudFront ~」にチェックを入れて「Create」ボタンをクリック f:id:swx-kyosuke-yano:20201231160452j:plain
1-3.チャンネルが作成されたことを確認

2.CDN認証設定

こちらのAWSユーザーガイドを元に進めていきます

docs.aws.amazon.com

2-1.認証に用いるUUID(v4)の作成 先ずは設定するUUID(v4)を用意します。作成できるサイト等方法は幾つかありますが、今回はuuidgen -r コマンドを使って作成します f:id:swx-kyosuke-yano:20201231162028j:plain

2-2.Secrets Mangerでシークレットを作成 Secrets Mangerから「新しいシークレットを保存する」をクリック f:id:swx-kyosuke-yano:20201231165209j:plain
「その他のシークレット」、シークレットキーに「MediaPackageCDNIdentifier」、値にUUID(v4)、暗号化キーはデフォルトのままとして「次へ」をクリック f:id:swx-kyosuke-yano:20201231165329j:plain
シークレットの名前を付けて「次へ」をクリック(ユーザーガイド推奨のように MediaPackage/CDNとした) f:id:swx-kyosuke-yano:20201231165425j:plain
自動ローテーションが無効であることを確認し「次へ」→「保存」をクリック f:id:swx-kyosuke-yano:20201231165501j:plain
作成されたシークレットのARNをメモしておく f:id:swx-kyosuke-yano:20201231165546j:plain
2-3.シークレット読み込み用のIAMロール作成 下記ガイドを元に作成します

許可する AWS Elemental MediaPackage 他の AWS サービス - AWS Elemental MediaPackage
Secrets ManagerのCDN認証であるため以下ページよりポリシーを作成
Secrets Manager CDN認証のアクセス - AWS Elemental MediaPackage
上記ポリシーをアタッチし、信頼関係をMediaPackageとしたIAMロール「MediaPackageWithSecretManager」を作成 f:id:swx-kyosuke-yano:20201231171508j:plain
2-4.MediaPackageチャンネルのエンドポイントとCDN認証有効化 作成したChannel ID から、Endpoints → 「Add Endpoints」をクリック f:id:swx-kyosuke-yano:20201114204559j:plain
ID に任意のIDを入力 (本記事ではCDNendpoint) f:id:swx-kyosuke-yano:20210103112448j:plain
Packager settings → Type から 「CMAF]を選択、HLS manifest → ID から任意のIDを入力 (本記事ではCDNendpoint) f:id:swx-kyosuke-yano:20210103112459j:plain
Use authorizationにチェックを入れ、Secrets role ARNには作成したIAMロール「MediaPackageWithSecretManager」のARNを、CDN identifier secretには作成したシークレット「MediaPackage/CDN」を入力します f:id:swx-kyosuke-yano:20210103112712j:plain
Endpointの項目入力が終わったら「Save」をクリックして作成 f:id:swx-kyosuke-yano:20201114205812j:plain
Endpointが作成されたことを確認 f:id:swx-kyosuke-yano:20201114210227j:plain
2-5.CloudFrontにカスタムヘッダーを設定 ユーザーガイドを参考にして、先程MediaPackageで作成したCloudFrontディストリビューションにカスタムヘッダーを設定します
MediaPackageのEndpointを作成するとデフォルトで設定されていたOrigin「TEMP~」とは別に「EMP~」が追加されます(謎のTが抜けたEMP) f:id:swx-kyosuke-yano:20210103113609j:plain
「EMP~」のOriginの編集から、[ヘッダー名] に X-MediaPackage-CDNIdentifier と入力し、[Value (値)] に作成したUUID(v4)を入力します
f:id:swx-kyosuke-yano:20201231162750j:plain

3.MediaLive設定

3-0.AWS Elemental MediaLiveにて、前回記事にて作成したチャンネルの「Channel Acctions」から、「Download custom template」でテンプレートをダウンロードしておけば、次回から簡単にチャンネル設定を行うことが可能です
今回はこのテンプレートを用いて設定します f:id:swx-kyosuke-yano:20210105174039j:plain
3-1.「チャネルの作成」をクリック f:id:swx-kyosuke-yano:20201114210654j:plain
3-2.「Channel template」の「Select custom template」から、事前にダウンロードしておいたテンプレート.jsonを選択します
キャプチャのように各設定が入力されますが、一部設定はこの後に手動設定が必要です f:id:swx-kyosuke-yano:20210105174921j:plain 3-3.残りの設定をそれぞれ設定します。詳細は前回記事をご確認ください

  • Channel name (任意)
  • Input attachments (前回と同じInputで良い)
  • Output groups (今回作成したMediaPackageのIDを指定)


3-4.各設定を埋め、「Create channel」をクリックしMediaLiveチャンネル作成 f:id:swx-kyosuke-yano:20201114231137j:plainf:id:swx-kyosuke-yano:20201114231140j:plain

4.視聴確認

4-1.MediaLiveで作成したチャネルから「開始」をクリック。チャネルの状態が「Running」になるまで待機 f:id:swx-kyosuke-yano:20201114231544j:plain
4-2.OBSから「設定」→「配信」→ サービスを「カスタム」、MediaLiveの入力エンドポイントURLのアプリケーションを入力(本記事ではrtmp://~/live)、ストリームキーに入力エンドポイントURLのインスタンス名を入力(本記事ではbasic) f:id:swx-kyosuke-yano:20201114232544j:plain
4-3.OBSの「配信」をクリック(配信が問題なく開始されるとOBS画面下のLIVEの時計が動く) f:id:swx-kyosuke-yano:20201114232853j:plain
4-4.MediaPackageの作成したチャネルのEndpointから、MediaPackageで直接確認するPreviewでは映像が見られないこと、Show CloudFront URLで表示されるURLからなら映像が見られることを確認 f:id:swx-kyosuke-yano:20210109111305j:plain
Preview f:id:swx-kyosuke-yano:20210109111317j:plain
Show CloudFront URL f:id:swx-kyosuke-yano:20210109111333j:plain

料金

料金は前回同様にかなり大雑把に計算をする、且つ入力も出力も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等追加の制御も出来るのも安心ですね。

ありがとうございました。

矢野 喬亮 (記事一覧)

カスタマーサクセス部

ウクレレと陶芸とMediaServicesが好きです