[UPDATE] Amazon IVSでライブストリームの入力を監視できる新たなCloudWatch MetricsとAPIが追加されました!

Amazon IVSで入力しているライブストリーミングの状態を詳細に確認できるようになりました。入力状態をCloudWatchメトリクスで確認したり、Streamsセッションごとの詳細情報が取得できるようになっています。
2021.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。本日お届けするアップデート情報はこちら!AWSのマネージド型ライブストリーミングソリューションであるAmazon IVS (Amazon Interactive Video Service)でライブストリームの入力を監視する新たなCloudWatch MetricsとAPIが追加されました!(2021/11/18付でポストされたアップデート情報です。)

このアップデートと同じタイミング(2021/11/18付)でAmazon Interactive Video ServiceのAPIについても更新(2つの新しいAPI methodsの追加と、2つのAPI methodsの更新)がされています。

またユーザガイドのRelease Notesの項目では「Stream Health」として紹介されています。

本エントリではこのAmazon IVSのアップデートについて、詳細を確認してみたのでまとめてみます。本アップデートに関するマネジメントコンソールの更新もあり、Amazon IVSでライブストリームの入力(Ingest)の確認や監視がぐっと容易になるアップデートかと思います。

Amazon IVSに新たに追加されたIngest確認用のCloudWatch Metrics

まずは新たに追加されたCloudWatch Metricsを確認してみましょう。IVSのユーザガイドの以下のページに記載があります。

追加されたCloudWatchメトリクスは以下の4つです。説明部分は上記ドキュメントページ(英語)の内容をGoogle翻訳で変換したものを記載しています。(2021/11/29時点で日本版ドキュメントにはまだ反映がされていないようですので、詳細は英語版ドキュメントを参照しましょう。)

  • IngestAudioBitrate
    • ストリーミング時にAmazonIVSが受信するオーディオデータの量。ビットレートが高いほど、利用可能なインターネット帯域幅が多く使用されます。
  • IngestFramerate
    • ストリーミング時にAmazonIVSがアニメーションフレームを受信する頻度。
  • IngestVideoBitrate
    • ストリーミング時にAmazonIVSが受信するビデオデータの量。ビットレートが高いほど、利用可能なインターネット帯域幅が多く使用されます。ビットレートを高くするとビデオ品質が向上しますが、それは特定のポイントまでです。
  • KeyframeInterval
    • 前のフレームとの違いだけでなく、フレーム全体が送信されるビデオストリーム内のポイント。

いずれのメトリクスもDimensionはChannelとなり、Channelごとの状況が監視できます。またHigh-resolution metric(高解像度メトリック)として、1秒単位のメトリックが参照可能です。ただし利用できるのは3時間まで、3時間以降の最も解像度の高いメトリックは60秒単位となります。(CloudWatchの高分解能カスタムメトリクスの保持期間が適用されます。「すべてのメトリクスの保存期間はどうなっていますか?」 - よくある質問 - Amazon CloudWatch | AWS

Amazon IVSに新たに追加されたstreaming session確認用のAPI

続いて新たにIVSに追加されたAPIについても確認しておきましょう。1つ目はListStreamSessionsです。AWS CLIだとivs list-stream-sessionsコマンドが該当します。アカウント内の指定されたChannelの現在及び過去のストリームの概要を取得することができます。(APIについては、本エントリ後半で実際の使用例を確認します。)

新たに追加されたAPIの2つ目はGetStreamSessionです。AWS CLIだとivs get-stream-sessionが該当します。コマンド実行時に指定したストリームの詳細メタデータを取得することができます。ListStreamSessionsの詳細版というイメージで良いかと思います。

以上、ListStreamSessionsGetStreamSessionが新たに追加された2つのAPIです。またAPIの更新については、ListStreamsのAPIでStream Healthによるフィルタリング機能の追加、ならびにレスポンスにstreamIdが追加され、またGetStreamのAPIでも同様にstreamIdがレスポンスに追加されています。AWS CLIではivs list-streamsivs get-streamコマンドがそれぞれ該当します。

詳細については、上記AWS CLIの各コマンドのドキュメントや本エントリ冒頭でも示したAWS API Changesをご確認ください。

実際のライブストリーミング中にIVSのStream Healthを確認してみる

ドキュメントなどをもとにアップデートされたCloudWatch MetricsならびにAPIを確認してみました。さらに実際にIVSを使ってライブストリーミングを行い、どのようにStream Healthが確認できるかみてみましょう。

マネジメントコンソールからの確認

まずはマネジメントコンソールからIVSのChannelを作成します。コントロールプレーン *1のリージョンはオレゴン(us-west-2)を選択しました。Channel nameは「channel-1」とし、その他の項目はデフォルトのまま[Create Channel]します。

Channel作成後、Stream configurationをストリーミングソフトウェアに設定してライブストリーミングを開始します。今回はiPhone XS上でZixi ONAIRを使用しました。

ライブストリーミング開始後、マネジメントコンソールのIVSの該当Channelの画面、Playback configurationの下にStream sessionsの項目がありますね。 *2Stream IDの文字列をクリックして進んでみましょう。

Stream overviewとHealthyの表示、そしてCloudWatch Metricsへのリンク。さらにはEventsとして、SessionのCreate、Startの時刻が表示されていますね。さらに画面を下にスクロールすると、Encoder settingsの項目も表示されます。詳細は後述しますが、これらストリームの詳細情報については新たに追加されたGetStreamSession APIから取得可能なものです。

続いて[View in CloudWatch]のリンクから新たに追加されたCloudWatch Metricsを確認してみましょう。以下のようにIVSへIngestされているVideo/Audioのビットレート、フレームレート、そしてキーフレームインターバルが表示されます。この[View in CloudWatch]のリンクからCloudWatchのマネジメントコンソールに飛ぶとPeriod 5秒で表示されています。Y軸が適切に設定されている点も嬉しいポイントですね。

Periodは最短の1秒にも変更可能です。

ここでストリーミングソフトウェア側でいちどライブストリーミングをストップ、さらにエンコード設定を少し変更してみます。Ingestする解像度とビットレートの設定について、ストリーミングを一時停止する前は1080p30 5000kbpsだったものを、720p30 3000kbpsとしてみます。

これでストリーミングソフトウェアからのIngestを再開します。マネジメントコンソールのChannel画面、Stream sessionsの項目で1つ目(さきほどLIVEだったもの)のほか、もう1つのStreamが現れ、こんどはこちらがLIVEになっています。

1つ目(この段階でLIVEになっていないほう)のStreamのほうを確認してみると、以下のようにOfflineとなり、EventsにSession Endedが記録されていることがわかります。

2つ目の、この段階でLIVEマークがついているほうのStreamは以下のようになります。

ページを下にスクロールして、Encoder settingsを確認してみましょう。変更したResolution/Target bitrateが変わっていることが確認できますね。

[View in CloudWatch]からIngestに関するメトリクスも確認してましょう。こちらもVideoビットレートが3Mbpsに変わっていることを確認することができました。

AWS CLIを使った確認

マネジメントコンソールからStream IDごとのStreamの状態や、CloudWatch Metricsなどが確認できました。Stream HealthについてAWS CLIを使ってAPIレベルでの確認も行ってみみあしょう。

まずはストリーミングを中断する前の(1つ目のStream session)を使用している状態です。まずはivs list-streamsコマンドとivs get-streamコマンドです。新たに追加されているstreamIDなどが確認できますね。

% aws ivs list-streams --region us-west-2
{
    "streams": [
        {
            "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX",
            "health": "HEALTHY",
            "startTime": "2021-11-28T17:04:04+00:00",
            "state": "LIVE",
            "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX",
            "viewerCount": 2
        }
    ]
}
% aws ivs get-stream --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2
    "stream": {
        "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX",
        "health": "HEALTHY",
        "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8",
        "startTime": "2021-11-28T17:04:04+00:00",
        "state": "LIVE",
        "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX",
        "viewerCount": 1
    }
}

続いて、新しく追加されたivs live-stream-sessionsget-stream-sessionコマンドです。get-stream-sessionコマンドのほうでは、ingestConfigurationtruncatedEventsなどで詳細な情報が確認可能です。

% aws ivs list-stream-sessions --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2
{
    "streamSessions": [
        {
            "hasErrorEvent": false,
            "startTime": "2021-11-28T17:03:57+00:00",
            "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX"
        }
    ]
}
% aws ivs get-stream-session --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --stream-id st-1DtG0XXXXXXXXXXXXXXXXXX --region us-west-2
{
    "streamSession": {
        "channel": {
            "arn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX",
            "authorized": false,
            "ingestEndpoint": "2893XXXXXXXX.global-contribute.live-video.net",
            "latencyMode": "LOW",
            "name": "channel-1",
            "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8",
            "recordingConfigurationArn": "",
            "type": "STANDARD"
        },
        "ingestConfiguration": {
            "audio": {
                "channels": 1,
                "codec": "mp4a.40.2",
                "sampleRate": 48000,
                "targetBitrate": 96000
            },
            "video": {
                "avcLevel": "4.0",
                "avcProfile": "High",
                "codec": "avc1.640028",
                "encoder": "",
                "targetBitrate": 5000000,
                "targetFramerate": 30,
                "videoHeight": 1080,
                "videoWidth": 1920
            }
        },
        "startTime": "2021-11-28T17:03:57+00:00",
        "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX",
        "truncatedEvents": [
            {
                "eventTime": "2021-11-28T17:04:04+00:00",
                "name": "Stream Start",
                "type": "IVS Stream State Change"
            },
            {
                "eventTime": "2021-11-28T17:03:57+00:00",
                "name": "Session Created",
                "type": "IVS Stream State Change"
            }
        ]
    }
}

続いて、ストリーミングを一時中断してストリーミングソフトウェア側でIngestする解像度とビットレートを変更、再開後のライブストリーミング中のAWS CLIの実行結果です。ivs list-streamsコマンドとivs get-streamコマンドの実行結果では、StreamIDが変わっていることが確認できます。

% aws ivs list-streams --region us-west-2
{
    "streams": [
        {
            "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX",
            "health": "HEALTHY",
            "startTime": "2021-11-28T17:10:48+00:00",
            "state": "LIVE",
            "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX",
            "viewerCount": 1
        }
    ]
}
% aws ivs get-stream --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2
{
    "stream": {
        "channelArn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX",
        "health": "HEALTHY",
        "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8",
        "startTime": "2021-11-28T17:10:48+00:00",
        "state": "LIVE",
        "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX",
        "viewerCount": 1
    }
}

続いて新しく追加されたivs live-stream-sessionsコマンドです。現在のStreamIDのほか、さきほど(中断前の)StreamIDについても確認が可能です。中断前のStreamSessionについては、endTimeの項目が追加されています。

% aws ivs list-stream-sessions --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --region us-west-2
{
    "streamSessions": [
        {
            "hasErrorEvent": false,
            "startTime": "2021-11-28T17:10:40+00:00",
            "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX"
        },
        {
            "endTime": "2021-11-28T17:09:53+00:00",
            "hasErrorEvent": false,
            "startTime": "2021-11-28T17:03:57+00:00",
            "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX"
        }
    ]
}

ivs get-stream-sessionコマンドで1つ目、中断前のStream Sessionの詳細情報を確認してみます。truncatedEventsStream EndSession Endが確認できます。

% aws ivs get-stream-session --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --stream-id st-1DtG0XXXXXXXXXXXXXXXXXX --region us-west-2
{
    "streamSession": {
        "channel": {
            "arn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX",
            "authorized": false,
            "ingestEndpoint": "2893XXXXXXXX.global-contribute.live-video.net",
            "latencyMode": "LOW",
            "name": "channel-1",
            "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8",
            "recordingConfigurationArn": "",
            "type": "STANDARD"
        },
        "endTime": "2021-11-28T17:09:53+00:00",
        "ingestConfiguration": {
            "audio": {
                "channels": 1,
                "codec": "mp4a.40.2",
                "sampleRate": 48000,
                "targetBitrate": 96000
            },
            "video": {
                "avcLevel": "4.0",
                "avcProfile": "High",
                "codec": "avc1.640028",
                "encoder": "",
                "targetBitrate": 5000000,
                "targetFramerate": 30,
                "videoHeight": 1080,
                "videoWidth": 1920
            }
        },
        "startTime": "2021-11-28T17:03:57+00:00",
        "streamId": "st-1DtG0XXXXXXXXXXXXXXXXXX",
        "truncatedEvents": [
            {
                "eventTime": "2021-11-28T17:09:53+00:00",
                "name": "Session Ended",
                "type": "IVS Stream State Change"
            },
            {
                "eventTime": "2021-11-28T17:09:53+00:00",
                "name": "Stream End",
                "type": "IVS Stream State Change"
            },
            {
                "eventTime": "2021-11-28T17:04:04+00:00",
                "name": "Stream Start",
                "type": "IVS Stream State Change"
            },
            {
                "eventTime": "2021-11-28T17:03:57+00:00",
                "name": "Session Created",
                "type": "IVS Stream State Change"
            }
        ]
    }
}

中断後の2つ目のStream Sessionの詳細情報を、同じくivs get-stream-sessionコマンドで確認してみます。Stream/Sessionの終了(End)の情報はありません。またマネジメントコンソールで確認したように、ここでもtargetBitrateと解像度(videoHeight, videoWidth)が変わっていることが確認できます。

2つ目のセッションは、

% aws ivs get-stream-session --channel-arn arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX --stream-id st-1DxirXXXXXXXXXXXXXXXXXX --region us-west-2
{
    "streamSession": {
        "channel": {
            "arn": "arn:aws:ivs:us-west-2:123456789012:channel/SHl3XXXXXXXX",
            "authorized": false,
            "ingestEndpoint": "2893XXXXXXXX.global-contribute.live-video.net",
            "latencyMode": "LOW",
            "name": "channel-1",
            "playbackUrl": "https://2893XXXXXXXX.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.SHl3XXXXXXXX.m3u8",
            "recordingConfigurationArn": "",
            "type": "STANDARD"
        },
        "ingestConfiguration": {
            "audio": {
                "channels": 1,
                "codec": "mp4a.40.2",
                "sampleRate": 48000,
                "targetBitrate": 96000
            },
            "video": {
                "avcLevel": "3.1",
                "avcProfile": "High",
                "codec": "avc1.64001F",
                "encoder": "",
                "targetBitrate": 3000000,
                "targetFramerate": 30,
                "videoHeight": 720,
                "videoWidth": 1280
            }
        },
        "startTime": "2021-11-28T17:10:40+00:00",
        "streamId": "st-1DxirXXXXXXXXXXXXXXXXXX",
        "truncatedEvents": [
            {
                "eventTime": "2021-11-28T17:10:48+00:00",
                "name": "Stream Start",
                "type": "IVS Stream State Change"
            },
            {
                "eventTime": "2021-11-28T17:10:40+00:00",
                "name": "Session Created",
                "type": "IVS Stream State Change"
            }
        ]
    }
}

まとめ

Amazon IVSでストリームの状態(Stream Health)を確認するために新たに追加されたCloudWatchメトリクスとAPIについて確認してみました。Amazon IVS側でどのような状態でストリーム(Ingest)を受けているかの確認が用意にできるようになりました。問題発生時の原因調査なども行いやすくなりますね。またCloudWatchメトリクスからアラーム等に連携し、問題が発生したときの早期発見にもつなげられるかなと思いました。

Amazon IVSについては簡単にライブストリーミングができることが魅力のサービスですが、そこにより詳細な状態監視機能が加わった、大変うれしいアップデートだなと思いました。

脚注

  1. Amazon IVSではほか多くのAWSサービスと異なり、グローバルなデータプレーンとリージョナルなコントロールプレーンで構成されています。ということがここ最近IVSユーザガイドの冒頭ページに記載されるようになりましたね。
  2. 私の記憶違いでなければこれまでこの項目はなく、今回のアップデートで追加された箇所かと思います。