파이썬에서 CloudWatch 데이터를 가져 왔습니다.

계기



CloudWatch 대시보드에서 서버 상태를 확인하는 일상.
출사하면 우선 대시보드를 차례로 확인하고ー・・・라고, 귀찮아!
대시보드 정보를 한꺼번에 얻고 싶다!
좋아, 파이썬으로 쓰자!

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',
           ])

네임스페이스


AWS/EC2 라든지 AWS/ElastiCache 라든지 AWS/RDS 라든지.
CloudWatch의 グラフ化したメトリクス 탭의 상세 정보에 마우스 커서를 맞추면 표시되는 정보의 맨 위에 작성된 것입니다.


MetricName


CPUUtilization 라든지 MemoryUtilization 라든지 DiskSpaceAvailable 라든지.
CloudWatch의 グラフ化したメトリクス 탭의 상세 정보에 마우스 커서를 맞추면 표시되는 정보 위에서 두 번째, 구분선 위에 쓰여진 것입니다.

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

요약



파이썬 스크립트에서 CloudWatch 정보를 가져 왔습니다.
이번에는 Datapoints 하지만 하나 밖에 없는 패턴으로 실시했습니다만, 기간의 지정에 따라서는 복수개의 출력이 됩니다.
그 경우는 루프 처리로 좋은 느낌에 필요한 데이터를 노려 쏘아 주세요.

We're hiring!



AI 채팅봇을 개발하고 있습니다.
흥미있는 분은 Wantedly 페이지에서 부담없이 연락주십시오!

참고 기사



Boto3 Docs CloudWatch

좋은 웹페이지 즐겨찾기