LoginSignup
10
9

More than 3 years have passed since last update.

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

Posted at

きっかけ

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

PythonでCloudWatch情報を取得

Boto3のget_metric_statistics()を使ったら良さそう。
公式ドキュメント通りに、まずはBoto3でCloudWatchを読み込む準備をする。


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

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

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のグラフ化したメトリクスタブの詳細情報にマウスカーソルを合わせると表示される情報の一番上に書かれたものです。
CloudWatch.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で定期実行してもいいかもしれません。

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ページ からお気軽にご連絡ください!

参考記事

Boto3 Docs CloudWatch

10
9
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
10
9