AWS Elemental LinkとAWSソリューション実装でライブ動画配信をしてみた

AWSによるテクニカルリファレンス実装である「Live Streaming on AWS with MediaStore」のCloudFromationテンプレートを利用して、AWS Elemental Linkによるライブ動画配信をしてみました。
2020.07.07

はじめに

清水です。AWS Elemental MediaLive用のセットアップ済みライブエンコーダデバイスとして動作するAWS Elemental Linkを使って、ライブ配信構成を試しています。

そんな中、AWSのテクニカルリファレンス実装であるAWS Solutions Library/AWSソリューション実装の「Live Streaming on AWS」にてAWS Elemental Linkに対応するアップデートがありました。(2020/07/02にポストされたアップデートになります。)

アップデートしたのは以下のページで紹介されているAWSソリューション実装です。CloudFromationのテンプレートが用意されており、デプロイするだけで検証済みのテクニカルリファレンス実装が構築できます。

なお、AWS Elemental Linkに対応しているのはライブオリジンにAWS Elemental MediaStoreを使う「Live Streaming on AWS with MediaStore」であり、AWS Elemental MediaPackageを使用している「Live Streaming on AWS」は現時点ではまだ対応していない点に注意しましょう。

本エントリではこのAWSソリューション実装の「Live Streaming on AWS with MediaStore」でLinkデバイスを使って実際にライブ動画配信をしてみました。

それでは実際にAWSソリューション実装を使ってインフラを構築、Linkデバイスで映像を打ち上げてライブ動画配信をしてみます。

必要に応じて、デプロイガイドやGitHubで公開されているソースコードも参照してください。(いずれも冒頭で紹介したAWSソリューション実装のページからリンクされています。)

事前準備

まず事前準備としてMediaStore用のIAMロールを作成しておきます。これはソリューションデプロイ後のAmazon CloudWatchダッシュボードを利用するために必要で、準備しなくてもソリューションのデプロイ自体は成功するとのことです。

詳細な手順については以下ブログエントリやAWSドキュメントを参考にしてください。

以下、作成のポイントのみまとめていきます。

IAMポリシー「MediaStoreAccessLogsPolicy」の作成

以下の内容でIAMポリシーを作成します。IAMポリシーの名称はMediaStoreAccessLogsPolicyとします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups",
                "logs:CreateLogGroup"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/mediastore/*"
        }
    ]
}

IAMロール「MediaStoreAccessLogs」の作成

続いてIAMロールMediaStoreAccessLogsを作成します。信頼されたエンティティとしてAWSアカウントを選択しておき自分のAWSアカウントIDを入力、アタッチするポリシーは先ほど作成したMediaStoreAccessLogsPolicyを選択します。

IAMロールMediaStoreAccessLogsを作成後、信頼関係を下記のように書き換えます。(ハイライト部分、変更前は"AWS": "arn:aws:iam::123456789012:root"となっているはずです。)

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

AWSソリューション実装「Live Streaming on AWS with MediaStore」のデプロイ

IAMポリシーとIAMロールが作成できたら、実際にAWSソリューション実装「Live Streaming on AWS with MediaStore」をデプロイします。

該当ページから[Launch in the AWS Console]ボタンで進みます。

AWSマネジメントコンソールのCloudFromation、Stack作成画面に遷移します。

ここで、今回Linkデバイスを準備しているリージョンはオレゴンリージョン(us-west-2)です。現在操作対象のリージョンをマネジメントコンソール右上部分で確認すると、N.Virginiaつまりバージニアリージョン(us-east-1)となっているので、オレンゴンリージョン(us-west-2/Oregon)に変更しておきます。

希望のリージョンに変更できたら、Stackを作成するテンプレートの内容を確認して[Next]で進みます。

続く画面でパラメータを指定していきます。今回はデフォルト値から以下の変更をしました。

  • 「LIVE STREAM SOURCE」の「Source Input Type」でデフォルトのURL_PULLからINPUT_DEVICEを選択
  • 「INPUT_DEVICE CONFIGURATION」の「Elemental Link Input Device ID」で使用するLinkデバイスのIDを入力
  • 「ENCODING OPTIONS」の「Encoding Profile」でデフォルトのHD-720pからHD-1080pを選択
  • 「ENCODING OPTIONS」の「Start MediaLive Channel」をデフォルトのtrueからfalseに変更

[Next]で進みます。続くスタックオプション設定画面はデフォルトのまま、[Next]で進み、最後の画面で内容を確認、IAMリソース作成についての承認にチェックを入れて[Create stack]でスタックを作成します。

スタック詳細画面に遷移しますので、作成状況を見守ります。

デプロイ時間は約5分とのことでした。およそ5分後、確認してみると以下のようにStackの作成が完了していました。

ライブ配信の開始

AWSソリューション実装「Live Streaming on AWS with MediaStore」のデプロイが完了したので、実際にLinkデバイスから映像を打ち上げ、ライブ動画配信ができることを確認してみたいと思います。

Linkデバイスの準備

まずはLinkデバイスの準備です。CloudFromation Stack作成時に指定したデバイスIDを持つLinkデバイスを電源ON、ネットワークに接続し映像を入力します。映像について、今回はMacBook Proのデスクトップ画面をHDMIで出力(ミラーリング)、音声もHDMI出力として、Big Bug Bunny4K版をVLC media playerで再生しました。

マネジメントコンソールのAWS Elemental MediaLiveのページ、左上のハンバーガーボタン「≡」からDevicesの項目に遷移して、該当のLinkデバイスが以下の状態であることを確認しておきます。

  • Connection stateがConnectedであること
  • Device stateがIdleであること

MediaLiveのChannelのStart

続いて、MediaLiveのChannelをStartさせます。マネジメントコンソールのMediaLinkのページ、左上のハンバーガーボタン「≡」からChannelsの項目に遷移、該当Channel(今回であればLiveStreamingwithMediaStore)を選択して[Start]ボタンを押下します。

StateがRunningになれば配信が開始されている状態です。

Linkデバイスについても自動で映像の打ち上げ(AWSへのストリーミング)が開始されています。

視聴確認

ライブ動画配信視聴用のURLについては、CloudFormationのStack詳細画面、Outputsの項目から確認できます。LiveStreamUrlですね。

こちらのURLをSafariなどHLSネイティブ対応のWebブラウザやVideo.jsなどHLS再生に対応した動画プレイヤーで再生します。今回はVideoJS HTTP Streamingのページで再生してみました。Video URLを入力、MimeTypeはデフォルトのapplication/x-mpegURLのまま[Load]して再生ボタンをクリックすると再生が始まります。

CloudWatchダッシュボードの確認

ライブ動画配信中のCloudWatchダッシュボードの状況も確認しておきます。以下のように特に設定しなくてもいくつかのメトリクスがモニタリング可能です。

ライブ配信の終了と後片付け

ライブ配信が終了したら、まずはMediaLiveのChannelをStopしましょう。(MediaLiveはRunningの状態で大きなAWS利用費が発生します。)

これでライブ動画配信は終了します。またLinkの映像の打ち上げもMediaLiveのChannelと連携して停止されます。

MediaLiveのChannel、InputやCloudWatchダッシュボードなど、ライブ動画配信を実施していなくても(例えばMediaLiveであればChannelがRunningの状態でなくても)料金が発生するリソースもあります。今回のCloudFromation Stackで作成されたリソースをよく確認し、Stackならびにリソースの削除をしておきましょう。

まとめ

AWS Elemental MediaLive用のセットアップ済みライブエンコーダデバイスとして動作するAWS Elemental Linkと、AWSソリューション実装「Live Streaming on AWS with MediaStore」を使ってライブ動画配信をしてみました。Linkデバイスを使ったライブ動画配信環境が非常に容易に構築が可能です。(Jeff BarrがAWS News BlogでElemental Linkについてポストした際にCloudFormationを利用した自動化されたソリューションを準備していると言っていましたが、それがこのAWSソリューション実装ですね。)今回CloudFromation Stack作成時のパラメータStart MediaLive Channelについてはあえてfalseにしましたが(ChannelのStart/Stopをコントロールしたかったので)、これをtrueにすればLinkデバイスで映像を送るだけのライブ配信環境が構築できますね。また本エントリでも確認したCloudWatchダッシュボード含めて、AWSによるリファレンス実装ということもあり細かな設定もなされています。(例えばMediaStoreのオリジン保護もされていました。)このリファレンス実装を参考に、例えばS3にアーカイブ出力するなどカスタマイズしながら目的にあわせたライブ動画配信環境を構築していくのもよいかと考えます。