AWS Elemental MediaStoreの一時データポリシーを使ってHLS配信時の冗長構成を確認してみた

2020.04.30

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

はじめに

清水です。メディア向けに最適化されたストレージサービスであるAWS Elemental MediaStoreの一時データポリシー(Transient Dataポリシー)を使ってHLS配信時の冗長構成を確認してみました。一時データポリシー機能は2019年9月にAWS Elemental MediaStoreに追加された機能アップデートになります。

一時データポリシーを設定しておくことで、該当パスのファイルは更新がなければ、指定期間後に期限切れになり削除されます。これを利用することで、HLS配信時の冗長構成をとることが可能です。具体的にはAWS Elemental MediaLiveの冗長化されたHLSトップレベルマニフェストファイルの出力と連携します。

AWS Elemental MediaLiveで冗長化マニフェスト(Redudant Manifest)を有効にすると、トップレベルマニフェスト中にはMediaLiveの2つのパイプラインのマニフェストファイルが含まれることになります。マニフェストファイルはライブ配信中、障害など問題がなければ常に更新され続けます。更新されなくなった場合はどこかで何らかの障害が発生しているので、別パイプラインに切り替える必要があります。AWS Elemental MediaStoreの一時データポリシーを利用すると、更新されなくなったマニフェストファイルは一定時間に削除されます。2つのパイプラインのマニフェストファイルを含んだトップレベルマニフェストを参照している動画プレイヤーは、この何らかの障害が起き、結果として更新されず削除されたマニフェストファイルをトリガに、別パイプラインに切り替える、という動作で冗長構成を実現することができます。

AWS Elemental MediaStoreの一時データポリシーを設定してみる

まずはAWS Elemental MediaStoreの一時データポリシーを設定してみます。Containerを任意の名前で作成後、マネジメントコンソールのObject lifecycle policyで設定します。 *1ポリシー内容はユーザーガイドを参考に以下としました。*p.m3u8というワイルドカード含むパターンにマッチするファイルは6秒以上更新がなければ期限切れになる(削除される)という設定です。

{        
    "rules": [
        {
            "definition": {
                "path": [ 
                    {"wildcard": "*p.m3u8"}
                ],
                "seconds_since_create": [
                    {"numeric": [">" , 6]}
                ]
            },
            "action": "EXPIRE"
        }
    ]
}

またContainer policyとContainer CORS policyも適切に設定しておきます。

AWS Elemental MediaLiveの冗長化マニフェストと連携させてみる

続いてMediaLive側の設定です。出力先をMediaStoreとします。具体的には以下のようなDestinations設定です。同じMediaStoreのContainer内にパス(接頭辞)を変えて出力します。

HLSの出力設定では、以下のようにName modifierを_[解像度数値]pとしておきました。これでトップレベルマニフェストファイルはdestA.m3u8、destB.m3u8ですが、それぞれ解像度ごとのマニフェストファイルはdestA_720p.m3u8などとなります。

その他、MediaLiveではHLS settignsのInput Loss ActionをPAUSE_OUTPUTにしておきました(参考)。また冗長構成として重要な点として、Manifest and SegmentsのRedundant Manifestの項目をENABLEDにしておきます。

今回は配信エンコーダにiPhoneアプリのZixi ON AIRを使いRTMPでMediaLiveのInputに映像を配信しました。MediaLiveのChannelをStartさせたあと、2台のiPhoneそれぞれで映像の配信を開始します。どちらのiPhoneからの映像化わかるように少し映像のアングルが異なります。MediaStoreに書き出されたHLS形式のファイルをVideoJS HTTP Streamingで視聴します。この際HLSのURLはhttps://xxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com/destA.m3u8と、Pipeline 0のものを指定しておきます。その途中で、Pipeline 0、つまりdestAへの映像送信を停止してみます。

実際に確認したのが以下の映像です。11:40:00ちょうどにPipeline 0への映像送信を停止してみました。HLSのURLは同じですが、映像は止まることなく、別アングルのPipeline 1の映像に切り替わります。20秒ほど間が消えてしまっている点は、HLSのフラグメント長とMediaStoreの一時データの有効期限を調整することでよりスムーズにならないかと考えます。

aws-elemental-mediastore-stale-manifest-deletion from Toshiya Shimizu on Vimeo.

この映像が切り替わる少し前に、destA_720p.m3u8の404 Not Foundが発生していることが確認できます。この404 Not Found発生のトリガが、本エントリで扱ったMediaStoreの一時データポリシー機能、ということになります。

video.jsからもエラーとなっていることが確認できます。

まとめ

メディア向けに最適化されたストレージサービスであるAWS Elemental MediaStoreの一時データポリシー(Transient Dataポリシー)を使ってHLS配信時の冗長構成を確認してみました。実際に大規模な動画配信を行う場合は、AWS Elemental MediaStoreをオリジンとしてAmazon CloudFrontなどCDNを挟むと思います。この場合、CDN側でのm3u8ファイルキャッシュ時間も加味して、MediaStoreの一時データポリシーの有効期限を設定、調整する必要があるかと考えます。またこのAWS Elemental MediaStoreの一時データポリシー機能、数秒間隔でファイルの更新がなければ有効期限切れにする、という、MediaStoreの即時整合性をうまく利用した機能だなと思いました。

参考

脚注

  1. そういえば、AWS Elemental MediaStoreのライフサイクルポリシー機能が登場した当時はマネジメントコンソールから操作できず、AWS CLIなどAPI経由だったことを当時のエントリから思い出しました。いつの間にかマネジメントコンソールからライフサイクルポリシーが設定できるようになっていましたね!