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

CloudWatch

西澤です。ELBに限りませんが、CloudWatchの統計情報をAWS Management Consoleから見ても、グラフのみでは具体的な情報が逆に見えづらいケースがけっこうあります。そのようなケースで、みんな大好きAWS CLIから情報取得する機会があったので、メモ代わりに詳細を残しておこうと思います。

グラフ形式だとCloudWatchの情報が読みづらいケース

例えば、下記はとあるELBのSurgeQueueLength情報をAWS Management Consoleでグラフ表示した画面です。何が起こっているのか、よくわかりませんし、記録された数値もマウスをフォーカスしても読み取りづらいです。

SurgeQueueLengthSample

サンプルとして、もう1つくらい挙げておきましょう。こちらはHTTPCode_Backend_5XXの値を表示した結果です。具体的に何時何分にどのような値を記録したのか、最大値は具体的にどの程度だったのか、まで詳しく知りたいケースもあるのではないでしょうか?

HTTPCode_Backend_5xx_Sample

グラフでは読みづらい情報を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回目)。

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

AWS Cloud Roadshow 2017 福岡