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年以上残っているので安心ですね。

まとめ

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

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