boto3を使ってaws cloud watchのメトリクスのグラフ画像を保存する方法

こんにちは。hacknoteのr.katoです。

以前、aws cliでCloudWatchからグラフを取得でaws cliを使ったcloud watchのメトリクスのグラフ画像保存を紹介していました。
今回はboto3とpythonを使って再現してみたので紹介していきます。

コード

次のコードを実行すればカレントディレクトリに指定したグラフのPNGファイルが保存されます。
widgetでどのグラフをどのように保存するか指定し、boto3のclientのcloudwatchにあるget_metric_widget_imageを使って、
グラフ画像のバイナリデータを取得しています。

そして、io.BytesIOImage.opensaveを使って、バイナリデータをPNGとして保存しています。

import boto3
import json
import io
from PIL import Image
def get_graph(instance_id,access_key_id,secret_access_key):
sess = boto3.Session(aws_access_key_id = access_key_id,aws_secret_access_key = secret_access_key)
cw_client = sess.client('cloudwatch')
widget = '{"view": "timeSeries",
"stacked": false,
"metrics": [[ "AWS/EC2", "NetworkOut",
"InstanceId","'+ instance_id+'"]],
"width": 2000,"height": 500,
"start": "-P31D","end": "P0D",
"timezone": "+0900"}'
image = cw_client.get_metric_widget_image(MetricWidget = widget)
image_bin = io.BytesIO(image["MetricWidgetImage"])
img = Image.open(image_bin)
img.save("NetworkOut.png","PNG")
if __name__=="__main__":
get_graph(インスタンスID,AWSのaccess_key_id,AWSのsecret_access_key) #全部文字列で指定

widgetはawsコンソールのCloudWatchのメトリクスにアクセスし、

プロットしたいグラフをプロットし、表示期間など設定後に

ソースを表示し、イメージAPIをクリックした後、そのままコピーした物を使えばOKです。

今回は、プログラム実行時の31日前からのEC2のNetworkOutのグラフ画像が欲しかったのでwidgetのmetricsがこのようになっています。
また、timezoneで日本時間を指定することでグラフの横軸を日本時間にしています。

実際に取得したグラフ画像

このような形で取得することができました!

業務管理SaaS「クロジカ」のエンジニアメンバーを募集!
自社開発のSaaSプロダクトをアジャイル開発して、実践的な経験を積んでいただけます。