[新機能] AWS Elemental MediaPackageがAmazon CloudWatch Eventsをサポートしました!

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

はじめに

清水です。最近続々と機能アップデートの発表が続いているMedia五兄弟ですが、先日もAWS Elemental MediaPackageがAmazon CloudWatch Eventsをサポートするアップデートがありました。

この機能を試してみたので本エントリにてまとめてみます。具体的にはAWS Elemental MediaPackageの入力状態のイベントをAmazon CloudWatch Eventsにて検知し、Amazon SNSトピックにを利用してこのイベントをメール通知させてみました。

手順としては先にAmazon SNSトピックの作成、Amazon CloudWatch Eventsの設定をしておきます。その後、AWS Elemental MediaLiveからAWS Elemental MediaPackageにストリームを流しますが、この際、AWS Elemental MediaPackageの最大ストリーム取り込み数(20)を超えたストリームを流し、この状態をAWS Elemental MediaPackageの入力状態イベントとして検出させる、という流れとなります。

Amazon SNSトピックの作成

まずはCloudWatch Eventsを受け取り、通知するためのSNSトピックを作成します。CloudWatch Eventsはイベントの検知を受けてLambdaやEC2 Run Command、Kinesis Data Streamなど様々なリソースのトリガとなることができますが、今回はシンプルにSNSでの通知を確認してみたいと思います。

Amazon SNSのマネージメントコンソールからトピックの項目で[新しいトピックの作成]ボタンを押して進み、新しいトピックを作成します。

トピック作成後、サブスクリプションを作成します。メールアドレスを登録し、メールで通知を受け取れるようにしました。サブスクリプション作成と同時にエンドポイントのメールアドレス宛に確認メッセージが送信されているので、サブスクリプションしておきます。

Amazon CloudWatch Eventsの設定

続いてCloudWatch Eventsの設定を行います。CloudWatchのマネージメントコンソールのイベントの項目から[ルールの作成]ボタンで進みます。イベントソースではイベントパターンを選択し、以下の項目を編集画面より入力しました。

{
  "source": [
    "aws.mediapackage"
  ]
}

また、ターゲットではSNSトピックを選択、先ほど作成したSNSトピック(MediaPackageCloudWatchEvents)を選択します。

続いて設定の詳細画面にて、ルールの名称などを設定し、[ルールの作成]ボタンでルールを作成します。

AWS Elemental MediaPackageの設定

続いて本題のElemental MediaPackageの設定です。CloudWatch Eventsに対応したからといって特別な設定をすることなく、例えばMediaLiveと連携させてライブ配信を行う手順同様に作成します。

Channelに続いて、Endpointも作成しておきます。

AWS Elemental MediaLiveの設定

MediaPackageの設定に続いて、MediaPackageにストリームを流すためのMediaLiveの設定を行います。本エントリではMediaLiveを使用していますが、他にもMediaPackageに対応したストリームを流すリソースがあれば、それを利用できるかと思います。

MediaLiveの設定についても、MediaLiveとMediaPackageを連携させてライブ配信を行う手順と同様です。ただ今回、MediaPackageの入力状態イベントとして最大ストリーム数20を超えた状態を発生させるため、Output groupsのHLS出力の数を23としてみます。

Add output groupでHLSを選択、HLS Outputsで23個のストリームを作成しました。

最大ストリーム取り込み数を超えたストリームを流してCloudWatch Eventsを検知させる

MediaLiveのChannelが作成できたら、ChannelをStartさせて実際にライブ配信を行ってみます。配信エンコーダから映像を流すとすぐにに下記のようなSNSの通知がきました。(きちんと計測はしていませんが、だいたい1分程度でした。)

通知に記載のJSONを見やすいように整形すると下記となります。

 $ pbpaste | jq .
{
  "version": "0",
  "id": "77e73950-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "detail-type": "MediaPackage Input Notification",
  "source": "aws.mediapackage",
  "account": "123456789012",
  "time": "2018-02-28T07:33:51Z",
  "region": "ap-northeast-1",
  "resources": [
    "arn:aws:mediapackage:ap-northeast-1:123456789012:channels/4dd0821596e44840XXXXXXXXXXXXXXXX"
  ],
  "detail": {
    "message": "Parent Manifest [v1/4dd0821596e44840XXXXXXXXXXXXXXXX/channel.m3u8] has [23] streams, more than [20] allowed: (channel_1.m3u8,channel_10.m3u8,channel_11.m3u8,channel_12.m3u8,channel_13.m3u8,channel_14.m3u8,channel_15.m3u8,channel_16.m3u8,channel_17.m3u8,channel_18.m3u8,channel_19.m3u8,channel_2.m3u8,channel_20.m3u8,channel_21.m3u8,channel_22.m3u8,channel_23.m3u8,channel_3.m3u8,channel_4.m3u8,channel_5.m3u8,channel_6.m3u8,channel_7.m3u8,channel_8.m3u8,channel_9.m3u8)",
    "event": "MaxIngestStreamsError"
  }
}

ストリーム数が最大数の20を超えた23個で多すぎるよ!というエラー内容も確認できました。

まとめ

AWS Elemental MediaPackageに最大ストリーム取り込み数を超えたストリームを流し入力状態のイベントを発生させ、このイベントを Amazon CloudWatch Eventsで検知し、Amazon SNSへの通知を行ってみました。今回は発生/検知させたイベントとしてはストリーム設定時に上限に注意すれば気がつけるものではあるかと思いますが、MediaLiveではなく別のリソースをストリーム入力元に使う場合など、活用できるのではないでしょうか。またCloudWatch Eventsの検知後のターゲットとしても、SNSでの通知のほかLambdaやEC2 Run Commandなど様々なAWSリソースと連携できます。発生するイベントの種類もDRMなど暗号化時のエラー処理もあり、様々な活用が考えられると思います。引き継ぎMedia五兄弟の新機能アップデートに注目していきたいと思います。