はじめに
清水です。本エントリでお伝えするアップデート情報はこちら!AWSのマネージド型ライブストリーミングソリューションであるAmazon Interactive Video Service (Amazon IVS)でプライベートチャンネルにおけるViewer sessionの取り消しが可能になりました。2023/06/30の段階でAWS What's Newへの掲載はありませんが、Amazon Interactive Video Service User Guideにて、2023/06/28付で更新があったことが確認できます。
Document History - Amazon Interactive Video Service
Amazon IVSでは再生時にトークンによる承認が必要なプライベートチャンネルが利用できます。(Amazon IVSのプライベートチャンネル用tokenを手元のPython環境で作成してみた | DevelopersIO)今回のアップデートでは、認証用のトークンに関連付けられたViewer Sessionを取り消す操作が可能になり、このトークンを利用している再生を停止させることができるようになります。本エントリでは実際にこのIVSのViewer Sessionの取り消し、Revoke操作を試してみたのでまとめてみたいと思います。トークン作成の際にViewer IDなどSessionに関する情報を付与する必要がある点、またRevoke操作は現在AWS CLIやSDKなどAPI経由の操作になることに注意しましょう。
RevokeするIVS Private Channelの準備
Viewer Session Revocationの動作を確認するにあたり、まずはRevokeする対象のPrivate Channelなど、IVS側リソースを作成していきます。
Playback keyの作成
まずはIVSのPlayback keyリソースを作成します。IVSマネジメントコンソールのPlayback Keysのページから[Create playback key]ボタンで進みます。Playback key nameを指定して[Create]します。作成した際、キーペアのうちの秘密鍵がブラウザでダウンロードされるので保存しておきます。この秘密鍵はのちほどトークン作成の際に使用します。
IVS Private Channelの作成
続いてIVSでPrivateなChannelリソースを作成します。IVSマネジメントコンソールの[Create channel]ボタンから進みます。Channel nameを指定して、Custom configuration
を選択します。Playback authorizationの項目でEnable toke-authorization requirement for video playback
のチェックを有効にします。
Revoke可能な再生用トークンの作成
Playback keyならびにChannelの作成ができたら、続いてRevoke操作が可能な再生用のトークンを作成します。本来は再生プレイヤー含めたWebサイト側で、ユーザのリクエストとともにトークンを作成するようなかたちになるかと思いますが、今回は検証用として以下ブログエントリを参考にPythonの対話型インタプリタでトークンを作成します。
手順はなどは以下ブログエントリと変わりませんが、途中のpayload
の指定部分でデータを追加している点などに注意しましょう。
Python環境については上記ブログエントリと同様なので省略し、Python対話型インタプリタでのコマンド記録をまとめます。
まずはdatetime
とjwt
をimportします。
>>> import datetime
>>> import jwt
続いてtokenの有効期限を指定します。payload
指定の際にviewer-id
というデータを付与するのですが、このviewer-id
を指定する際には有効期限を現時点から10分以内にする必要があるそうです。ここでは上限の10分としました。詳細はIVS User Guideの「Generate and Sign Playback Tokens」を参照ください。なお、上記User Guideにも記載がありますが、この有効期限については、ストリームを視聴できる時間を示すものではなく、Viewerが再生を初期化するときに検証されるもの、ということです。
>>> expires = datetime.datetime.utcnow() + 10*(datetime.timedelta(minutes=1))
>>> expires
datetime.datetime(2023, 6, 30, 9, 50, 43, 118719)
>>> int(expires.timestamp())
1688118643
続いてpayload
の指定です。ここでセッション管理に必要なviewer-id
というデータを指定します。この詳細についてはIVS User Guideの「Generate and Sign Playback Tokens」を参照ください。なおpayload
データ内ではprefixとしてaws:
が付き、aws:viewer-id
となる点に注意しましょう。(筆者はここで少しハマりました……。exp
のみprefixがつきません。)viewer-id
は任意の文字列、viewer-id-for-test-revoke-viewer-session
を指定しました。
>>> payload = {
... "aws:channel-arn": "arn:aws:ivs:ap-northeast-1:123456789012:channel/KSXXXXXXXXXX",
... "aws:access-control-allow-origin": "*",
... "aws:viewer-id": "viewer-id-for-test-revoke-viewer-session",
... "exp": int(expires.timestamp())
... }
>>> payload
{'aws:channel-arn': 'arn:aws:ivs:ap-northeast-1:123456789012:channel/KSXXXXXXXXXX', 'aws:access-control-allow-origin': '*', 'aws:viewer-id': 'viewer-id-for-test-revoke-viewer-session', 'exp': 1688118643}
さきほどPlayback keyの作成でダウンロードした秘密鍵を読み込みます。
>>> secret = open('/home/ec2-user/playback-key-for-test-revoke-viewer-session-key.pem', 'r').read()
>>> secret
'-----BEGIN PRIVATE KEY-----\nMIG2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX3Ek=\n-----END PRIVATE KEY-----'
そしてjwt.encode
を使ってトークンを生成します。
>>> encoded_jwt = jwt.encode(payload, secret, algorithm='ES384')
>>> encoded_jwt
'eyJhXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7yrQ'
トークンが作成できました。Playback URLの末尾にこのトークンを付与することで再生が可能になります。今回は以下のような再生ページを準備しました。
<html>
<head>
<title>ivs-private-channel</title>
<style>
video {
height: 100%;
width: 100%;
left: 0;
top: 0;
position: fixed;
}
</style>
</head>
<body>
<video id="video-player" playsinline controls></video>
<script src="https://player.live-video.net/1.19.0/amazon-ivs-player.min.js"\
></script>
<script>
var PLAYBACK_URL = "https://xxxxxxxxxxxx.ap-northeast-1.playback.live-video.net/api/video/v1/ap-northeast-1.123456789012.channel.KSXXXXXXXXXX.m3u8";
var token = "eyJhXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7yrQ";
if (IVSPlayer.isPlayerSupported) {
const player = IVSPlayer.create();
player.attachHTMLVideoElement(document.getElementById('video-player')\
);
player.load(PLAYBACK_URL + "?token=" + token);
player.play();
}
</script>
</body>
</html>
この再生ページをEC2上のApache HTTP Serverでホスティングします。EC2の前段にはCloudFrontディストリビューションを設定し、HTTPSでアクセスできる状態にします。
Viewer SessionのRevokeをしてみる
IVS側のリソースならびに再生用トークンの準備ができました。実際にこの再生用トークンに対して、Viewer Sessionの取り消し操作を行ってみます。
このViewer Sessionの取り消し、Revoke操作については、現在のところAWS CLIやSDKなどAPI経由の操作のみをサポートしています。マネジメントコンソールからは操作できません。
今回はAWS CLIを使用して試してみます。以下の環境となります。
% aws --version
aws-cli/2.12.5 Python/3.11.4 Darwin/21.6.0 exe/x86_64 prompt/off
Streaming Softwareから映像を打ち上げ、IVSによるライブストリーミングを開始しておきます。
先ほど準備した再生ページでライブストリーミングの視聴を確認します。
Chromeデベロッパーツールも確認してみました。ライブストリーミングを視聴している間は、エラーなどは発生してません。
いざ!Revokeしてみます。Revokeにはivs start-viewer-session-revocation
コマンドを使用します。オプションで--channel-arn
のほか、トークン作成時に指定したセッション管理用の--viewer-id
を指定します。エラーなどなければ返り値は特にありません。
% aws ivs start-viewer-session-revocation \
--channel-arn arn:aws:ivs:ap-northeast-1:123456789012:channel/KSXXXXXXXXXX \
--viewer-id viewer-id-for-test-revoke-viewer-session
Revokeを実行し少しすると、再生ページでのライブストリーミングが停止しました。(厳密に計測していませんが、1分ほどして停止した、ぐらいの印象です。)
Chromeデベロッパーツールでは403
が発生しています。
curlコマンドでも確認してみます。Playback URLに先ほど作成したトークンを付与したURLに対しては200
のステータスが返ってきました。マニフェストファイル自体は取得できているようですね。
% curl -I "https://xxxxxxxxxxxx.ap-northeast-1.playback.live-video.net/api/video/v1/ap-northeast-1.123456789012.channel.KSXXXXXXXXXX.m3u8?token=eyJhXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7yrQ"
HTTP/2 200
content-type: application/vnd.apple.mpegurl
content-length: 8915
vary: Accept-Encoding
date: Fri, 30 Jun 2023 09:45:51 GMT
access-control-allow-origin: *
x-amzn-trace-id: Root=1-64xxxxxx-xxxxxxxxxxxxxxxxxxxxxx28
x-amzn-trace-id: Root=1-64xxxxxx-xxxxxxxxxxxxxxxxxxxxxx28
x-cache: Miss from cloudfront
via: 1.1 8293xxxxxxxxxxxxxxxxxxxxxxxx9854.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT12-C5
x-amz-cf-id: oHrPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJw==
しかしこのm3u8マニフェストファイル内で参照している、ABR ladderを構成しているm3u8ファイルにアクセスしてみるとsession revoked
という文字列とともに403
のステータスコードが返ってきました。最上位のマニフェストファイルではなく、その次のレベルのマニフェストファイルでセッションの制御を行っているようですね。
% curl -i https://video-weaver.hkg06.hls.live-video.net/v1/playlist/CvsFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXjD2Bg.m3u8
HTTP/1.1 403 Forbidden
vary: Accept-Encoding
date: Fri, 30 Jun 2023 09:46:56 GMT
content-length: 15
content-type: text/plain; charset=utf-8
access-control-allow-origin: *
session revoked
まとめ
Amazon IVSでPrivate ChannelのViewer sessionの取り消しが可能になったアップデートについて確認してみました。再生認証用のトークンにviewer-id
という新しいトークンスキーマを追加することで、このviewer-id
に対してはトークンを有していても再生をできないようにする、ということが可能になります。また本エントリでは扱いませんでしたが、Viewer Sessionにバージョンを付与し、このバージョン以下のトークンに対しては再生を停止する、といった操作もviewer-session-version
というトークンスキーマを用いることで可能となっています。Amazon IVSのプライベートチャンネルの運用がより柔軟になった今回のアップデート、上手に活用していきたいですね。