AWS CLIを使ってCloudWatchメトリクスから統計レポートを作成する

2017.11.20

西澤です。CloudWatchを利用していると、AWS Management Consoleからのグラフだけでは物足りなくなることがありますよね。非常に便利で見やすいのですが、詳細データを数字で細かく追ったり、サマリでレポートを作ったりもしたくなります。

画面上からエクスポート機能は無いのでしょうか?みたいなお問い合わせもよくいただくのですが、そのような機能は実装されていないようです。ただ、CloudWatchも他のサービスと同様API(今回はAWS CLIを使います)から情報が取得できるという特性を利用すると、統計レポートのような出力も簡単に生成することができます。ぱっとイメージしてしまうような5分おきのデータを出力して、Excelでまとめてゴニョゴニョする必要はありません。

AWS CLIで統計レポートを作成する

ということで、たまたま今回問い合わせが合ったケース等を含めて、利用例を紹介してみようと思います。変数での計算はbash前提ですが、何を意味する数字かわかるようにあえて計算式で残しています。

サンプル1:NetworkInの10月の合計

get-metric-statisticsオプションを使って情報を取得するわけですが、StartTimeからEndTimeまでの時間の長さとperiodに指定している時間の長さを等しくすれば、1つだけDatapointが返されます。Statistics=Sumであれば、その期間のすべての合計値を取得することができます。

$ INSTANCE_ID=i-12345xxxxx12345xx
$ METRIC_NAME=NetworkIn
$ STATISTICS=Sum
$ aws cloudwatch get-metric-statistics \
  --namespace "AWS/EC2" \
  --dimensions Name=InstanceId,Value=${INSTANCE_ID} \
  --metric-name ${METRIC_NAME} \
  --statistics ${STATISTICS} \
  --start-time "2017-10-01T00:00:00Z" \
  --end-time "2017-11-01T00:00:00Z" \
  --period $((60 * 60 * 24 * 31))
{
    "Datapoints": [
        {
            "Timestamp": "2017-10-01T00:00:00Z",
            "Sum": 3436909364721.0,
            "Unit": "Bytes"
        }
    ],
    "Label": "NetworkIn"
}

サンプル2:NetworkOutの10月の日毎の合計

StartTimeからEndTimeまでの時間の長さよりもperiodを短くすると、その期間区切りのDatapointが返されるのですが、これがソートしないと全くバラバラに返されるのでかなり見づらくなります。そこで、JMESPathsort_by関数を利用して、ソートしています。あともう1点、今回取得したかった数値が極端に大きかったので、浮動小数点表記になってしまうのを防ぐためにto_string関数を利用しました。

$ INSTANCE_ID=i-12345xxxxx12345xx
$ METRIC_NAME=NetworkOut
$ STATISTICS=Sum
aws cloudwatch get-metric-statistics \
  --namespace "AWS/EC2" \
  --dimensions Name=InstanceId,Value=${INSTANCE_ID} \
  --metric-name ${METRIC_NAME} \
  --statistics ${STATISTICS} \
  --start-time "2017-10-01T00:00:00Z" \
  --end-time "2017-11-01T00:00:00Z" \
  --period $((60 * 60 * 24)) \
  --query "sort_by(Datapoints,&Timestamp)[][Timestamp,to_string(${STATISTICS}),Unit]" \
  --output text
2017-10-01T00:00:00Z    71661218805.0   Bytes
2017-10-02T00:00:00Z    81392451598.0   Bytes
2017-10-03T00:00:00Z    79559537934.0   Bytes
2017-10-04T00:00:00Z    79782763094.0   Bytes
2017-10-05T00:00:00Z    76887847793.0   Bytes
2017-10-06T00:00:00Z    77208088683.0   Bytes
2017-10-07T00:00:00Z    75847304465.0   Bytes
2017-10-08T00:00:00Z    72538011928.0   Bytes
2017-10-09T00:00:00Z    76747782099.0   Bytes
2017-10-10T00:00:00Z    83328524664.0   Bytes
2017-10-11T00:00:00Z    78420008408.0   Bytes
2017-10-12T00:00:00Z    79247577251.0   Bytes
2017-10-13T00:00:00Z    78357859824.0   Bytes
2017-10-14T00:00:00Z    75623328705.0   Bytes
2017-10-15T00:00:00Z    74770158139.0   Bytes
2017-10-16T00:00:00Z    80115704811.0   Bytes
2017-10-17T00:00:00Z    79514662599.0   Bytes
2017-10-18T00:00:00Z    77719166215.0   Bytes
2017-10-19T00:00:00Z    83410245760.0   Bytes
2017-10-20T00:00:00Z    76441426020.0   Bytes
2017-10-21T00:00:00Z    71187237439.0   Bytes
2017-10-22T00:00:00Z    145237041966.0  Bytes
2017-10-23T00:00:00Z    143125551874.0  Bytes
2017-10-24T00:00:00Z    86199366262.0   Bytes
2017-10-25T00:00:00Z    81686620797.0   Bytes
2017-10-26T00:00:00Z    80803138108.0   Bytes
2017-10-27T00:00:00Z    73064998472.0   Bytes
2017-10-28T00:00:00Z    67106237341.0   Bytes
2017-10-29T00:00:00Z    72407548650.0   Bytes
2017-10-30T00:00:00Z    77275789860.0   Bytes
2017-10-31T00:00:00Z    80184831273.0   Bytes

サンプル3:CPUUtilizationの10/31の時間ごとの最大

あとはもう似たようなものですが、例えば今度は時間ごとのMax値なんかも簡単に取得することができます。慣れてさえしまえば、AWS Management Consoleで操作するより早く正確な情報が取れるのではないでしょうか?

$ INSTANCE_ID=i-12345xxxxx12345xx
$ METRIC_NAME=CPUUtilization
$ STATISTICS=Maximum
$ aws cloudwatch get-metric-statistics \
  --namespace "AWS/EC2" \
  --dimensions Name=InstanceId,Value=${INSTANCE_ID} \
  --metric-name ${METRIC_NAME} \
  --statistics ${STATISTICS} \
  --start-time "2017-10-31T00:00:00Z" \
  --end-time "2017-11-01T00:00:00Z" \
  --period $((60 * 60)) \
  --query "sort_by(Datapoints,&Timestamp)[][Timestamp,${STATISTICS},Unit]" \
  --output text
2017-10-31T00:00:00Z    11.33   Percent
2017-10-31T01:00:00Z    11.75   Percent
2017-10-31T02:00:00Z    15.5    Percent
2017-10-31T03:00:00Z    64.24   Percent
2017-10-31T04:00:00Z    12.97   Percent
2017-10-31T05:00:00Z    12.58   Percent
2017-10-31T06:00:00Z    12.25   Percent
2017-10-31T07:00:00Z    12.42   Percent
2017-10-31T08:00:00Z    12.25   Percent
2017-10-31T09:00:00Z    12.17   Percent
2017-10-31T10:00:00Z    11.58   Percent
2017-10-31T11:00:00Z    12.08   Percent
2017-10-31T12:00:00Z    11.86   Percent
2017-10-31T13:00:00Z    11.83   Percent
2017-10-31T14:00:00Z    11.58   Percent
2017-10-31T15:00:00Z    10.68   Percent
2017-10-31T16:00:00Z    10.42   Percent
2017-10-31T17:00:00Z    10.17   Percent
2017-10-31T18:00:00Z    9.33    Percent
2017-10-31T19:00:00Z    9.33    Percent
2017-10-31T20:00:00Z    9.51    Percent
2017-10-31T21:00:00Z    10.92   Percent
2017-10-31T22:00:00Z    11.08   Percent
2017-10-31T23:00:00Z    11.36   Percent

下記記事と重複するところがあるので、こちらも合わせてお読みいただけると嬉しいです。

【小ネタ】ELBのCloudWatch統計情報をAWS CLIで細かく取得する

念の為、昨年アップデートされたCloudWatchのデータ保存期間もおさらいしておきましょう。1時間おきのデータであれば、1年以上残っているので安心ですね。

 * CloudWatch Metrics の保存期間延長と新ユーザーインターフェイス

まとめ

ちょうどお問合わせをいただいたので、ざっと書いてみました。ちょっとコツが必要ではありますが、中途半端なCSV出力機能よりも慣れればずっと簡単に集計レポートが作れるので、ぜひ試してみていただければと思います。

どこかの誰かのお役に立てば嬉しいです。