- この記事は
- tl;dr
- 大好き GetMetricWidgetImage
- GetMetricWidgetImage は、どんなことが出来るのか
- GetMetricWidgetImage をなぜ好きなのか
- GetMetricWidgetImage の惜しいポイント
- 以上
- 参考
この記事は
YAMAP エンジニア Advent Calendar 2020 の 15 日目になる予定です。
頑張るぞ。
tl;dr
AWS に初めて出会ってから何年経ったでしょうか。エンジニアの端くれであるわたくしも、AWS CLI や Terraform 等を介して AWS の API を利用していますが、数多ある AWS の API の中で、最もお気に入りな API について書いてみたいと思います。
尚、本記事で登場するツールのバージョンについては、以下の通りです。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H15 $ aws --version aws-cli/2.1.8 Python/3.9.0 Darwin/19.6.0 source/x86_64 prompt/off
大好き GetMetricWidgetImage
GetMetricWidgetImageとは、どんな API なのか。
ざっくり言うと、CloudWatch メトリクスのスナップショットグラフをビットマップ画像として取得することが出来る API で、取得したグラフ画像には、メトリック計算、水平・垂直アノテーションなど、CloudWatchのすべてのメトリックグラフ機能を含めることができます。
尚、この API の制限事項として、
が挙げられています。
GetMetricWidgetImage は、どんなことが出来るのか
論よりコード、GetMetricWidgetImage を体験してみたいと思います。
論よりコード、好きな言葉です!
— 松下享平 《IoTの事例や技術を紹介》(Max@ソラコム) (@ma2shita) 2020年12月4日
以下のように JSON データを用意します。JSON データは、CloudWatch メトリクスの「発信元」タブの「イメージ API」ボタンをチェックして下図のような JSON ファイルを取得します。
この JSON の内容を適当なファイル名で保存します。とりあえず、今回は widget.json という名前で保存しておきます。
あとは、以下のように AWS CLI の get-metric-widget-image
を実行してみます。
$ aws cloudwatch get-metric-widget-image --metric-widget=file://widget.json
以下のように JSON が出力されます。
{ "MetricWidgetImage": "iVBORw0KGgoAAAANSUhEUgAABGkAAAD6CAIAAACdy40CAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR42u3dCVhU9f7Hcbstd+m53RaflqceNdTMumpW9++91c30q ... BkJwAAAAAA2QkAAAAAyE4AAAAAQHYCAAAAALITAAAAAJCdAAAAAIDsBAAAAABkJwAAAADA1f8HPnI6tEo3/egAAAAASUVORK5CYII=" }
MetricWidgetImage
キーの値が、Base64 エンコードされた PNG 画像ですので、以下のように処理してあげると画像ファイルとして保存することが出来ます。
$ aws cloudwatch get-metric-widget-image --metric-widget=file://widget.json | jq -r .MetricWidgetImage | base64 --decode > test.png
test.png を開くと以下のようなメトリクスの画像が表示されました。
また、メトリクスの画像には、先程の JSON を以下のように更新することで、アノテーションを追加することも可能です。
{ "metrics": [ [ "Custom/EC2", "MemoryUtilization", "InstanceId", "i-xxxxxxxxxxxxxxxxxx" ] ], "view": "timeSeries", "stacked": false, "yAxis": { "left": { "label": "", "min": 67.55, "max": 67.65, "showUnits": true } }, "liveData": false, "annotations": { "horizontal": [ { "label": "Threshold", "value": 67.6 } ] }, "width": 1111, "height": 250, "start": "-PT3H", "end": "P0D", "timezone": "+0900" }
画像を生成してみると、以下のように Y 軸に Threshold
を入れることが出来ました。
いい感じです。
GetMetricWidgetImage をなぜ好きなのか
崇高な理由がある訳ではないのですが、AWS のマネジメントコンソール以外でもメトリクス画像を扱えるので、画像を生成して Slack に貼ったり、社内の Wiki にシュッと貼ったりすることが簡単に出来るところが好きです。
スクショと何が違うんか?
というツッコミがありそうですが、JSON を用意することで、プログラマブルに画像を用意することが出来るので、レポートの自動生成等に応用出来るのでは考えています。
(好き!って言う割には、あまり好き好きポイントをアピール出来ていない感じ)
GetMetricWidgetImage の惜しいポイント
大好きな GetMetricWidgetImage ですが、一点だけ、「惜しい」と思ったポイントがあります。
それは、画像を生成する際に JSON で指定するパラメータに view
というパラメータがあるのですが、値として、以下の値しか指定することが出来ない点です (2020/12/14 時点) 。
- timeSeries (折れ線グラフ)
- bar (縦棒グラフ)
- pid (円グラフ)
マネジメントコンソールでメトリクスを生成する場合には、ウィジェットタイプとして、以下のタイプを指定することが可能です。
- 線 (timeSeries)
- スタックされたエリア
- 数値
- 棒 (bar)
- 円 (pie)
マネジメントコンソールで指定出来るのに、API で指定出来ないこともあるんだなあと、今は我慢して、サポートされることを待ちたいと思います。
以上
ということで、あまり好きさが伝わらない文章となりました。