【小ネタ】AWS Elemental MediaLive の RTMP PUSH 入力ストリームキーを更新する

MediaLive 入力のエンドポイント更新をやってみました
2020.12.09

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

こんにちは、大前です。

掲題の件について調べる機会がありましたので、小ネタとしてブログを書きたいと思います。

背景

AWS Elemental MediaLive(以下 MediaLive)は AWS でライブ配信を行う際に使用できるサービスです。

OBS の様なソフトウェアや LiveWedge といったハードウェアからこの MediaLive に映像を送出する事で AWS 上で映像や音声を処理し、配信する事が出来ます。

この時、MediaLive への入力方法(タイプ)は様々なものを選択可能ですが、よく使われるものとしては RTMP が挙げられるのではないでしょうか。

入力タイプが RTMP の MediaLive 入力を作成すると、以下の様にエンドポイントが生成されます。配信者は、このエンドポイントを使用して映像を AWS に送る事が出来ます。

エンドポイントを変更したい

サービスによってはスポット的にライブ配信を行うのではなく、同じ MediaLive を複数のイベントで使用したり、異なるユーザから配信してもらう事もあると思います。

その際、ライブ配信毎にエンドポイントを変更したいという要件が発生する事があります。ずっと同じエンドポイントで配信可能にしてしまうと、過去に配信した事のあるユーザが同じエンドポイントを用いて勝手に映像を送ってくるリスク等が考えられるからです。


実現方法

MediaLive には UpdateInput という API が提供されており、これを使用する事で既存リソースのエンドポイントを変更する事が可能です。

Inputs inputId - UpdateInput

細かい API 仕様は上記公式ドキュメントを参照頂ければと思いますが、エンドポイントの更新に関わるパラメータは以下です。

(...)
"destinations": [
    {
        "streamName": "string"
    }
]
(...)

streamName に変更後のエンドポイントを指定して更新を行うのですが、エンドポイント内の IP アドレス以降の文字列を更新する事に注意点する必要があります。

例えば現状のエンドポイントが以下だとすると、hoge/streamkey 部分が更新されます。

rtmp://xx.xx.xx.xx:1935/hoge/streamkey

そのため、更新したいのは streamkey 部分だけであっても、下記の様に hoge/ も含めた文字列で指定する必要があります。

(...)
"destinations": [
    {
        "streamName": "hoge/updatestreamkey"
    }
]
(...)

これを認識していないと、予期しないエンドポイントが設定されてしまう事になるので、注意しましょう。

やってみた

実際にエンドポイントの更新をやってみたいと思います。更新方法としては API の他に、CLI や各種 SDK、もちろんコンソール上でも可能です。

今回は以下ドキュメントに従い、CLI で更新をやってみました。

AWS CLI Command Reference - Medialive - update-input

まず、update-input には変更対象の MediaLive Input の ID が必要なので、以下コマンドで取得します。

$ aws medialive list-inputs
{
    "Inputs": [
        {
            (...)
            "Id": "6711922",
            "InputClass": "STANDARD",
            (...)
            "Tags": {
                "Name": "blogtest-input"
            },
            "Type": "RTMP_PUSH"
        }
    ]
}

今回は Id が 6711922 の MediaLive Input を更新します。

この Input は STANDARD Class(エンドポイントが 2つ存在)であるため、destinations には 2つ分の StreamName を指定します。更新したいエンドポイントが片方であっても、2つ指定しないとエラーとなります。

$ aws medialive update-input --input-id 6711922 --destinations [{\"StreamName\":\"blogtest/afterA\"},{\"StreamName\":\"blogtest/afterB\"}]
{
    "Input": {
        (...)
        "Destinations": [
            {
                "Ip": "xx.xx.xx.xx",
                "Port": "1935",
                "Url": "rtmp://xx.xx.xx.xx:1935/blogtest/afterA"
            },
            {
                "Ip": "52.196.69.101",
                "Port": "1935",
                "Url": "rtmp://xx.xx.xx.xx:1935/blogtest/afterB"
            }
        ],
        "Id": "6711922",
        "InputClass": "STANDARD",
        (...)
        "Tags": {
            "Name": "stack1207-input"
        },
        "Type": "RTMP_PUSH"
    }
}


コマンド実行後、コンソールにてエンドポイントを確認すると更新されている事が確認できます。

おわりに

MediaLive の入力エンドポイントを更新する方法を紹介しました。

小ネタですが、要件として必要になる場面も多いと思いますので、どなたかのお役にたてば幸いです。


以上、AWS 事業本部の大前でした。

参考