AWS Elemental MediaLiveのRTMP pull inputを使ってみた

AWS Elemental MediaLiveでRTMP pull inputを使ってみました。映像ソースはCloudflare StreamのRTMP再生URLとしています。MediaLiveのInputがソースに接続するかたちとなります。
2022.09.30

はじめに

清水です。ブロードキャストグレードのライブ動画処理サービスであるAWS Elemental MediaLive、Inputでは様々なプロトコル(Input type)を利用可能です。その中でもRTMPは頻繁に使われるものの1つかと思いますが、このRTMPにもRTMP (push)RTMP (pull)の2つのInput typeが利用可能になっています。

「いわゆる」RTMPはRTMP (push)のほうで、例えばYouTube LiveやTwitchなど動画配信プラットフォームだったりAmazon IVSへ映像を打ち上げる際と同じ形式です。(ただしRTMPとRTMPSの違いはありますが、ここではおいておきましょう。)対してRTMP (pull)は入力となる映像ソースに対して接続して映像を受けるかたちです。再生Playerの挙動がイメージしやすいかと思います。

このMediaLiveのRTMP pull inputなのですが、私はこれまで使う機会がありませんでした。映像Sourceが準備できなかったことが理由なのですが、先日Cloudflareの動画配信プラットフォームCloudflare Streamを触っている際、RTMPでの接続に対応していることに気がつきました。

これを使えばMediaLiveのRTMP pull inputの動作確認ができる!ということで、AWS Elemental MediaLiveリリースの2017年11月からおよそ5年を経た検証をやってみたのでまとめてみます。

MediaLiveのRTMP pull inputを使ってみた

それでは実際にCloudflare Streamを映像Sourceとして、MediaLiveのRTMP pull inputを使ってみます。MediaLiveへの入力(映像Source)としてはCloudflare Streamとなり、Cloudflare Streamに別途Streaming Softwareから映像を打ち上げるかたちです。以下のような構成となります。

SourceとなるCloudflare Stream側の準備と確認

まずは映像SourceとなるCloudflare Stream側の準備、RTMPエンドポイントを確認しておきます。

ライブ入力作成後の画面で、「接続情報」の箇所を確認します。RTMPS URLはStreaming Software側、そしてRTMP pullするMediaLiveの双方で共通のrtmps://live.cloudflare.com:443/live/です。ここでRTMPSキーはStreaming Softwareに設定する情報です。

MediaLiveのRTMP pull inputに設定する情報はRTMPS再生キーになります。

[表示]ボタンを押下して、ランダムな65文字ほどの英数字が取得できました。

先ほどのRTMPS URLとあわせて、以下が再生用URLとなります。

  • rtmps://live.cloudflare.com:443/live/f0cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

MediaLiveでRTMP pull inputを作成

映像Sourceのほうが準備できたので、続いて本題となるMediaLiveのRTMP pull inputを作成します。MediaLiveのマネジメントコンソール、Inputsの[Create input]から進みます。

Input nameを入力します。「medialive-rtmp-pull-input」としました。Input typeではRTMP (pull)を選択します。Input classはSINGLE_INPUTとします。Input source AのURLの欄に、先ほど確認したCloudflare StreamのRTMPS再生用URLの情報を入力します。

  • rtmps://live.cloudflare.com:443/live/f0cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Inputが作成できました。RTMP pushのときに提供されていた、EndpointとしてIPアドレスなどは提供されません。Input security groupsも設定していませんでしたね。 その代わり、SourcesとしてCloudflare Streamの再生用URLが指定されているぐあいです。

Input以外のリソースをMediaLive Workflowで作成

RTMP pullなMediaLive Inputが作成できました。続いてMediaLive Channel以降のリソースを作成していきます。MediaLive Workflowを使って作成していきますが、残念ながらInput typeでRTMP (pull)を指定することができません。いちどRTMP (push)なInput typeで作成しておいて、あとからInputリソースを付け換えるということで対応しました。

MediaLiveのマネジメントコンソール、Workflow wizardのページから[Create workflow]ボタンで進みます。

Input typeをいちどRTMP (push)で作成しておきます。Application name and instanceはdummyとしておきました。

Video outputはMediaPackageを選択します。検証用途ですのでABRせずに出力ビットレートは1つのみとしました。

Review内容が以下です。[Create workflow resources]でWorkflowを作成します。

Workflowが作成できたら、Inputの付け換えを行います。MediaLive Channelのページに遷移します。

右上Channel ActionsからModify - Edit channelでChannel設定変更画面に進みます。

Input attachmentsの項目で、すでに設定済みの「medialive-rtmp-pull-workflow」を[Remove]します。

Input attachmentsが空になります。先ほど作成したmedialive-rtmp-pull-inputを選択して[Confirm]ボタンを押下します。

[Update channel]ボタンを押して設定完了です。

Inputが付け換わりました。

なお、Input自体は消えていない点に注意しましょう。Workflow削除時は、最初のInputに戻しておくと確実かと思います。

映像を打ち上げて動作確認

リソースの準備ができたので、実際に映像を打ち上げて動作確認をしてみます。Cloudflare Streamに映像を打ち上げるStreaming SoftwareはiPhone XS上のZixi ONAIRを使用しました。設定情報など詳細は以下エントリを参照ください。

Streaming Softwareから映像をCloudflare Streamに打ち上げたら、まずはCloudflare Stream側で問題なく再生できていることを確認しておきましょう。(ブラウザで確認できるのはRTMP形式ではないので、厳密な確認ではありません。ただCloudflare Stream側に映像が問題なく送れていることの確認にはなっているかと考えます。)

続いて、MediaLiveのWorkflow(もしくは該当するChannel)をStartさせます。

視聴にはMediaPackageのHLS endpointを使用しました。CloudFront経由のURL(CloudFront URL)を使用します。

再生PlayerはmacOS上のSafariブラウザを使用しました。Cloudflare Streamに打ち上げた映像が、MediaLiveのRTMP pull inputを経由して再生することができました!

まとめ

AWS Elemental MediaLiveのRTMP pull inputをCloudflare StreamのRTMP再生URLをSourceとして使ってみました。一般によく使われるRTMP push Inputのような、MediaLive側のEndpointを映像Source側に渡しMediaLiveが接続される側となるのではなく、MediaLiveが映像Sourceへの接続する側となります。ちょっとおもしろい感覚だなと個人的には思いました。(ただ、以前Amazon IVSを録画する構成でHLS pullなInputは使っていたので、これと同じような構成ではあるのですが。)

RTMP pull inputについてはAWS Elemental MediaLiveリリース時の2017年11月から実装されていた機能になります。(【やってみた】AWS Elemental MediaLiveとAWS Elemental MediaPackageでライブ配信してみた #reinvent | DevelopersIO)当時から、映像ソースとなるRTMP再生URLを機会があれば探していたのですが、ラストマイルのRTMPが下火になっていたことからなかなか探すのに難儀して月日だけが流れていきました。Wowza Streaming EngineなどStreaming Serverを構築してみようかと思ったこともありますが、やはりラストマイルのRTMPが空前の灯火になっていたことで最新のStreaming Serverでもサポートを終えているのではないかと気が乗りませんでした。そんな中、Cloudflareの動画配信プラットフォームCloudflare Streamで幸運にもRTMP再生ができることを知り、無事5年越しの動作検証に至ることができたわけです。

おまけ: プライベートサブネット配下でMediaLive RTMP pull inputは使えるか!?

実は5年越しの動作検証をした理由の1つに、SRT Listener/Callerの違いを整理した際、RTMP push/pullの違いについても確認してみたことがあります。(いや、もちろんCloudflare StreamでRTMP再生ができなかったらこの検証は難しいままだったわけですが。)

またRTMP pullと同様に接続する側として動作するSRT Callerでは、インターネット接続にNAT Gatewayが必要なプライベートサブネットでも動作する、という確認ができました。SRT caller modeなMediaConnectのVPC Sourceを使用した検証です。

ところでMediaConnectと同様、MediaLiveでもInput/Output双方でVPCをサポートしています。

プライベートサブネット配下のRTMP pull inputでもMediaConnectのVPC SourceのようにNAT Gateway経由で動作することができるのでは、ということで確認した結果をまとめてみます。

「おまけ」とした理由はRTMP pull inputをVPC配下に作成できないという仕様があり、この検証自体が実現できなかったためです。試行錯誤の記録としてお楽しみください。

マネジメントコンソールからはRTMP pull inputでNetwork modeを選択できない

まずはマネジメントコンソールからVPCなRTMP pull inputをサクッと作成してしまおうと試みます。例えばRTMP (push)であれば、以下のようにInput typeを選択した次の項目でNetwork modeをPublicかVPCか選択することができます。

Input typeをRTMP (pull)に変更してみましょう。Network modeの項目は消えてしまい、Input classの選択が続くかたちになってしまいます。

AWS CLIを使ってVPCなRTMP pull inputの作成を試みるが失敗

マネジメントコンソールからではVPCなRTMP pull inputの作成はできませんでした。それでもAWS CLIを使えば設定できるのでは、と、こちらを試してみます。(ちょうどMediaConnectのVPCなSRT caller sourceが、マネジメントコンソールからではエラーで作成で、AWS CLIを用いて作成した、ということもありました。AWS Elemental MediaConnectのSRT caller modeをプライベートサブネットで使ってみた | DevelopersIO

以下のようなJSONファイルを準備しておきます。

medialive-rtmp-pull-vpc-input.json

{
  "Name": "medialive-rtmp-pull-vpc-input",
  "RoleArn": "arn:aws:iam::123456789012:role/MediaLiveAccessRole",
  "Sources": [
    {
      "Url": "rtmps://live.cloudflare.com:443/live/f0cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    }
  ],
  "Type": "RTMP_PULL",
  "Vpc": {
    "SecurityGroupIds": [
      "sg-09e1xxxxxxxxxxxxx"
    ],
    "SubnetIds": [
      "subnet-0589xxxxxxxxxxxxx"
    ]
  }
}

aws medialive create-inputコマンドでInputを作成します。特にエラーなどはなく、Inputは作成されているようです。

% aws medialive create-input --cli-input-json file://medialive-rtmp-pull-vpc-input.json
{
    "Input": {
        "Arn": "arn:aws:medialive:ap-northeast-1:123456789012:input:92xxxxx",
        "AttachedChannels": [],
        "Destinations": [],
        "Id": "92xxxxx",
        "InputClass": "SINGLE_PIPELINE",
        "InputDevices": [],
        "InputPartnerIds": [],
        "InputSourceType": "STATIC",
        "MediaConnectFlows": [],
        "Name": "medialive-rtmp-pull-vpc-input",
        "RoleArn": "arn:aws:iam::123456789012:role/MediaLiveAccessRole",
        "SecurityGroups": [],
        "Sources": [
            {
                "Url": "rtmps://live.cloudflare.com:443/live/f0cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            }
        ],
        "State": "DETACHED",
        "Tags": {},
        "Type": "RTMP_PULL"
    }
}

しかし、出力内容をよく確認してみましょう。VPCに対する設定(サブネット情報やSecurity Group情報)がありません。試しにaws medialive describe-inputコマンドでも確認してみますが、状況は変わりません。

% aws medialive describe-input --input-id 92xxxxx
{
    "Arn": "arn:aws:medialive:ap-northeast-1:123456789012:input:92xxxxx",
    "AttachedChannels": [],
    "Destinations": [],
    "Id": "92xxxxx",
    "InputClass": "SINGLE_PIPELINE",
    "InputDevices": [],
    "InputPartnerIds": [],
    "InputSourceType": "STATIC",
    "MediaConnectFlows": [],
    "Name": "medialive-rtmp-pull-vpc-input",
    "RoleArn": "arn:aws:iam::123456789012:role/MediaLiveAccessRole",
    "SecurityGroups": [],
    "Sources": [
        {
            "Url": "rtmps://live.cloudflare.com:443/live/f0cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        }
    ],
    "State": "DETACHED",
    "Tags": {},
    "Type": "RTMP_PULL"
}

RTMP pull inputはVPCサポート外

MediaLiveのUser Guideを確認してみると、作成できるInputの項目としてVPCなRTMP push inputは記載がありますが、VPCなRTMP pull inputは記載がありませんでした。マネジメントコンソールの表示のとおり、RTMP pull inputとしてはVPC非対応ということですね。

Creating an input - AWS Elemental MediaLive

AWS CLIでInputリソース自体が作成できたのは不要なパラメータを無視して作成している状態かと推測しています。ということで、プライベートサブネット配下のMediaLive RTMP pull inputでの検証を試みましたが、サポート対象外ということが確認できたという結末に終わりました。