【小ネタ】CloudWatch メトリクスを何度も見直してしまうので、CLI で楽に確認したかった話

2022.09.29

概要

CloudWatch のメトリクスを確認する時、下記の様なことがよく起こります。

  • コンソール操作にもたついてしまう、コンソールの読み込みに時間がかかるときがある
  • 表示を平均、間隔を5分にしていて危うくメトリクスを見落とすところだった
  • 表示を間違えていないか、日時を間違えていないか、何度も見直す
  • 調査してるうちに複数タブでメトリクスを表示することになり、混乱する

書きすぎですね。 この微妙なストレスを AWS CLI で解消できないか模索した時の内容をこの記事では紹介します。

CloudWatch メトリクスを CLI で確認する方法

CloudWatch メトリクスを CLI で確認する方法は、以下の3つがあります。

  • list-metrics コマンド
  • get-metric-data コマンド
  • get-metric-statistics コマンド

list-metrics コマンド

list-metrics — AWS CLI 2.7.35 Command Reference

指定したメトリクスの一覧を表示します。

--namespace で名前空間、--metric-name でメトリクス名、--dimensions でディメンションを指定して、メトリクスが存在するか確認する時に使います。

list-metrics コマンドはメトリクスの一覧が表示されるというもので、メトリクスデータの詳細を確認できるものではないです。

コマンド例

$ aws cloudwatch list-metrics \
--namespace AWS/EC2 \
--dimensions Name=InstanceId,Value=XXXX
{
    "Metrics": [
        {
            "Namespace": "AWS/EC2",
            "MetricName": "StatusCheckFailed_Instance",
            "Dimensions": [
                {
                    "Name": "InstanceId",
                    "Value": "XXXX"
                }
            ]
        }
    ]

--recently-active PT3H と指定することで、過去3時間に追加されたメトリクスのみを表示することができます。
メトリクスを名前空間などで広範囲に検索したい時に使えるかもしれません。

$ aws cloudwatch list-metrics --namespace AWS/EC2 --recently-active PT3H
  • 注意点 1
    メトリックを作成した後、メトリックが表示されるまで最大 15 分ほど時間がかかることがあります。 (と書いていますがほとんどの場合は割とすぐにメトリクスを確認できます。)
    GetMetricData または GetMetricStatistics を使用すると、メトリックの統計情報をすぐに確認できる様です。

ListMetrics - Amazon CloudWatch

  • 注意点 2
    list-metrics コマンドでは過去2週間に新しいデータがないメトリクスは取得できません。
    過去2週間以上前に、データが存在していたメトリクスは get-metric-data コマンドまたは get-metric-statistics コマンドで取得できます。

過去 2 週間に新しいデータポイントがないメトリクスは、コンソールに表示されません。また、これらはコンソールの [すべてのメトリクス] タブの検索ボックスにメトリクス名やディメンション名を入力しても表示されず、list-metrics コマンドの結果でも返されません。これらのメトリクスを取得する最善の方法は、AWS CLI の get-metric-data コマンドまたは get-metric-statistics コマンドを使用することです。

利用可能なメトリクスの表示 - Amazon CloudWatch


get-metric-data コマンド

get-metric-data — AWS CLI 2.7.35 Command Reference

CloudWatch メトリクスの統計データを取得できます。

メトリクスデータの値の一覧を取得する使い方で利用します。

MetricDataQuery の形式に合わせてメトリクスを指定する必要があるので、メトリクスの指定が少し見づらいです。
list-metrics コマンドで指定したメトリクス内容と同じ内容を MetricDataQuery に指定してメトリクスデータを取得してみます。

コマンド例

$ aws cloudwatch get-metric-data \
--metric-data-queries '{"Id":"q1","MetricStat":{"Metric":{"Namespace":"AWS/EC2","MetricName":"StatusCheckFailed_Instance","Dimensions":[{"Name":"InstanceId","Value":"XXXX"}]},"Period":60,"Stat":"Average"}}' \
--start-time 2022-09-27T06:20:00+00:00 \
--end-time 2022-09-27T06:30:00+00:00
{
    "MetricDataResults": [
        {
            "Id": "q1",
            "Label": "StatusCheckFailed_Instance",
            "Timestamps": [
                "2022-09-27T06:29:00+00:00",
                "2022-09-27T06:28:00+00:00",
                "2022-09-27T06:27:00+00:00",
                "2022-09-27T06:26:00+00:00",
                "2022-09-27T06:25:00+00:00",
                "2022-09-27T06:24:00+00:00",
                "2022-09-27T06:23:00+00:00",
                "2022-09-27T06:22:00+00:00",
                "2022-09-27T06:21:00+00:00",
                "2022-09-27T06:20:00+00:00"
            ],
            "Values": [
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0
            ],
            "StatusCode": "Complete"
        }
    ],
    "Messages": []
}

--scan-by でソート順を変更することもできます。
TimestampAscending を指定すると古いデータ順、TimestampDescending で新しい順 (デフォルト) で表示されます。

$ aws cloudwatch get-metric-data \
--metric-data-queries '{"Id":"q1","MetricStat":{"Metric":{"Namespace":"AWS/EC2","MetricName":"StatusCheckFailed_Instance","Dimensions":[{"Name":"InstanceId","Value":"XXXX"}]},"Period":60,"Stat":"Average"}}' \
--start-time 2022-09-27T06:20:00+00:00 \
--end-time 2022-09-27T06:30:00+00:00 \
--scan-by TimestampAscending

--start-time--end-time は指定必須ですが、
時間をそのまま指定 ( 2022-09-27T06:20:00+00:00 ) することも、
Linuxの場合は date コマンドを組み合わせて何分前等の書き方をすることもできます。

$ aws cloudwatch get-metric-data \
--metric-data-queries '{"Id":"q1","MetricStat":{"Metric":{"Namespace":"AWS/EC2","MetricName":"StatusCheckFailed_Instance","Dimensions":[{"Name":"InstanceId","Value":"i-0282b4bb677ead2fa"}]},"Period":60,"Stat":"Average"}}' \
--start-time $(date --utc "+%Y-%m-%dT%H:%M:%SZ" -d "15 min ago") \
--end-time $(date --utc "+%Y-%m-%dT%H:%M:%SZ")

get-metric-statistics コマンド

get-metric-statistics — AWS CLI 2.7.35 Command Reference

CloudWatch メトリクスの統計データを取得できます。

コマンドオプションの Statistics または ExtendedStatistics のいずれかを指定する必要があります。
--statistics で平均値や最大値を指定してメトリクスを表示できます。

コマンド例

$ aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name NetworkPacketsOut \
--dimensions Name=InstanceId,Value=XXXX \
--period 60 \
--statistics Average \
--start-time 2022-09-27T06:15:00+00:00 \
--end-time 2022-09-27T06:30:00+00:00
{
    "Label": "NetworkPacketsOut",
    "Datapoints": [
        {
            "Timestamp": "2022-09-27T06:29:00+00:00",
            "Average": 7.8,
            "Unit": "Count"
        },
        {
            "Timestamp": "2022-09-27T06:24:00+00:00",
            "Average": 6.8,
            "Unit": "Count"
        },
        {
            "Timestamp": "2022-09-27T06:19:00+00:00",
            "Average": 7.8,
            "Unit": "Count"
        }
    ]
}

get-metric-data コマンドと、get-metric-statistics コマンドの使い分けについて AWS ドキュメントに記載がありました。
get-metric-data コマンドでデータ一覧をサクッと取得したり、細かいクエリを投げたりする使い方が良いようです。

GetMetricStatistics ではなく GetMetricData API を使用するのがベストプラクティスです。なぜなら、GetMetricData を使用すると、大規模かつより高速にデータを取得できるからです。また、GetMetricData は Metric Math をサポートしているほか、順番付けされページ分割された結果を返します。この機能の違いは、各サービスのコストに反映されます。 GetMetricStatistics は CloudWatch の無料利用枠に含まれており、最大 100 万件の API リクエストに対応していますが、GetMetricData は含まれていません。

GetMetricData または GetMetricStatistics を使用して CloudWatch メトリクスからデータポイントを取得する


メトリクスのデータが無い場合

get-metric-data コマンドでメトリクスのデータが無い場合に、どう表示されるか見てみます。

インスタンスを起動停止し、インスタンスのステータスチェック失敗のメトリクス (StatusCheckFailed_Instance) のデータが以下画像のようになっています。

データが無い時間帯を含めて get-metric-data コマンドでメトリクスのデータを取得してみます。

$ aws cloudwatch get-metric-data \
> --metric-data-queries '{"Id":"q1","MetricStat":{"Metric":{"Namespace":"AWS/EC2","MetricName":"StatusCheckFailed_Instance","Dimensions":[{"Name":"InstanceId","Value":"XXXX"}]},"Period":60,"Stat":"Average"}}' \
> --start-time 2022-09-29T05:25:00+00:00 \
> --end-time 2022-09-29T05:50:00+00:00
{
    "MetricDataResults": [
        {
            "Id": "q1",
            "Label": "StatusCheckFailed_Instance",
            "Timestamps": [
                "2022-09-29T05:49:00+00:00",
                "2022-09-29T05:48:00+00:00",
                "2022-09-29T05:47:00+00:00",
                "2022-09-29T05:46:00+00:00",
                "2022-09-29T05:45:00+00:00",
                "2022-09-29T05:33:00+00:00",
                "2022-09-29T05:32:00+00:00",
                "2022-09-29T05:31:00+00:00",
                "2022-09-29T05:30:00+00:00",
                "2022-09-29T05:29:00+00:00",
                "2022-09-29T05:28:00+00:00",
                "2022-09-29T05:27:00+00:00",
                "2022-09-29T05:26:00+00:00",
                "2022-09-29T05:25:00+00:00"
            ],
            "Values": [
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0
            ],
            "StatusCode": "Complete"
        }
    ],
    "Messages": []
}

"2022-09-29T05:33:00+00:00" ~ "2022-09-29T05:45:00+00:00" 間のデータ結果は返ってきていません。 データが無い状態を判断するのは、メトリクスの時間で判断する必要があるようです。

例えば、
ステータスチェック失敗のメトリクスを確認する際、データ欠落が無いか確認することが良くあります。
インスタンスが予期せず再起動をした場合、データが欠落していればOS起因、もしくはインスタンスのホスト起因で、再起動が行われた可能性があるかどうかを判断することができます。

そういった場合には、get-metric-data コマンドでメトリクスデータを一分間隔で取得するように指定 ("Period":60) して、データが無い時間帯を確認する形になりますね。

コンソールの場合は、「メトリクスを表示 → 間隔を 1 分 → 対象の時間帯を表示 → グラフ上で選択範囲をクリックして拡大表示」をしないと欠落データを見落とす時があります。

メトリクスデータを連携したい場合、時間をコンソール上でコピペするのに繊細な操作を必要とされる場合があるため、そういった場合にコマンドを利用するなどが良いかもしれません。

手先が不器用なので今回調べたコマンド結果も利用していきたいと思います。

最後に

CloudWatch メトリクスを楽に確認するために、 AWS CLI について改めて調べました。
中途半端な内容になってしまったので、他に良い方法が見つかればブログを更新します。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。