ようへいの日々精進XP

よかろうもん

僕の一番好きな AWS の API について書きます

この記事は

YAMAP エンジニア Advent Calendar 2020 の 15 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

AWS に初めて出会ってから何年経ったでしょうか。エンジニアの端くれであるわたくしも、AWS CLI や Terraform 等を介して AWSAPI を利用していますが、数多ある AWSAPI の中で、最もお気に入りな 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 なのか。

docs.aws.amazon.com

ざっくり言うと、CloudWatch メトリクスのスナップショットグラフをビットマップ画像として取得することが出来る API で、取得したグラフ画像には、メトリック計算、水平・垂直アノテーションなど、CloudWatchのすべてのメトリックグラフ機能を含めることができます。

尚、この API の制限事項として、

が挙げられています。

GetMetricWidgetImage は、どんなことが出来るのか

論よりコード、GetMetricWidgetImage を体験してみたいと思います。

以下のように JSON データを用意します。JSON データは、CloudWatch メトリクスの「発信元」タブの「イメージ API」ボタンをチェックして下図のような JSON ファイルを取得します。

f:id:inokara:20201215001826p:plain

この JSON の内容を適当なファイル名で保存します。とりあえず、今回は widget.json という名前で保存しておきます。

あとは、以下のように AWS CLIget-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 を開くと以下のようなメトリクスの画像が表示されました。

f:id:inokara:20201215002142p:plain

また、メトリクスの画像には、先程の 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 を入れることが出来ました。

f:id:inokara:20201215001912p:plain

いい感じです。

GetMetricWidgetImage をなぜ好きなのか

崇高な理由がある訳ではないのですが、AWS のマネジメントコンソール以外でもメトリクス画像を扱えるので、画像を生成して Slack に貼ったり、社内の Wiki にシュッと貼ったりすることが簡単に出来るところが好きです。

スクショと何が違うんか?

というツッコミがありそうですが、JSON を用意することで、プログラマブルに画像を用意することが出来るので、レポートの自動生成等に応用出来るのでは考えています。

(好き!って言う割には、あまり好き好きポイントをアピール出来ていない感じ)

GetMetricWidgetImage の惜しいポイント

大好きな GetMetricWidgetImage ですが、一点だけ、「惜しい」と思ったポイントがあります。

それは、画像を生成する際に JSON で指定するパラメータに view というパラメータがあるのですが、値として、以下の値しか指定することが出来ない点です (2020/12/14 時点) 。

  • timeSeries (折れ線グラフ)
  • bar (縦棒グラフ)
  • pid (円グラフ)

マネジメントコンソールでメトリクスを生成する場合には、ウィジェットタイプとして、以下のタイプを指定することが可能です。

f:id:inokara:20201215002128p:plain

  • 線 (timeSeries)
  • スタックされたエリア
  • 数値
  • 棒 (bar)
  • 円 (pie)

マネジメントコンソールで指定出来るのに、API で指定出来ないこともあるんだなあと、今は我慢して、サポートされることを待ちたいと思います。

以上

ということで、あまり好きさが伝わらない文章となりました。

参考

docs.aws.amazon.com

docs.aws.amazon.com