PythonでCloudWatchのデータを取得してみた

#きっかけ
CloudWatchのダッシュボードでサーバーの状態を確認する日々。
出社したらまずダッシュボードを順番に確認してー・・・って、めんどくさい！:persevere:
ダッシュボードの情報を一気に取得したい！
よし、Pythonで書こう！

#PythonでCloudWatch情報を取得
Boto3の`get_metric_statistics()`を使ったら良さそう。
[公式ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html)通りに、まずはBoto3でCloudWatchを読み込む準備をする。

```python

import boto3
client = boto3.client('cloudwatch')
```

`get_metric_statistics()`は以下のように使うようだ。

```python
response = client.get_metric_statistics(
           Namespace = 'string',
           MetricName = 'string',
           Dimensions = [
             {
               'Name': 'string',
               'Value': 'string'
             },
           ],
           StartTime = datetime(2020, 2, 11),
           EndTime = datetime(2020, 2, 11),
           Period = 123,
           Statistics = [
             'SampleCount'|'Average'|'Sum'|'Minimum'|'Maximum',
           ])
```

####Namespace
`AWS/EC2`とか`AWS/ElastiCache`とか`AWS/RDS`とか。
CloudWatchの`グラフ化したメトリクス`タブの詳細情報にマウスカーソルを合わせると表示される情報の一番上に書かれたものです。
<img width="213" alt="CloudWatch.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361666/8a923cea-012c-9749-b41f-70aad7f8513c.png">

####MetricName
`CPUUtilization`とか`MemoryUtilization`とか`DiskSpaceAvailable`とか。
CloudWatchの`グラフ化したメトリクス`タブの詳細情報にマウスカーソルを合わせると表示される情報の上から2番目、区切り線の上に書かれたものです。

####Dimensions
`InstanceId`とか`CacheClusterId`とか`DBInstanceIdentifier`とか。
CloudWatchの`グラフ化したメトリクス`タブの詳細情報にマウスカーソルを合わせると表示される情報の区切り線の下に書かれたものです。（区切り線の下は全てDimensions情報）
上の例のようにDimensionsは以下の形で書きます。
`Dimensions=[{'Name': 'string', 'Value': 'string'}]`
なので具体的には
`Dimensions=[{'Name': 'InstanceId', 'Value': 'i-xxxxxxxxxxx'}]`　や
`Dimensions=[{'Name': 'Role', 'Value': 'WRITER'}, {'Name': 'DBClusterIdentifier', 'Value': 'xxxxxxxxxxx'}]`
のような形になります。

####Period
期間を秒数で書きます。なので
1分 → 60
5分 → 300
24時間 → 86400

####Statistics
統計を書きます。

#レスポンス
`get_metric_statistics()`のレスポンスは以下のようになります。

```
{'Label': 'CPUUtilization', 'Datapoints': [{'Timestamp': datetime.datetime(2020, 2, 10, 19, 8, tzinfo=tzutc()), 'Maximum': 6.66666666666667, 'Unit': 'Percent'}], 'ResponseMetadata': {'RequestId': 'xxxxxxxxxxx', 'HTTPStatusCode': 200, ...（省略）
```
なので
値は`response['Datapoints'][0][Statisticsで指定した値（上のレスポンスだとMaximum）]`
値の単位は`response['Datapoints'][0]['Unit']`
あたりを使えばいい感じに出来そうです。

#実際に書いたもの（一部）
毎日CloudWatchで目視確認をしていたので、今回のスクリプトではスクリプト実行日時から過去24時間分を取得するようにします。
スクリプトが出来たらcronで定期実行してもいいかもしれません。

```python
import boto3
from datetime import datetime, timedelta

client = boto3.client('cloudwatch')

def get_metric_statistics(name_space, metric_name, dimensions_values, statistic):
    # CloudWatch情報の取得
    response = client.get_metric_statistics(
               # CPU使用率の場合`AWS/EC2`が入る
               Namespace = name_space,
               # CPU使用率の場合`CPUUtilization`が入る
               MetricName = metric_name,
               # `[{'Name': 'InstanceId', 'Value': instance_id}]`が入る
               Dimensions = dimensions_values,
               # 開始日時を`スクリプト実行日時 - 1日`で指定
               StartTime = datetime.now() + timedelta(days = -1),
               # 終了日時を`スクリプト実行日時`で指定
               EndTime = datetime.now(),
               # 24時間を指定
               Period = 86400,
               # `Maximum`が入る
               Statistics = [statistic]
               )

    # 出力文作成
    response_text = name_space + ' ' + metric_name + statistic + ': ' + str(response['Datapoints'][0][statistic]) + ' ' + response['Datapoints'][0]['Unit']
    print(response_text)

# 出力対象メトリクス
instance_id = 'i-xxxxxxxxxxx'
# CPU使用率
get_metric_statistics('AWS/EC2', 'CPUUtilization', [{'Name': 'InstanceId', 'Value': instance_id}], 'Maximum')
# メモリ使用率
get_metric_statistics('System/Linux', 'MemoryUtilization', [{'Name': 'InstanceId', 'Value': instance_id}], 'Maximum')
```

出力結果

```
AWS/EC2 CPUUtilizationMaximum: 6.66666666666667 Percent
System/Linux MemoryUtilizationMaximum: 18.1909615159559 Percent
```

#まとめ
PythonスクリプトからCloudWatchの情報を取得してみました。
今回は`Datapoints`が一つしかないパターンで行いましたが、期間の指定によっては複数個の出力になります。
その場合はループ処理でいい感じに必要なデータを狙い撃ちしてください。

#We're hiring!
AIチャットボットを開発しています。
ご興味ある方は [Wantedlyページ](https://www.wantedly.com/projects/266837) からお気軽にご連絡ください！

#参考記事
[Boto3 Docs CloudWatch](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html)