Amazon Interactive Video Service (Amazon IVS)でストリームキーをリセットしてみた
はじめに
清水です。AWSのフルマネージドなライブストリーミングソリューションであるAmazon Interactive Video Service (Amazon IVS)、映像の打ち上げ時にはIngestサーバとストリームキーを指定します。このうちストリームキーについては、Channel作成時に割り当てられ、ストリーミングの認証に使用されます。この情報を知っていればChannelに対しストリームできることになるので、ストリームキーはシークレットとして扱うように推奨されています。またもしこのストリームキーが漏洩した場合などに備え、IVSではストリームキーのリセット機能などが実装されています。
本エントリではこのAmazon IVSのストリームキーのリセットについて、AWSマネジメントコンソール、そしてAWS CLIから試してみたのでまとめてみます。
Amazon IVSのマネジメントコンソールからストリームキーをリセットしてみる
IVSのChannelの作成
まずはAWSマネジメントコンソールでIVSのストリームキーリセットをやってみます。IVSのChannelを作成するところからはじめましょう。Channel一覧ページの[Create channel]ボタンで進みます。なおリージョンはオレゴンリージョン(us-west-2)を利用しました。
Channel nameを入力、configurationはDefaultのままとし、[Create channel]ボタンでChannelを作成します。
Channel作成後の画面で、まず払い出されているStream keyを確認してみましょう。デフォルトでは「∙」でマスクされています。
右側のShow
の文字列をクリックすると、ストリームキーが表示されます。sk_us-west-2_abcd1234efgh5678ijkl
という形式のものですね。
ストリーム停止状態でのストリームキーのリセット
まずはライブストリームを開始していない状態で、ストリームキーのリセットを確認してみましょう。右側に設定されている[Reset stream key]ボタンを押下します。
ストリームキーが削除され、リプレイスされる確認のダイアログが表示されます。[Reset stream key]で進めます。
ストリームキーがリセットされました!画面遷移の直後はStrem keyが「∙」でマスクされた状態ですが、下記はShow
で表示させていています。
ライブストリーム中のストリームキーのリセット
続いてライブストリーミング中のストリームキーのリセットについても確認してみましょう。今回Streaming Softwareとして、iPhone 6s上でZixi ONAIRを使用しました。
Stop stream
vライブストリーミング中は、以下のようにAWSマネジメントコンソールの「Live stream」の欄からストリーミング映像を確認することができます。そしてこの右側に[Stop stream]のボタンがありますね。まずはこちらを確認しましょう。
ボタンを押下すると以下のダイアログが表示されます。ストリームをストップする際の選択肢として、同時にストリームキーをリセットするかどうかが選択できます。
Also reset channel stream keyにチェックを付け[Stop stream]でストリームを終了した場合、以下のようにOfflineとなりライブストリーミング配信が停止します。ストリームキーについてもリセットされ、新しいキーになっていることがわかります。またStreaming Software側も接続が断たれ、映像打ち上げを中止している状態です。(リトライ機能があってもストリームキーが異なるため、再度の接続ができません。)
以下はStreaming Software、今回使用したZixi ONAIRのようすです。Connectingとあるように接続をリトライしているようですが、ストリームキーがリセットされ変わっているので、再度の接続はできません。
Also reset channel stream keyにチェックを付けずに[Stop Stream]をした場合についても、同様にいちどライブストリームが停止します。Streaming Software側でも接続断を検知しますが、リトライ機能がある場合は再度接続を試みます。今回私が使用したZixi ONAIRではしばらくするとライブストリーミング配信が再開する、という挙動になりました。
Reset stream key
Stream configuration欄の[Reset stream key]についても確認してみましょう。ストリーム停止状態と異なり、ライブストリーム中だと[Reset stream key]ボタン押下後のダイアログにAlso stop any current live stream for this channelと、現在のライブストリームをストップするかどうかの選択肢が追加されます。
Also stop any current live stream for this channelにチェックを付け[Reset stream key]でストリームキーをリセットした場合、ライブストリーム配信が停止され、またストリームキーもリセットされて新しいものになります。Streaming Software側でも接続が断たれ映像打ち上げが中断している状態です。Stop stream操作でreset channel stream keyをあわせて実行した場合と同じ挙動ですね。Streaming Software側でリトライ機能があっても、ストリームキーが変更されているので、再接続はできません。
Also stop any current live stream for this channelにチェックを付けずに[Reset stream key]でストリームキーをリセットした場合ですが、その後もライブストリーミング自体は続行されました。ストリームキーがリセットされていることはマネジメントコンソール上から確認ができます。しかしStreaming Softwareからは接続したままなので、Streaming Software側のストリームキー情報を変更しなくても接続が断たれるまではライブストリーミングが続くのかな、と推測しています。
2つの操作のまとめ
マネジメントコンソールからのライブストリーミング中のストリームキーリセット操作を、ストリームの停止とあわせてまとめると以下のようになります。
操作 | オプション内容 | オプションチェック有無 | 結果 |
---|---|---|---|
Stop Stream | Also reset channel stream key | チェックあり | ストリームが停止され、ストリームキーが更新 |
チェックなし | ストリームが停止されるが、再開する場合あり | ||
Reset stream key | Also stop live stream | チェックあり | ストリームが停止され、ストリームキーが更新 |
チェックなし | ストリームキーは更新されるが、ストリームは続行 |
Amazon IVSのAWS CLIからストリームキーをリセットしてみる
続いてストリームキーのリセット操作をAWS CLIでも確認してみましょう。以下のバージョンのAWS CLI v2で確認を行いました。
% aws --version aws-cli/2.0.38 Python/3.7.4 Darwin/19.6.0 exe/x86_64
IVS用のコマンドはaws ivs
ではじまります。Channelの作成などのおおよその使い方は以下のエントリをご参照ください。
AWS CLIでストリームキーの確認
Channelについては、先ほどのAWSマネジメントコンソールで作成したものを使います。まずはaws ivs list-channels
コマンドでChannel一覧情報を取得します。
% aws ivs list-channels --region us-west-2 { "channels": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "name": "reset-stream-key-channel", "latencyMode": "LOW", "tags": {} } ] }
channels[0].arn
でChannelのARNを得ることができます。これをシェル内の変数CHANNEL_ARN
に格納しておきましょう。
% CHANNEL_ARN=$(aws ivs list-channels --query 'channels[0].arn' --region us-west-2 --output text) % echo ${CHANNEL_ARN} arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy
続いてaws ivs list-stream-keys
コマンドでストリームキーの情報を取得します。
% aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --region us-west-2 { "streamKeys": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/es3bXXXXXXXX", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "tags": {} } ] }
streamKeys[0].arn
がストリームキーのARNになりますので、こちらもシェル内の変数に格納しておきます。
% STREAMKEY_ARN=$(aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --query 'streamKeys[0].arn' --region us-west-2 --output text) % echo ${STREAMKEY_ARN} arn:aws:ivs:us-west-2:123456789012:stream-key/es3bXXXXXXXX
このストリームキーのARNを引数に、aws ivs get-stream-key
コマンドでストリームキーが確認できます。
% aws ivs get-stream-key --arn ${STREAMKEY_ARN} --region us-west-2 { "streamKey": { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/es3bXXXXXXXX", "value": "sk_us-west-2_es3bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "tags": {} } }
streamKey.value
が実際のストリームキーですね。--query
オプションで指定して、ストリームキーのみを抜粋すると以下のようになります。(--output text
オプションも付けてみました。)
% aws ivs get-stream-key --arn ${STREAMKEY_ARN} --query streamKey.value --region us-west-2 --output text sk_us-west-2_es3bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AWS CLIでストリームキーのリセット
では本題の、AWS CLIでのストリームキーのリセットをしてみます。コマンドとしてはaws ivs delete-stream-key
とaws ivs create-stream-key
が準備されています。
- delete-stream-key — AWS CLI 2.0.40 Command Reference
- create-stream-key — AWS CLI 2.0.40 Command Reference
aws ivs delete-stream-key
ではストリームキーの削除が行えます。ストリームキーを削除すれば、以降はストリーミングに使用できなくなります。コマンド実行時の引数としてはストリームキーのARNを渡します。
% aws ivs delete-stream-key --arn <value>
実際にコマンドを実行してみます。ライブストリーミング中で確認してみました。(ライブストリーミング中であることを、aws ivs get-stream
コマンドで確認しています。)delete-stream-key
コマンド実行時の出力はありませんが、その後のaws ivs get-stream-key
コマンドでエラーが出ており、ストリームキーが取得できないことがわかります。
% aws ivs get-stream --channel-arn ${CHANNEL_ARN} --region us-west-2 { "stream": { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.ABXXXXXXXXNy.m3u8", "startTime": "2020-08-14T13:32:45+00:00", "state": "LIVE", "health": "HEALTHY", "viewerCount": 1 } } % aws ivs get-stream-key --arn ${STREAMKEY_ARN} --query streamKey.value --region us-west-2 --output text sk_us-west-2_es3bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX % aws ivs delete-stream-key --arn ${STREAMKEY_ARN} --region us-west-2 % aws ivs get-stream-key --arn ${STREAMKEY_ARN} --query streamKey.value --region us-west-2 --output text An error occurred (ResourceNotFoundException) when calling the GetStreamKey operation: ivs.ResourceNotFoundException: Resource: arn:aws:ivs:us-west-2:123456789012:stream-key/es3bXXXXXXXX not found
aws ivs list-stram-keys
コマンドでも確認してみましょう。以下のように空配列が返ってきました。
% aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --region us-west-2 { "streamKeys": [] }
この間もライブストリーミングは続行しています。ですがストリーミングキーは設定されていない状況です。マネジメントコンソールではChannel詳細ページを開くと「Failed to fetch stream key.」と赤で警告されます。またStream keyの欄には「-」と表示され、コピーボタンも無効状態でした。この状態でStreaming Software側での接続断、再接続などあればストリームキーが存在せず接続できない、となるかと推測します。
続いて、aws ivs create-stream-key
コマンドでストリームキーを作成します。コマンドの引数としてはChannelのARNを渡します。
% aws ivs delete-stream-key --channel-arn <value>
実行してみます。返り値としてstreamKey
で情報が返ります。ストリームキーの値もそうですが、ストリームキーのARN自体も変わることに気をつけましょう。
% aws ivs create-stream-key --channel-arn ${CHANNEL_ARN} --region us-west-2 { "streamKey": { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/NuPzXXXXXXXX", "value": "sk_us-west-2_NuPzXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "tags": {} } }
上記の返り値以外でストリームキーを取得する場合、再度aws ivs list-stream-keys
コマンドでChannelのARNからストリームキーのARNを取得、そのストリームキーのARNを引数としてaws ivs get-stream-key
コマンドを実行、という流れになります。
% aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --region us-west-2 { "streamKeys": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/NuPzXXXXXXXX", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "tags": {} } ] } % STREAMKEY_ARN=$(aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --query 'streamKeys[0].arn' --region us-west-2 --output text) % echo ${STREAMKEY_ARN} arn:aws:ivs:us-west-2:123456789012:stream-key/NuPzXXXXXXXX % aws ivs get-stream-key --arn ${STREAMKEY_ARN} --region us-west-2 { "streamKey": { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/NuPzXXXXXXXX", "value": "sk_us-west-2_NuPzXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "tags": {} } } % aws ivs get-stream-key --arn ${STREAMKEY_ARN} --query streamKey.value --region us-west-2 --output text sk_us-west-2_NuPzXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AWS CLIでストリームの停止
マネジメントコンソールでも確認した、ストリームの停止についてAWS CLIでも確認しておきましょう。 aws ivs stop-stream
コマンドが用意されています。
コマンド実行時の引数として、ChannelのARNを渡します。
% aws ivs stop-stream --channel-arn <value>
実際に、ライブストリーム中にaws ivs stop-stream
コマンドを実行してみます。まずはライブストリーム中であることを確認します。
% aws ivs get-channel --arn ${CHANNEL_ARN} --region us-west-2 { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "name": "reset-stream-key-channel", "latencyMode": "LOW", "type": "STANDARD", "ingestEndpoint": "28XXXXXXXXdb.global-contribute.live-video.net", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.ABXXXXXXXXNy.m3u8", "tags": {} } } % aws ivs get-stream --channel-arn ${CHANNEL_ARN} --region us-west-2 { "stream": { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.ABXXXXXXXXNy.m3u8", "startTime": "2020-08-16T02:47:29+00:00", "state": "LIVE", "health": "HEALTHY", "viewerCount": 1 } } % aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --region us-west-2 { "streamKeys": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/NuPzXXXXXXXX", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "tags": {} } ] } % aws ivs get-stream-key --arn ${STREAMKEY_ARN} --query streamKey.value --region us-west-2 --output text sk_us-west-2_NuPzXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
aws ivs stop-stream
コマンドを実行します。
% aws ivs stop-stream --channel-arn ${CHANNEL_ARN} --region us-west-2 'NoneType' object is not iterable
実行後、ライブストリーミングは停止します。このときストリームキーについては変更はありません。
% aws ivs get-channel --arn ${CHANNEL_ARN} --region us-west-2 { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "name": "reset-stream-key-channel", "latencyMode": "LOW", "type": "STANDARD", "ingestEndpoint": "28XXXXXXXXdb.global-contribute.live-video.net", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.ABXXXXXXXXNy.m3u8", "tags": {} } } % aws ivs get-stream --channel-arn ${CHANNEL_ARN} --region us-west-2 An error occurred (ChannelNotBroadcasting) when calling the GetStream operation: ivs.ChannelNotBroadcasting: Channel: arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy is not currently online % aws ivs list-stream-keys --channel-arn ${CHANNEL_ARN} --region us-west-2 { "streamKeys": [ { "arn": "arn:aws:ivs:us-west-2:123456789012:stream-key/NuPzXXXXXXXX", "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "tags": {} } ] } % aws ivs get-stream-key --arn ${STREAMKEY_ARN} --query streamKey.value --region us-west-2 --output text sk_us-west-2_NuPzXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Streaming Software側でも接続が途切れますが、ストリームキーが変わらないためリトライ機能があれば自動的に接続が再開、しばらくしてライブストリームも開始されます。
% aws ivs get-channel --arn ${CHANNEL_ARN} --region us-west-2 { "channel": { "arn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "name": "reset-stream-key-channel", "latencyMode": "LOW", "type": "STANDARD", "ingestEndpoint": "28XXXXXXXXdb.global-contribute.live-video.net", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.ABXXXXXXXXNy.m3u8", "tags": {} } } % aws ivs get-stream --channel-arn ${CHANNEL_ARN} --region us-west-2 { "stream": { "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/ABXXXXXXXXNy", "playbackUrl": "https://28XXXXXXXXdb.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.ABXXXXXXXXNy.m3u8", "startTime": "2020-08-16T02:54:34+00:00", "state": "LIVE", "health": "HEALTHY", "viewerCount": 1 } }
あくまでaws ivs stop-stream
コマンドについてはストリームの停止のみであることが確認できました。もしストリームキーが漏洩、意図しないライブストリーミングが行われている、というような状況であれば、ストリームキーをリセット(削除して再作成)した後、このストリームの停止を行う、という流れになるかと思います。
まとめ
Amazon Interactive Video Service (Amazon IVS)のストリームキーのリセットについて、AWSマネジメントコンソールならびにAWS CLIから確認してみました。現状、IVSのChannelについてはSecurity Groupのようなかたちでの保護ができません。(シンプルにするぶん割り切っているのかな、とも推測できますが。)ストリームキーの扱いは慎重に行うとともに、漏洩の可能性などがあればストリームキーのリセットを行いましょう。
また今回、AWSマネジメントコンソールとAPI(AWS CLIですがおおよそコマンドとAPIが紐づいている認識です)それぞれで操作してみて、APIがそれぞれ単機能で作成されていること、またAWSマネジメントコンソール側ではそれが使いやすいように上手に結合されていることが個人的には確認できたなと思います。AWSマネジメントコンソールでは「リセット」という1つの操作にまとめられているものが、APIでは「削除」、「作成」の2段階になっていることなど、興味深いなぁと思いました。