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

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

内容的には 
- 「`CloudWatch` のメトリクスを　`Lambda` で取得する際に気をつけること」
- 「`MediaLive` のメトリクスを取得する際に気をつけること」

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

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

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

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

:::note warn
**注意点②**
`index.mjs` -> `index.js` に変更しておく。
:::

実際のコードは下記になります。
あくまで例なので適宜必要となるメトリクス名や日時の情報を入れるようにしてください。
```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524017/6f9eb725-e1fa-d48f-f3df-761871c09e15.png)

# 参考文献

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/cloudwatch/command/GetMetricStatisticsCommand/

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

MediaLive難しい....

https://kt-tech.blog