【AWS】Amazon CloudWatchの詳細モニタリングのメトリクスをCLIで取る(Elastic Beanstalk編)

## はじめに
CloudWatchの詳細モニタリングでどんな情報が取れるんだっけ、というのを改めて確認したくなったので、復習ついでにElasticBeanstalkの拡張モニタリング(Elastic Beanstalkは「詳細モニタリング」を「拡張モニタリング」と呼ぶ)のメトリクスをCLIで取ってみる。

(ドキュメントによっては「モニターリング」という表記になっていたりするけど、本記事では「モニタリング」に統一)


CloudWatch公式ドキュメント

https://aws.amazon.com/jp/cloudwatch/



## 1. 基本モニタリングと詳細モニタリング

`基本モニタリング`......AWSサービスを利用すると自動で有効になる。5分間隔。無料。
`詳細モニタリング`......一部のサービスでのみ利用可能。課金あり。基本モニタリングより短い間隔でメトリクスを取得できたり、基本モニタリングには無い情報を取得することができる。

詳細モニタリングは、対象のAWSサービスによって呼び名やオプション内容が変わる。
例えばEC2の場合は「詳細モニタリング」として1分間隔のメトリクスが利用できるし、Elastic Beanstalkであれば「拡張ヘルスレポート」としてOSのメトリクスやサーバーログを取得することができる。

参考

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch-metrics-basic-detailed.html

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/health-enhanced.html

## 2. CLIでElastic Beanstalkの拡張ヘルスレポート内容を見る

Elastic Beanstalkの拡張ヘルスレポートのメトリクス、EnvironmentHealth(このメトリクスは無料)をCLIで確認してみる。EnvironmentHealthは環境の状態を以下のステータスで表すもので、ベーシックヘルスレポート(基本モニタリング)でも環境の状態を4種のステータスで確認できるけど、拡張ヘルスレポートだと7種類になる。

**EnvironmentHealthのステータス**
0 – OK
1 – Info
5 – Unknown
10 – No data
15 – Warning
20 – Degraded
25 – Severe

ステータス引用元

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/health-enhanced-cloudwatch.html

### Elastic Bealstalkの環境作成
拡張モニタリングをオンにしてElastic Beanstalkの環境を作る。
環境を作成するときにモニタリングの設定をベーシックか拡張かで選ぶことができる（デフォルトは拡張）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/6ae41c28-eb0c-4cea-a731-cd566e5c8719.png)

Managed platform updatesを有効にする場合、拡張ヘルスレポートをオンにしないとエラーになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/51c47e0d-c8f1-1911-7465-e76d66268fbe.png)


拡張ヘルスレポートをオンにすればEnvironmentHealthは自動で取得される(ここで指定する必要は無い)。CPUやインスタンスのメトリクス、HTTPステータスコードなどを取得したい場合は手動で指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/2fa22882-b062-0def-f228-8b4b8aa1c923.png)


### CLIでEnvironmentHealthのメトリクス確認
コマンドの注意点として、`dimensions`をきちんと選択しないとデータが取得できないので、`dimensions`にEnvironmentNameを指定する。(指定しないでコマンド打ったらDatapointsが空っぽで返ってきてしばらくはまっていた)

下の画像であれば`dimensions`の`Name`にEnvironmentName, `Value`にTest2-envを指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458266/7045c689-949b-62c1-a3a1-8aa146f50d1e.png)

(例)ElasticBealstalkのEnvironmentHealthを5分間、1分間隔で取得するコマンド
```
$ aws cloudwatch get-metric-statistics --namespace AWS/ElasticBeanstalk --metric-name EnvironmentHealth --start-time 2023-11-26T07:45:00Z --end-time 2023-11-26T07:50:00Z --statistics Average --dimensions Name=EnvironmentName,Value=Test2-env --period 60
```
結果
```
{
    "Label": "EnvironmentHealth",
    "Datapoints": [
        {
            "Timestamp": "2023-11-26T07:47:00+00:00",
            "Average": 10.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T07:48:00+00:00",
            "Average": 10.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T07:49:00+00:00",
            "Average": 10.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T07:45:00+00:00",
            "Average": 10.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T07:46:00+00:00",
            "Average": 10.0,
            "Unit": "None"
        }
    ]
}
```
…ずっとステータスが10(No data)になっている、ので権限設定見直してもう一度取得

10:00~10:03はモニタリング設定を拡張ではなくベーシックに切り替えていたので取得していない。10:04, 10:05のあたりでモニタリング設定を拡張に戻したのでインスタンスの削除・追加が起こり、おそらくそのためにステータスが1(Info)になっている。

```
$ aws cloudwatch get-metric-statistics --namespace AWS/ElasticBeanstalk --metric-name EnvironmentHealth --start-time 2023-11-26T10:00:00Z --end-time 2023-11-26T10:10:00Z --statistics Average --dimensions Name=EnvironmentName,Value=Test3-env --period 60
{
    "Label": "EnvironmentHealth",
    "Datapoints": [
        {
            "Timestamp": "2023-11-26T10:09:00+00:00",
            "Average": 0.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T10:04:00+00:00",
            "Average": 1.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T10:05:00+00:00",
            "Average": 1.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T10:06:00+00:00",
            "Average": 0.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T10:08:00+00:00",
            "Average": 0.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2023-11-26T10:07:00+00:00",
            "Average": 0.0,
            "Unit": "None"
        }
    ]
}
```


## おわりに
Elastic Beanstalkは普段扱っていないのでガワだけだけど環境作ってみて色々発見があった。拡張ヘルスレポート(詳細モニタリング)のメトリクスでもEnvironmentHealthは無料、とか。
ただElastic Beanstalkのメトリクスだったらやっぱりアプリ動かしてHTTPステータスコードとか取りたいので今後の課題にしておく。