背景
MediaLive ですが、いろいろなエラーを通知してくれます。
やれ「RTMP 接続が切れたよ」とか「オーディオ入力 or ビデオ入力が無いよ」とかですね。 通常、ライブ配信が始まる前は当然、MediaLive への入力は無いはずなので、通知は構わないのですが、 ライブ配信中に出ると、それはもうトラブルシューティングの情報の一つとして重要なものになります。 ( というか当初、エラーは出てるっぽいし、挙動はおかしいんだけど、どんなエラーが出てるか分からないケースがあって窮地な時がありました )
今は管理画面の[ channels ]->[ 目的のチャンネル ]->[ Alerts ]から確認できます。が、ログとして残しておくのは良い事だと思います。 このエラー出力のフォーマットは決まっている訳ではなく、たまに変わります。ので 『あー、エラー出力が変わったからアラートが上がらなくなったのね』、という事がログを残しておくと分かります。
手順
WebUI
SNS トピック作成
-
SNS のページ( https://ap-northeast-1.console.aws.amazon.com/sns/ )を開く
-
[ トピック ]->[ 新しいトピックの作成 ]->トピック名の入力、私は[ MediaLiveEvent ]、表示名[ MediaLiveEvent ]と入れてみた
-
作成したトピックの ARN をコピペ arn:aws:sns:ap-northeast-1:1111111111111:MediaLiveEvent
-
( 同じ SNS 内の左側メニュー )[ サブスクリプション ]->[ サブスクリプションの作成 ]
-
[ トピック ARN ]に先程作成した MediaLive のトピックの ARN を入力
-
プロトコル メール(ほかにも lambda とかから Slack に送信できたりする)
-
エンドポイント : 自分のメールアドレス
はじめてのアラートメール設定の場合、AWS から確認のメールが飛ぶ
- [ AWS Notification - Subscription Confirmation ]という件名のメールがあったらメール本文内のリンクをクリック
CloudWatch
- cloudwatch のページに移動*
- [ イベント ]->[ ルールの作成 ]
- [ イベントパターン ]になってること
- [ カスタムイベントパターン ]に変更 カスタムイベントパターンの内容としては下記を入力
{
"source": [
"aws.medialive"
]
}- 右側の[ ターゲットの追加 ]->[ SNS トピック ]に変更->[ トピック ]はプルダウンメニューから先程、作成した SNS のトピックを選択
- [ 設定の詳細 ]
- ルールの定義
- 名前: 任意
- 説明: 任意
- [ ルールの作成 ]
- メールボックスを確認
CLI
参考: SNS をコマンドラインから設定する : 電子の密林を開拓する
- CLI での SNS トピックの作成は
$ sns create-topic --name mediaLiveEventSNSでのサブスクリプションの作成
$ aws sns subscribe --topic-arn "arn:aws:sns:ap-northeast-1:11111111111111111:mediaLiveEvent" --protocol email --notification-endpoint "hoge@example.com"—notification-endpoint に登録したメールアドレスに飛んだメールのリンクをクリックする
CloudWatch eventsの設定
ルール作成
$ aws events put-rule --name "mediaLiveEvent" --event-pattern (jo source=(jo -a aws.medialive))CloudWatch ルールのターゲットを指定
aws events put-targets --rule my-scheduled-rule --targets file://targets.json
aws events put-targets --rule mediaLiveEvent --targets (jo -a (jo -- -s Id=1 -s Arn=arn:aws:sns:ap-northeast-1:139332511982:mediaLiveEvent))ポーリングかイベントドリブンか
よく監視だと「5分ごとのポーリング」などの形が多いじゃないですか、負荷監視とか。私もそういう認識だったんですが、 MediaLiveの監視って、ポーリングみたいな考え方だと、どうにもならなくね?(CloudWatchのEventでcron式書く? 監視方法検討、lambdaで実装?と考えてみて) CloudWatchの仕組みにのった方がシンプルになりそう、という訳で、やってみました。最初はアラート通知とかだったんですが、 5分単位のポーリングよりイベント・ドリブンでアラートが通知されるので、こちらの方が好きになりました。
更にいうとRTMPの再接続があった場合、念の為、CloudFrontのキャッシュを削除するようにしています。 (これは前のライブのキャッシュがCloudFrontに残っており、万が一ですが、 ライブのチャンクデータで「昔のチャンクを参照してしまう」みたいなトラブルを避けたいための運用です。 MediaLive + MediaStore構成ならMediaStoreが非常に高速なので不要かもしれません) この自動化ができました。CloudFrontからチャンクの削除を自動ででき、漏れなくできる。
Cloudwatch カスタムイベントパターン バリエーション
その1 RTMP接続が無くなった場合
ライブ中にRTMP接続がなくなるとやばいよ、何かしないとマズいよね、lambdaで関数つくって呼び出そう
{
"source": [
"aws.medialive"
],
"detail": {
"alarm_state": [
"SET"
],
"message": [
"Waiting for RTMP input"
]
}
}その2 RTMP接続が来たよ
何かRTMP接続された時にする処理をlambdaで作って呼び出せるよ
{
"source": [
"aws.medialive"
],
"detail": {
"alarm_state": [
"CLEARED"
],
"message": [
"Waiting for RTMP input"
]
}
}