こんにちは。hacknoteのr.katoです。
以前、aws cliでCloudWatchからグラフを取得でaws cliを使ったcloud watchのメトリクスのグラフ画像保存を紹介していました。
今回はboto3とpythonを使って再現してみたので紹介していきます。
コード
次のコードを実行すればカレントディレクトリに指定したグラフのPNGファイルが保存されます。
widget
でどのグラフをどのように保存するか指定し、boto3のclientのcloudwatchにあるget_metric_widget_image
を使って、
グラフ画像のバイナリデータを取得しています。
そして、io.BytesIO
とImage.open
とsave
を使って、バイナリデータをPNGとして保存しています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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で日本時間を指定することでグラフの横軸を日本時間にしています。
実際に取得したグラフ画像
このような形で取得することができました!