このブログでは、Amazon Interactive Video Service (Amazon IVS) を使用してライブ ストリーミング エクスペリエンスを作成するさまざまな方法を検討してきましたが、これまでの例はすべて、再生の承認がなくても誰でも視聴できるパブリック チャンネルに焦点を当てています。視聴者がライブ ストリームの視聴を許可されていることを確認します。多くのライブ ストリーミング ユーザー生成コンテンツ (UGC) プラットフォームでは、ストリームを表示するための承認は必要ありませんが、ストリームの視聴者を視聴者のサブセットに限定したい場合があります。たとえば、コンテンツの作成者が、作成したコンテンツのサブスクリプションを請求したいと考えているとします。または、特定の人口統計または地理的な場所への配布を禁止する、ストリーム コンテンツに対するライセンス制限がある可能性があります。プラットフォームが再生承認を強制する必要があるユースケースに対処するために、Amazon IVS はプライベートチャネルをサポートしています。これらのチャネルは、秘密鍵で署名され、公開鍵で検証されたトークンを取得した視聴者に再生を制限します。この投稿では、再生認証を有効にする方法、再生キー ペアを作成する方法、トークンを生成する方法、プライベート ストリームを再生する方法について説明します。
このワークフローの最初のステップは、プライベート チャネルを作成することです。プライベート チャネルの作成は、パブリック チャネルの作成と非常によく似ています。唯一の違いは、チャネルを作成するときに、再生承認を有効にするための 1 つの設定です。 Amazon IVS コンソール、AWS CLI、または任意の AWS SDK を介して、再生認証を有効にすることができます。
まず、Amazon IVS コンソールを介してプライベート チャネルを作成する方法を見てみましょう。コンソールのチャネルのリストで、[チャネルの作成] をクリックします。
[チャネルの作成] ページで、チャネル名を入力し (#1)、[カスタム構成] を選択し (#2)、[ビデオ再生のトークン承認要件を有効にする] をオンにします (#3)。
CLI を使用してチャネルを作成する場合は、 --authorized
オプションを追加できます。
$ aws ivs create-channel --name demo-private-channel --latency-mode LOW --type STANDARD --authorized
実際には、AWS SDK を使用してユーザーのチャネルを作成することになるでしょう。この場合、お気に入りの言語の AWS SDK ドキュメントを参照して、 authorized
された再生に設定する適切な引数を決定できます。たとえば、AWS SDK for JavaScript v3 のCreateChannelCommandInput
のドキュメントでは、チャネルの作成時にブール値のauthorized
プロパティを設定できると述べています。
再生承認を有効にしたので、チャネルにブロードキャストし、再生トークンを生成して渡さずにライブ再生を表示しようとすると、再生エラーが発生します。これは、再生エラーをキャプチャするためにERROR
リスナーを追加した Amazon IVS プレーヤー SDK を使用した再生の例です。
const streamUrl = '[private channel Playback Url]'; const ivsPlayer = IVSPlayer.create(); ivsPlayer.attachHTMLVideoElement(document.getElementById('video-player')); ivsPlayer.load(streamUrl); ivsPlayer.play(); ivsPlayer.addEventListener(IVSPlayer.PlayerEventType.ERROR, (err) => { console.log(err); });
プライベート チャネルを指しているときにブラウザーでこれを実行すると、次のエラーがコンソールに記録されます。
{ "type": "ErrorAuthorization", "code": 7, "source": "MasterPlaylist", "message": "invalid_playback_auth_token" }
これにより、チャネルが実際に非公開であることが確認され、再生を承認するためにtoken
を生成して再生 URLと一緒に渡す必要があります。
再生トークンを生成する前に、秘密鍵と公開鍵のペアを作成して Amazon IVS コンソールにアップロードする必要があります。この鍵ペアは、秘密鍵で署名され、公開鍵で検証され、再生を許可するJWT
トークンを生成するために使用されます。
Amazon IVS コンソールで再生キーを管理するには、左側のナビゲーション サイドバーで [再生キー]を選択します。
コンソールでキーを作成するか、ローカル マシンでオフラインの OpenSSL を使用して手動でキーを作成できます。コンソールでキーペアを直接作成するには。このためには、[再生キーの作成] をクリックします。
キーに名前を付けて、[作成] をクリックします。
このペアの公開鍵は AWS アカウントに保存され、秘密鍵で署名されたトークンを含む再生リクエストを検証するために使用されます。 Amazon IVS コンソールを使用してキー ペアを生成する場合、秘密鍵はすぐにマシンにダウンロードされ、コンソールに保存されず、さらにダウンロードすることもできません。
独自のキー ペアを作成する場合は、オフラインで作成してから、パブリック キーを Amazon IVS コンソールにインポートできます。 OpenSSL で鍵ペアを作成する例を次に示します。
$ openssl ecparam -name secp384r1 -genkey -noout -out demo-private-channel-private-key-1.pem $ openssl ec -in demo-private-channel-private-key-1.pem -pubout -out demo-private-channel-public-key-1.pem
公開鍵をインポートするには、[再生鍵リスト] ページで [インポート] をクリックします。
インポートした鍵に名前を付け、公開鍵ファイルを参照します (または公開鍵ファイルの内容を貼り付けます)。
これは、AWS CLI からも実行できます。
$ aws ivs \ import-playback-key-pair \ --name demo-private-channel-playback-key-1 \ --public-key-material "`cat /path/to/your/public-key.pem`"
または、AWS SDK 経由 (JavaScript の例についてはドキュメント)。
プライベート チャネルと再生キー ペアを作成したので、署名された再生認証トークンを生成する準備が整いました。アプリケーションでは、ビジネス ロジックによって、承認トークンを付与する必要があるユーザーが決定されます。前述のように、アプリケーション ロジックは、最初にデータベースにクエリを実行して、ユーザーがチャンネルの有効なサブスクライバーであることを確認します。または、地理的な制限がある場合は、視聴者の IP アドレスを調べて、ストリームを視聴できる地域に関連付けられていることを確認する必要があります。正確な実装はさまざまですが、視聴者が実際にストリームを表示する権限を持っているかどうかを判断したら、以下で説明するトークン生成方法に進むことができます。
注意:トークンの生成は、バックエンドで使用している言語によって異なります。要件の詳細については、ユーザー ガイドを参照してください。
Node.js でトークンを生成するには、 jsonwebtoken
ライブラリ ( docs ) を使用できます。このライブラリはプロセスを簡素化し、Amazon IVS で必要とされるSHA-384
署名アルゴリズムを使用してペイロードに署名できるようにします。ペイロードにはChannel ARN 、再生を特定のドメイン (またはすべてのドメインの場合は*
) に制限するaccess-control-origin
、およびトークンの有効期限のタイムスタンプが含まれている必要があります。ペイロードに署名するには、以下のようにフォーマットし、上記で作成してインポートした秘密鍵を使用します。
注:トークンはプライベート チャネルで再生を開始するために使用されるため、有効期限はトークンの生成と再生開始の間の時間にのみ適用されます。ユーザーが特定のストリームを再生できる時間とは関係ありません。再生が許可されると、ユーザーが Web ページを切断するか再読み込みするまで再生を続行できます。
Node.js を使用して (マイクロサービスまたはサーバーレス アプリケーションを介して) バックエンドでトークンを生成する 1 つの方法を次に示します。
import jwt from "jsonwebtoken"; const getToken = () => { const privateChannelArn = process.env.DEMO_PRIVATE_CHANNEL_ARN; // private channel ARN const privateChannelPrivateKey = process.env.DEMO_PRIVATE_CHANNEL_PRIVATE_KEY; // playback private key const payload = { "aws:channel-arn": privateChannelArn, "aws:access-control-allow-origin": "*", "exp": Date.now() + (60 * 1000), // expires in 1 minute }; const token = jwt.sign(payload, privateChannelPrivateKey, { algorithm: 'ES384' }); return token; }
フロントエンドでは、バックエンドからトークンを取得し、それをプライベート チャネルのPlayback Urlに追加できます。以下の例では、簡潔にするために再生 URL ( streamUrl
) を省略しています。
const streamUrl = `https://[truncated].m3u8?token=${token}` const ivsPlayer = IVSPlayer.create(); ivsPlayer.attachHTMLVideoElement(document.getElementById('video-player')); ivsPlayer.load(streamUrl); ivsPlayer.play();
この投稿では、プライベート チャネルの作成方法、再生キーペアの作成とインポート方法、および再生認証用の JWT トークンの生成方法を学びました。プライベート チャネルの詳細については、ユーザー ガイドを参照してください。