1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】 CloudWatch上のMediaLiveのメトリクスをLambdaから取得する際に気をつけること

Last updated at Posted at 2024-02-28

概要

この記事では、 CloudWatch 上の Medialive のメトリクスを取得する際に気をつけることについて言及しています。リファレンスが少ない、かつ引っ掛け問題のような感じで自分は丸一日費やしたのでその記録を残しておきます。

内容的には

  • CloudWatch のメトリクスを Lambda で取得する際に気をつけること」
  • MediaLive のメトリクスを取得する際に気をつけること」

が混ざっていますが、どちらも参考になれば、とても嬉しく思います。

前提

MediaLive で事前に配信を行い、 CloudWatch上で指定の ChannelId においてメトリクスが確認できることを前提としておきます。

実装

実装は Lambda で行います。
Lambda でなくても問題ないですが、 Lambda で行う場合の注意点をいくつか書いておきます。

注意点①
Lambda に設定している Role に対して、"cloudwatch:GetMetricStatistics"を追加すること

注意点②
index.mjs -> index.js に変更しておく。

実際のコードは下記になります。
あくまで例なので適宜必要となるメトリクス名や日時の情報を入れるようにしてください。

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 から見たときに下図のようになっていることを考慮したら確かに指定するのは当たり前だなと思いました。次回からは気をつけたいです。

image.png

参考文献

おわりに

参考とするリファレンスが、GetMetricStatisticsCommand についての公式リファレンスぐらいしかなく若干困りましたが、なんとか切り抜けることができました。
最後にですが、Qiitaの記事にもできないようなレベルの記事を自分のブログにあげていたりするので、見ていっていただけると嬉しいです。

MediaLive難しい....

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?