Amazon Interactive Video Service (Amazon IVS)でストリームキーをリセットしてみた

Amazon Interactive Video Service (Amazon IVS)使用の際はストリームキーのリセットについてもおさえておきましょう。手順や挙動をマネジメントコンソールならびにAWS CLIから確認してみました。
2020.08.16

はじめに

清水です。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-keyaws ivs create-stream-keyが準備されています。

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段階になっていることなど、興味深いなぁと思いました。