[update] AWS Elemental MediaLiveでSRT Outputをサポートしました!

[update] AWS Elemental MediaLiveでSRT Outputをサポートしました!

MediaLiveがこれまでのSRT caller inputに加え、SRT caller outputもサポートしました!Encryption Passphrase利用のためSecrets Managerとの連携が必要な点に注意しましょう。
Clock Icon2024.10.11

はじめに

清水です。ブロードキャストグレードのライブ動画処理サービスであるAWS Elemental MediaLiveでSRTプロトコルによる出力をサポートするアップデートがありました。本ブログエントリ執筆の2024/10/10時点ではAWS What's Newへのポストはありませんが、AWS CLIのCHANGELOG1.34.17 の記載でアップデートを確認できます。(AV1 CodecのサポートMediaLive Anywhereの登場と同じタイミングでのアップデートだったようですね。)

  • api-change:medialive: Adds AV1 Codec support, SRT ouputs, and MediaLive Anywhere support.

AWSマネジメントコンソールでも、選択できるOutput gropu typeにSRTがあることが確認できます。

MediaLiveマネジメントコンソールでOutput groupsにSRT output group typeが追加されているスクリーンショット

非公式ながらアップデート確認に非常に役に立つAWS API Changesのサイトでも、2024/09/11付けで記載がありました。

MediaLiveのSRTプロトコル対応については、今年2024年7月にInputでのサポートがありましたね。

このSRT Inputサポートについては、Callerとして動作する点が大きなポイント(注意点)だったかと個人的には思います。今回のSRT Outputのサポート、先ほどのマネジメントコンソールのスクリーンショットの通り、MediaLiveはCallerとして動作します。送信先はListenerとして動作する必要がある点に注意しましょう。

本エントリではMediaLiveのSRT Outputを実際に使ってみたのでまとめてみたいと思います。SourceをSRT Listenerとして設定したMediaConnectを、MediaLiveからの映像の出力先としました。

MediaLiveでSRT Outputを使ってみた

それでは実際にMediaLiveのSRT Outputを使用して、MediaConnectに映像を出力してみます。映像自体はOBS StudioからRTMPを使ってMediaLiveに打ち上げます。確認のため、MediaLiveで映像にタイムコードの焼き付けを行い、MediaConnectに出力します。MediaConnectではSRT listenerなOutputを行い、手元のPC上でVLC media playerを使ってMediaConnectからの映像を視聴します。以下のような構成になりますね。

MediaLive SRT Output動作検証の構成図

MediaLiveでSRT Outputを使用する際、Encryption Passphraseの設定でAWS Secrets Managerと連携する必要があります。この連携はMediaConnect側でも必要です。MediaLiveやMediaConnectのリソースの作成の前に、まずはEncryption PassphraseのSecrets Managerへの保存、そして連携のために必要なIAMロールまわりの設定を確認します。ついで、MediaConnectのリソースの作成、MediaLiveのリソースの作成を行い、実際にOBS Studioから映像を打ち上げ視聴を確認します。

SRT Encryption passphraseの作成とSecret Managerへの保存

まずはSRT Outputで使用するEncryption Passphraseを作成、AWS Secrets ManagerにSecretとして保存します。このSRTの暗号化まわりの設定、今回は以下のMediaConnectのUser Guideを参考に進めました。

はじめにSRT Encryption passphrase(Encryption passwordやSRTパスワードなどともいいますね)自体を決めます。今回は64文字のランダムな英小文字と数字の羅列をパスワードジェネレーターで作成しました。以下を使用します。

4hzdn1ojmcwr4o6v783njt9zxbiy39rqxgnob2o6bh353ppv2vxt8iek0k2zcv49

これをSecrets ManagerにSecretsとして保存します。Secrets Managerのマネジメントコンソール、Secretsの一覧ページから[Store a new secret]ボタンで進みます。Secret typeではOther type of secretを選択、Key/value pairsの項目ではPlaintextを選択して、上記SRTパスワードをそのまま入力します。Encryption keyはデフォルトのaws/secretsmanagerのまま進めます。

Secrets作成画面のスクリーンショット

Secret nameを適切に入力します。今回はSecret nameをMediaLive/SRTEncryptionPassphrase/medialive-srt-outputとしました。Descriptionも適切に入力しておきましょう。[Next]で進みます。

Secrets作成画面のスクリーンショット、その2

Configure automatic rotationの設定、Automatic rotationは off のまま進めます。

Secrets作成画面のスクリーンショット、その3

Review画面で内容を確認、[Store]ボタンでSecretを作成します。

Secrets作成画面のスクリーンショット、その4
Secrets作成画面のスクリーンショット、その5

Secretが作成できました。Secret nameとSecret ARNを控えておきましょう。

Secrets作成画面のスクリーンショット、その6

MediaLive用IAMロールがSecrets Managerにアクセスできることの確認

SRTパスワード用のSecretが作成できました。続いてMediaLiveとMediaConnectがこのSecretにアクセスできるか、IAMロールを確認、必要があればIAMロールの作成をしていきます。

先にMediaLiveのIAMロールから確認です。マネジメントコンソールでデフォルトで作成されるMediaLiveAccessRoleを使用することを前提とします。以前、MediaLiveのSRT caller inputでPassphraseを使用した際は、MediaLive用IAMロールにSecretへのアクセス権限を追加していました。今回も同様の手順が必要かと思ったのですが、改めてマネジメントコンソールからMediaLiveAccessRoleのPermissions policiesに設定されているMediaLiveCustomPolicyを確認してみると、secretsmanager:GetSecretValueについての許可が含まれていました。

最新のMediaLiveAccessRoleの設定内容のスクリーンショット

MediaLiveCustomPolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediastore:ListContainers",
                "mediastore:PutObject",
                "mediastore:GetObject",
                "mediastore:DeleteObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:DescribeLogGroups"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediaconnect:ManagedDescribeFlow",
                "mediaconnect:ManagedAddOutput",
                "mediaconnect:ManagedRemoveOutput"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:describeSubnets",
                "ec2:describeNetworkInterfaces",
                "ec2:createNetworkInterface",
                "ec2:createNetworkInterfacePermission",
                "ec2:deleteNetworkInterface",
                "ec2:deleteNetworkInterfacePermission",
                "ec2:describeSecurityGroups",
                "ec2:describeAddresses",
                "ec2:associateAddress"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediapackage:DescribeChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediapackagev2:PutObject",
                "mediapackagev2:GetChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "*"
        }
    ]
}

MediaLive用IAMロール(デフォルトではMediaLiveAccessRole)をマネジメントコンソールで設定した際、MediaLive側の機能追加などでポリシーなどの更新の必要がある場合にIAMロールの更新を促されます。(AWS Elemental MediaLiveで使用するIAMロールをアップデートしてみた | DevelopersIO

上記のポリシーへの変更、たしか2024/09/17ごろ(MediaLive Anywhereの動作を確認していました)更新があったと記憶しています。

いちどMediaLive用IAMロール(デフォルトMediaLiveAccessRole)のPolicyを確認し、上記のようにsecretsmanager:GetSecretValueの許可が含まれていない場合には、マネジメントコンソールで該当IAMロールを選択してロールのアップデートを行いましょう。(手順はこちらのブログエントリなどを参照ください。)

Secrets ManagerにアクセスできるMediaConnect用IAMロールを作成

続いてはMediaLiveの連携先となるMediaConnect側のIAMロールについて確認します。今回、MediaConnect側にはデフォルトで利用するIAMロールといったものがなかったので(MediaConnectについては、SRTプロトコルの利用でもEncryption/Decryptionを設定しなければIAMロールを指定せずとも利用できる認識です)、IAMロールを作成するところからはじめます。こちらもMediaConnectのUser Guide、以下ページを参考に進めました。

IAMのマネジメントコンソール、Policiesの一覧ページから[Create policy]ボタンで進みます。Policy editorの項目でJSONを選択し、以下の内容を入力します。Resourceの要素は先ほど作成したSecretのARNとします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecretVersionIds"
      ],
      "Resource": [
        "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:MediaLive/SRTEncryptionPassphrase/medialive-srt-output-H2IK0P"
      ]
    }
  ]
}

MediaConnect用IAMポリシー作成画面、その1

Review and create画面でPolicy nameを入力します。今回はUser GuideにならいSecretsManagerForMediaConnectとしました。Descriptionも適切に入寮し、[Create policy]ボタンでPolicyを作成します。

MediaConnect用IAMポリシー作成画面、その2

Policyが作成できました。

MediaConnect用IAMポリシー作成画面、その3

続いてIAMロールの一覧ページに進みます。[Create role]ボタンからIAMロールの作成をはじめます。Trusted entitiy typeではデフォルトのAWS serviceを、Use caseではEC2を選択します。(のちほど、ロールを使用するサービスをMediaConnectに変更します。)

MediaConnect用IAMロール作成画面、その1

Add permissionsの項目では、先ほど作成したPolicy SecretsManagerForMediaConnectを選択します。

MediaConnect用IAMロール作成画面、その2

Name, review, and create画面です。Role nameを適切に入力します。User GuideにはMediaConnectAccessRoleは予約されているので非推奨と記載がありますね。この名称の利用は避けましょう。今回はMediaConnectSecretsManagerAccessRoleとしました。Descriptionも適切に入力しておきます。[Create role]ボタンでIAMロールを作成しましょう。

MediaConnect用IAMロール作成画面、その3

MediaConnect用IAMロール作成画面、その4

IAMロールが作成できました。このまま、ロールを使用するサービスをMediaConnectに変更します。Trust relationshipsの項目を選択、[Edit trust policy]ボタンを押下します。

MediaConnect用IAMロール作成画面、その5

ec2.amazonaws.comの箇所をmediaconnect.amazonaws.comに置き換えます。ポリシー内容は以下になりますね。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "mediaconnect.amazonaws.com"
			},
			"Action": "sts:AssumeRole"
		}
	]
}

MediaConnect用IAMロール作成画面、その6

[Update policy]ボタンを押下してポリシーを更新します。更新後、MediaConnectリソース作成の際に必要になるので、このIAMロールのARNを控えておきます。

MediaConnect用IAMロール作成画面、その7

MediaConnectリソースの作成

SRT Encryption passphraseの作成とSecret Managerへの保存、そしてMediaLiveとMediaConnect双方がSecretにアクセスできるよう使用するIAMロールについて確認と作成を行いました。続いてMediaConnectのリソース、FlowならびにSource、そしてOutputを作成します。MediaConnectのマネジメントコンソール、Flows一覧画面から[Create flow]ボタンで進みます。

Nameを適切に入力、ProtocolはSRT listenerを選択します。Allow CIDR blockは仮で0.0.0.0/0としておき、のちほどMediaLiveのリソースを作成したら更新します。Inbound portは5073を指定しました。

DecryptionをEnableにします。設定項目が現れますので、Decryption typeはデフォルトのsrt-password、Role ARNは先ほど作成したMediaConnect用のIAMロールのARNを選択します。またSecret ARNは先ほどSRT Encryption Passphraseを保存したSecretのARNを選択します。

Source monitoring configuratioの項目、入力映像のサムネイル画像表示を有効にして、[Create flow]ボタンでFlowならびにSourceリソースを作成します。

MediaConnectリソース作成画面1

MediaConnectリソース作成画面2

リソースができたらOutputsの項目を選択、[Add output]ボタンを押下します。

MediaConnectリソース作成画面3

Add outputのダイアログが現れます。Nameを適切に入力、ProtocolではSRT listenerを選択します。Portは5079としました。またCIDR allow listでは接続元となるPCが利用しているIPアドレスを指定します。OutputのEncryptionは無効としました。[Add output]ボタン押下でOutputを作成します。

MediaConnectリソース作成画面4

以上でMediaConnectのリソース作成自体は完了です。MediaLiveや視聴確認に使用するVLC media playerに設定する情報を押さえておきましょう。

まずはSourcesの項目です。Inbound IP addressとPortを確認します。Sourceへの接続元となるのはMediaLiveのOutputですが、srt://[Inbound IP address]:[Port]srt://35.XXX.XXX.170:5073)の形式での接続になりますね。

MediaConnectリソース作成画面5

続いてOutputの項目です。Listener addressとPortを押さえておきましょう。視聴確認をするVLC media playerではsrt://[Listener address]:[Port]srt://35.XXX.XXX.170:5079)を参照するかたちです。

MediaConnectリソース作成画面6

MediaLiveリソースの作成

いよいよ本エントリの本題、SRT Outputに対応したMediaLiveのリソース作成に入ります。InputについてはRTMP (push)のSINGLE_INPUT classで作成しました。

MediaLiveリソース作成画面1

MediaLiveリソース作成画面2

Channel作成です。MediaLiveのマネジメントコンソール、Channels一覧ページから[Create channel]ボタンで進みます。Channel nameを適切に入力、IAM roleについては先ほど権限を確認したものであるかをチェックしましょう。Channel classはSINGLE_PIPELINEで進めました。

MediaLiveリソース作成画面3

作成済みのInputをAttachします。続いてOutput groupsの[Add]ボタンを押下しましょう。Add output gropusでSRTを選択します。

MediaLiveリソース作成画面3、SRT Outputを選択

SRT settingsでNameを適切に設定し、SRT outputsのSettingsのリンクを押下してOutput 1の設定画面に進みます。

MediaLiveリソース作成画面4

Destination AのURLに、先ほど確認したMediaConnectのSourceへの接続情報を入力します。今回であればsrt://35.XXX.XXX.170:5073というぐあいですね。Stream Idは空欄で進めました。

Encryption passphraseでは、先ほど作成したSRTパスワードを保存しているSecretのARNを選択します。SecretのNameを参考にしましょう。

MediaLiveリソース作成画面5

画面を下にスクロールして、Stream settingsの項目を確認します。Codec SettingsでH264を選択しました。さらにTimecodeの項目を展開します。

MediaLiveリソース作成画面6

Timecode Burn-in SettingsでTimecode burninを選択します。PrefixとしてMediaLive Timecode Burn-inを入力、Font SizeはLARGE_48、PositionはBOTTOM_CENTERを選択しました。

その他の項目はデフォルト設定のまま、[Create channel]ボタン押下でChannelを作成します。

MediaLiveリソース作成画面7

Channelが作成できたら、Destinationsの項目のEgress endpointsを確認します。Pipeline 0のSource IPを確認しましょう。これがMediaConnect Sourceへの接続元IPアドレスとなります。

MediaLiveリソース作成画面8

MediaConnectのマネジメントコンソールに戻り、Flows詳細ページから対象のSourceを選択して[Update]ボタンを押下、現れたUpdate sourceのダイアログでAllowlist CIDR blockを更新しておきましょう。

MediaConnectの設定変更画面

MediaLiveのSRT OutputはEncryption Passphraseの設定が必要

MediaLiveリソース作成の際、SRT OutputのDestinationの項目でEncryption Passphraseを指定して先に進めました。実はこの箇所、当初はMediaConnectのようにEncryptionを無効にして設定できないかな、と、ARNをを指定せずに[Create channel]をしようとしていました。

結果は以下のスクリーンショットのように、Validation Errorが発生してしまいました。このError回避のため、本ブログエントリではEncryption Passphraseを設定しています。MediaLiveのSRT Output利用の際、少なくともマネジメントコンソールからのリソース作成ではEncryptionは必須なのかなと推測しています。

Validation Errors
Encryption Passphrase Secret Arn for destination 1y56s should not be empty.

Encryption Passphraseを指定しない場合のエラー画面

MediaLiveのSRT Outputの映像を実際に視聴して確認

MediaConnectならびにMediaLiveリソースの作成ができました。それでは実際にOBS StudioからMediaLiveへ映像を打ち上げてSRT OutputでMediaConnectに出力、MediaConnectからの映像をVLC media playerで視聴してみます。MediaLiveのChannelならびにMediaConnectのFlowをStartさせ、OBS Studioから映像を打ち上げましょう。

OBS StudioならびにMediaLiveマネジメントコンソールの入力映像サムネイルMediaConnectマネジメントコンソールの入力映像サムネイル、そしてVLC media playerそれぞれを並べてみました。

MediaLiveのSRT Outputの映像を実際に視聴して確認

左上がおおもとであるOBS Studioの画面です。この映像が右上のマネジメントコンソールが麺で表示されている、MediaLiveに打ち上げられています。この右上のMediaLiveマネジメントコンソールのPreviewで表示されているサムネイル画像はMediaLiveへの入力段階の映像となります。そのため、まだタイムコードの焼き付けは行われていませんね。

このMediaLiveからSRT OutputでMediaConnectに映像が出力されています。この出力される段階でタイムコードが焼き付けられます。右下、MediaConnectのマネジメントコンソール、Previewで表示されているサムネイル画像を確認してみましょう。映像の真ん中下にMediaLive Timecode Burn-inというPrefixとともに、タイムコードが焼き付けられていますね。この映像がMediaConnect Outputから出力され、最終的に左下のVLC media playerで視聴できている、という状況となります。MediaLiveからのSRT Outputの映像が確認できましたね!

まとめ

AWS Elemental MediaLiveで新たにサポートされたSRT Outputについて、出力先をMediaConnectとして設定して動作を確認してみました。MediaLiveのSRT OutputではEncryption設定が必要です。SRTパスワードはAWS Secrets ManagerにSecretとして保存します。MediaLive側からはSecretにアクセスできる権限を有する必要があります、利用するIAMロールにsecretsmanager:GetSecretValueの許可があるかを確認しましょう。またMediaLiveのSRT OutputはInput同様にcallerとして動作します。MediaLive Channel作成の際に、listenerとなる出力先のIPアドレスやポート番号が必要になる点に注意しましょう。

ところで、MediaConnectではcallerとlistenerの両方をサポートしています。MediaLiveのSRT Outputでもcallerに加えてlistenerのサポートが期待できるのでしょうか。個人的にはlistenerにも対応してほしいなと思いつつも、MediaLiveのほかのOutput typeについて振り返ってみます。基本的には出力先を指定するのがMediaLive Outputの形式なのかと考えます。そのため、SRT Outputがcallerのみのサポートなのも妥当なのかな、などという感想を持っています。

とはいえ、Inputに加えてOutputでもSRTをサポートしたこと、プロトコル選択の幅が広がり、大変うれしいアップデートですよね。今後もMediaLiveのアップデートに注目していきたいと思います!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.