【小ネタ】ELBのCloudWatch統計情報をAWS CLIで細かく取得する
西澤です。ELBに限りませんが、CloudWatchの統計情報をAWS Management Consoleから見ても、グラフのみでは具体的な情報が逆に見えづらいケースがけっこうあります。そのようなケースで、みんな大好きAWS CLIから情報取得する機会があったので、メモ代わりに詳細を残しておこうと思います。
グラフ形式だとCloudWatchの情報が読みづらいケース
例えば、下記はとあるELBのSurgeQueueLength
情報をAWS Management Consoleでグラフ表示した画面です。何が起こっているのか、よくわかりませんし、記録された数値もマウスをフォーカスしても読み取りづらいです。
サンプルとして、もう1つくらい挙げておきましょう。こちらはHTTPCode_Backend_5XX
の値を表示した結果です。具体的に何時何分にどのような値を記録したのか、最大値は具体的にどの程度だったのか、まで詳しく知りたいケースもあるのではないでしょうか?
グラフでは読みづらい情報をAWS CLIで取得してみる
それでは、先に挙げたグラフの結果について、AWS CLIから情報取得してみましょう。まずは、SurgeQueueLength
が少しでも記録されたタイミングを、過去2週間に渡って、調べました。
$ ELBNAME=myelb $ i=0 $ while [ $i -lt 15 ] do j=$((i+1)) aws cloudwatch get-metric-statistics \ --namespace "AWS/ELB" \ --dimensions Name=LoadBalancerName,Value=${ELBNAME} \ --metric-name SurgeQueueLength \ --statistics Sum \ --start-time "$(date -u -v-${j}d +%Y-%m-%dT%TZ)" \ --end-time "$(date -u -v-${i}d +%Y-%m-%dT%TZ)" \ --period 60 \ --query "reverse(sort_by(Datapoints,&Timestamp)[?Sum>\`0\`][Sum,Timestamp])" \ --output text i=$j done 95229.0 2017-06-26T08:48:00Z 1694.0 2017-06-23T03:08:00Z 64.0 2017-06-16T03:37:00Z
一気に長い期間の情報をまとめて取得しようとすると、下記のようなエラーとなり取得が失敗します。上記の例では、1日分ずつ処理するようにしてみました。dateコマンドは、Mac OS X環境の想定なのでBSD系オプションですが、Linux環境の場合には--date="x day ago"
等に修正して試してみてください。
An error occurred (InvalidParameterCombination) when calling the GetMetricStatistics operation: You have requested up to 8,640 datapoints, which exceeds the limit of 1,440. You may reduce the datapoints requested by increasing Period, or decreasing the time range.
続けて、HTTPCode_Backend_5XX
の情報も取得してみましょう。こちらは詳細情報が欲しい時間帯のレンジを直接指定(上記画像のAWS Management Consoleの例ではJST表示としていた為、こちらはUTCで指定)しました。aws cloudwatch get-metric-statistics
を実行した際に、Timestamp
がバラバラの順序で結果が返される点に注意が必要です。JMESPath(--queryオプション)のsort_by
を使ってソートしてあげると綺麗に出力することが可能です(念の為、先のコマンドでも逆順ソート指定しています)。
$ aws cloudwatch get-metric-statistics \ --namespace "AWS/ELB" \ --dimensions Name=LoadBalancerName,Value=${ELBNAME} \ --metric-name HTTPCode_Backend_5XX \ --statistics Sum \ --start-time "2017-06-22T12:00:00Z" \ --end-time "2017-06-22T13:00:00Z" \ --period 60 \ --query "sort_by(Datapoints,&Timestamp)[?Sum>\`0\`][Sum,Timestamp]" \ --output text 6.0 2017-06-22T12:00:00Z 1.0 2017-06-22T12:01:00Z 242.0 2017-06-22T12:02:00Z 334.0 2017-06-22T12:03:00Z 3.0 2017-06-22T12:04:00Z 6.0 2017-06-22T12:05:00Z 47.0 2017-06-22T12:06:00Z 285.0 2017-06-22T12:07:00Z 219.0 2017-06-22T12:08:00Z 1.0 2017-06-22T12:09:00Z 3.0 2017-06-22T12:10:00Z 25.0 2017-06-22T12:11:00Z 564.0 2017-06-22T12:12:00Z 237.0 2017-06-22T12:13:00Z 2.0 2017-06-22T12:16:00Z 20.0 2017-06-22T12:17:00Z 11.0 2017-06-22T12:18:00Z 522.0 2017-06-22T12:19:00Z 228.0 2017-06-22T12:20:00Z 2.0 2017-06-22T12:21:00Z 1.0 2017-06-22T12:22:00Z 2.0 2017-06-22T12:26:00Z 1.0 2017-06-22T12:27:00Z 75.0 2017-06-22T12:28:00Z 187.0 2017-06-22T12:29:00Z 1.0 2017-06-22T12:31:00Z 35.0 2017-06-22T12:32:00Z 110.0 2017-06-22T12:33:00Z 21.0 2017-06-22T12:34:00Z 183.0 2017-06-22T12:35:00Z 267.0 2017-06-22T12:36:00Z 29.0 2017-06-22T12:37:00Z 1.0 2017-06-22T12:38:00Z 1.0 2017-06-22T12:40:00Z 170.0 2017-06-22T12:41:00Z 271.0 2017-06-22T12:42:00Z 1.0 2017-06-22T12:43:00Z 5.0 2017-06-22T12:44:00Z 2.0 2017-06-22T12:45:00Z 1.0 2017-06-22T12:46:00Z 1.0 2017-06-22T12:51:00Z 21.0 2017-06-22T12:55:00Z 4.0 2017-06-22T12:57:00Z 1.0 2017-06-22T12:58:00Z 2.0 2017-06-22T12:59:00Z
ここまで詳しい結果を取得できれば、ELBログとの突き合わせも捗りますよね。
まとめ
--statistics
オプションや--period
オプションを要件に合わせて修正すれば、色々なケースで再利用できるのではないいかと思います。AWS Management Consoleだけでは、情報が不足しているというときには、AWS CLIをぜひ活用してもらえればと思います(本日2回目)。
どこかの誰かのお役に立てば嬉しいです。