概要
この記事では、 CloudWatch
上の Medialive
のメトリクスを取得する際に気をつけることについて言及しています。リファレンスが少ない、かつ引っ掛け問題のような感じで自分は丸一日費やしたのでその記録を残しておきます。
内容的には
- 「
CloudWatch
のメトリクスをLambda
で取得する際に気をつけること」 - 「
MediaLive
のメトリクスを取得する際に気をつけること」
が混ざっていますが、どちらも参考になれば、とても嬉しく思います。
前提
MediaLive
で事前に配信を行い、 CloudWatch
上で指定の ChannelId
においてメトリクスが確認できることを前提としておきます。
実装
実装は Lambda
で行います。
Lambda
でなくても問題ないですが、 Lambda
で行う場合の注意点をいくつか書いておきます。
注意点①
Lambda
に設定している Role
に対して、"cloudwatch:GetMetricStatistics"
を追加すること
注意点②
index.mjs
-> index.js
に変更しておく。
実際のコードは下記になります。
あくまで例なので適宜必要となるメトリクス名や日時の情報を入れるようにしてください。
const { CloudWatch } = require('@aws-sdk/client-cloudwatch');
const cloudwatch = new CloudWatch({ region: 'ap-northeast-1' });
exports.handler = async function (event, context) {
// リクエストに含む情報を定義
const input = {
StartTime: new Date("開始日時が入ります"),
EndTime: new Date("終了日時が入ります"),
MetricName: 'メトリクス名(例: NetworkIn,NetworkOut etc...が入ります)',
Namespace: 'AWS/MediaLive',
Period: 60*5*3, // 15分毎
Statistics: [ // 平均値や最大値などを選びます
"SampleCount" || "Average" || "Sum" || "Minimum" || "Maximum",
],
Dimensions: [
{
Name: 'ChannelId',
Value: "channelのIDが入ります"
},
{
Name: 'Pipeline',
Value: '0'
}
]
};
const res = await cloudwatch.getMetricStatistics(input);
console.log('res:', res);
};
気をつけるべきポイント
ここでは気をつけるべきポイントを説明していきます。
日付の形式について
日付の形式は、ISO 8601 UTC 形式
でなければいけません。つまりリクエストに含む日付は 「JST」 ではなく 「UTC」 に合わせてあげる必要があるということです。
例えば日本時間の 2/27 18:00 ~19:00で配信を行なっていて、その間のメトリクスが欲しい時は9時間日本の方が時刻が進んでいるので、
StartTime => 2024-02-28T09:00:00Z
EndTime => 2024-02-28T10:00:00Z
という値になります。この点を考慮してリクエストに含めるようにしましょう。
データポイントの取得上限について
Period
で設定する数値にはルールがあります。 (翻訳間違ってたらすみません)
Period
は返されるデータポイントの粒度(秒単位)を指定します。通常の解像度のメトリクスの場合、期間は 1 分(60 秒)まで短くすることができ、60 の倍数である必要があります。1 分未満の間隔で収集される高解像度のメトリクスの場合、期間は 1、5、10、30、60、または 60 の倍数にすることができます。高解像度メトリクスは、PutMetricData 呼び出しによって保存されるメトリクスです。
StartTime パラメータで、 3 時間以上前のタイムスタンプを指定する場合は、次のように期間を指定する必要があります。指定しないと、その時間範囲のデータポイントは返されません。
- 3 時間前から 15 日前までの開始時刻 - 60 秒(1 分)の倍数を使用します。
- 開始時刻が 15 ~ 63 日前 - 300 秒(5 分)の倍数を使用します。
- 63 日前より前の開始時刻 - 3600 秒(1 時間)の倍数を使用します。
データポイントの粒度が細かすぎるとエラーが返ってくるのでわかると思いますが、ここら辺の処理を自動で運用する場合は必ず考慮しなくてはならない内容なので覚えておきたいです。
PipeLineの指定が必要となること
MediaLive
の配信では、マルチパイプラインでの配信とシングルパイプラインの配信があり、メトリクスを絞るのに PipeLine
を指定してあげる必要があります。ここはシングルパイプライン、マルチパイプライン関わらず指定しないと、欲しいメトリクスを取ってきてくれないので気をつけましょう。筆者はここで丸一日費やしました。例えば、シングルパイプラインなら「0」をDimensions
の中で指定をしてあげるようにしましょう。
Dimensions: [
{
Name: 'ChannelId',
Value: channelId
},
{
Name: 'Pipeline',
Value: '0'
}
]
余談ですが、メトリクスを CloudWatch
から見たときに下図のようになっていることを考慮したら確かに指定するのは当たり前だなと思いました。次回からは気をつけたいです。
参考文献
おわりに
参考とするリファレンスが、GetMetricStatisticsCommand
についての公式リファレンスぐらいしかなく若干困りましたが、なんとか切り抜けることができました。
最後にですが、Qiitaの記事にもできないようなレベルの記事を自分のブログにあげていたりするので、見ていっていただけると嬉しいです。
MediaLive難しい....