#きっかけ
CloudWatchのダッシュボードでサーバーの状態を確認する日々。
出社したらまずダッシュボードを順番に確認してー・・・って、めんどくさい!
ダッシュボードの情報を一気に取得したい!
よし、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のグラフ化したメトリクス
タブの詳細情報にマウスカーソルを合わせると表示される情報の一番上に書かれたものです。
####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