LoginSignup
59
42

More than 1 year has passed since last update.

知っておくと便利なCloudWatchメトリクスの機能と活用事例

Posted at

はじめに

AWSでシステムを運用しているとサービスやリソースの状況を確認するためにCloudWatchメトリクスを利用する機会も多いと思います。

今回はCloudWatchメトリクスの情報を閲覧する上で、意外と知られていない便利な機能や活用事例について紹介していきます。

マネージメントコンソールの操作

・グラフを日本時間で表示できる

マネージメントコンソール上でCloudWatchメトリクスを参照する際に、デフォルトのタイムゾーンであるUTCでグラフを表示している場合がありますが、実はタイムゾーンを日本時間に変更する事ができます。
image.png
画面上部のCustomをクリックするとポップアップが表示されますが、ポップアップの右上部分にUTCの表示がプルダウンになっており、UTCLocal time zoneのどちらかを選択できるようになっています。

ここでLocal time zoneを選択してApplyボタンをクリックすると、表示されているグラフのタイムゾーンが日本時間に変更されます。
image.png
意外と知らない方が多いですが、Customポップアップ内も日本時間で期間を選択する事もできるようになり、グラフの表示もタイムゾーンがUTCだから日本時間だと9時間足して...と考える必要がないので、非常にオススメな機能です。

・メトリクスを横断的に検索できる

EC2などの比較的数が多いリソースのメトリクスを選択する場合はインスタンスIDなどのリソースIDを指定してメトリクスを絞り込んでいると思いますが、独自で作成した監視用のメトリクスなどが増えていくと別な階層(名前空間)に欲しいメトリクスがある場合も出てくると思います。

そういう場合はメトリクスの名前空間を選択する前にリソースIDを指定すると名前空間を横断してメトリクスを検索する事ができます。
image.png
ただ、事前にリソースIDがわからない場合や、特定リソースIDのメトリクスを参照した後に同じリソースIDの他のメトリクスを探したい場合もあるかと思います。

そういう場合は、リソースIDなどの条件を指定した後に最上位階層であるすべてをクリックすると、条件を引き継いだまま簡単に名前空間を横断してメトリクスを検索する事ができます。
image.png
ちなみに、一度指定した条件であっても後からリソースIDなどの条件の内容を変更する事ができます。
image.png
複数のリソースやメトリクス、名前空間を扱っている場合は、簡単にメトリクスを探せるのでオススメな機能になります。

・複数のメトリクスの合計値が表示できる

こちらも意外と知られていませんが、グラフに表示するメトリクスを複数選択した後に選択した複数のメトリクスの値の合計値や平均値、最大値、最小値などの計算結果を表示する事ができます。
image.png
例えばELBのリクエスト数やEC2のNetworkOutなどの数を計測しているメトリクスの場合は複数のメトリクスの合計値や平均値、CPU使用率などの割合やステータスなどの0/1の場合は最大値や最小値で利用する、CloudWatchアラームのメトリクスとして指定できるなど非常に柔軟に活用する事ができます。

他にも様々な複雑な計算もできますので、興味のある方はAWSドキュメントのユーザーガイド - Metric Mathを参照して活用してみてください。

・動的にメトリクスを設定できる(検索式)

通常メトリクスを選択してグラフを表示する場合はインスタンスIDなどの固定のリソースIDを指定していると思いますが、それ以外にも全てのEC2や特定条件を満たすALBなど、条件に該当するリソースを動的に指定することができます。

例えばグラフの検索式を使用したリソースの指定方法では数式を追加ボタンから欲しい条件を選択してグラフとして表示したいメトリクスを作成することができます。
image.png
なお、数式を追加ボタンで選択した条件は詳細横のアイコンから編集することもできます。
image.png
まだ対応している項目が少ないですが、欲しい条件が対応されているようであれば一番簡単に利用することができ、他の機能と組み合わせで使用できるので今後も期待できる機能だと思います。

詳細はAWSドキュメントのユーザーガイド - グラフでの検索式の使用に説明が用意されているので、興味のある方はそちらを参照してください。

・動的にメトリクスを設定きる(Metrics Insights)

検索式以外にもCloudWatch Metrics Insightsを使用すると、より複雑なリソースの指定方法を利用することができ、クエリタブやクエリ追加ボタンから欲しい条件を選択・設定してグラフとして表示したいメトリクスを作成することができます。
image.png
なお、クエリを追加ボタンで選択した条件は詳細横のアイコンから編集することもできますが、クエリタブにも自動的に条件が反映されますので、そちらで操作する方が簡単に編集することができます。
image.png
詳細はAWSドキュメントのユーザーガイド - CloudWatch Metrics Insightsに説明が用意されているので、興味のある方はそちらを参照してください。

・メトリクスのグラフをカスタマイズできる

意外と知られていませんが、CloudWatchメトリクスには様々な箇所をカスタム・編集するための機能が提供されています。

例えばメトリクスのグラフのタイトルはデフォルトでタイトルなしのグラフと設定されていますが、タイトル横のアイコンをクリックすると編集用のポップアップが表示され、グラフのタイトルを変更する事ができます。

後述する共有用URLやダッシュボードを使用してメトリクスのグラフを複数共有し始めると後から見た時に何のためのグラフなのか分からなくるため、グラフの共有を行う際はできるだけグラフのタイトルをつけておくことをお勧めします。

image.png
また、メトリクスのラベル横のアイコンからラベルに表示される名称やグラフに表示されるメトリクス名を変更する事ができます。
image.png
表示名称を変えるだけでなく、オプションタブから閾値の境界線を水平注釈として追加したり、特定時刻を垂直注釈として追加する事もできます。

ラベルや値を記載した後は横のチェックボタンをクリックしないと反映されませんので注意してください。

image.png
それ以外にもオプションタブでは表示スケールを変更できたりユニットを変更できたりと様々なカスタマイズができますので、見やすいグラフを作りたい場合は活用してみてください。

ちなみに、活用する機会は少ないかもしれませんが、表示するグラフの種類(ウィジットタイプ)を変更する事ができ、線以外のグラフの場合は時間別の推移ではなく、指定した期間の合計や平均などの数値をグラフとして表示するために使用します。
image.png

・メトリクスのグラフを共有できる

今見ているメトリクスのグラフを後から見直したり他の人に見せたい、せっかく時間をかけてカスタマイズしたグラフを共有したい、と思う場合も多いと思いますが、そういう場合は共有用のURLを利用するとグラフを表示することができます。

共有用のURLはアクションの共有から取得することができ、取得したURLをブラウザで開くと元のグラフがそのまま表示されます。また、グラフをカスタマイズや変更する度にブラウザのURLが変化していますので、ブラウザに表示されているURLをそのまま共有用のURLとして使用することもできます。
image.png
なお、グラフの表示期間のデフォルトが現時点を基点とした相対時間(直近3h)になっているので、特定の表示期間を共有したい場合はグラフの表示期間を日時指定してから共有用URLを取得する必要がありますので注意してください。
image.png
先述したMetric Mathや動的なメトリクス設定、見やすくカスタマイズしたグラフを活用する上で非常に強力な機能となりますので、ぜひ活用して頂ければと思います。

また、こちらも先述したとおり共有するグラフの数が多くなると何のためのグラフなのかわからなくなるため、できるたけグラフのタイトルをつけておくことをお勧めします。

・メトリクスのグラフの共有用URLを作成できる

見たいグラフのフォーマットは決まっているが対象のリソースIDが多いためマネージメントコンソール上で選択するのが面倒、毎回条件指定を変えるのに手間がかかる、といった場面もあるかと思います。

そういう場合は上記のメトリクスのグラフを共有するURLを直接編集・作成してグラフを表示することができます。

例えば共有用のURLは下記のようにメトリクスを示す部分が前半部分に固まっているので、メトリクス部分を直接追加してしまえばマネージメントコンソール上でメトリクス追加の操作を行う必要はありません。

bashで共有URLを確認
$ cat url
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#metricsV2:graph=~(metrics~(~(~'AWS*2fEC2~'CPUUtilization~'InstanceId~'i-0XXXXXX1~(label~'EC2-1*20CPU**4f7f**7528**7387~yAxis~'right))~(~'...~'i-0XXXXXX2~(label~'EC2-2*20CPU**4f7f**7528**7387~stat~'Maximum))~(~'...~'i-0XXXXXX3~(label~'EC2-3*20CPU**4f7f**7528**7387~stat~'Minimum)))~view~'timeSeries~stacked~false~region~'ap-northeast-1~title~'**30b0**30e9**30d5**306e**30bf**30a4**30c8**30eb~stat~'Average~period~300~annotations~(horizontal~(~(label~'**95be**5024~value~25))~vertical~(~(label~'**969c**5bb3**767a**751f**6642**523b~value~'2022-06-18T11*3a00*3a00.000Z)))~yAxis~(left~(label~')));query=~'*7bAWS*2fEC2*2cInstanceId*7d*20InstanceId*3d*22i-0XXXXXX1*22
$ 
$ perl -pe 's/([:;])(\w+=)/$1\n$2/g;s/(metrics~\(~)/$1\n\t/;s/\)~\(~/)~\n\t\(~/g;s/(\t.*?)(\)~\w)/$1\n$2/g' url
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#metricsV2:
graph=~(metrics~(~
	(~'AWS*2fEC2~'CPUUtilization~'InstanceId~'i-0XXXXXX1~(label~'EC2-1*20CPU**4f7f**7528**7387~yAxis~'right))~
	(~'...~'i-0XXXXXX2~(label~'EC2-2*20CPU**4f7f**7528**7387~stat~'Maximum))~
	(~'...~'i-0XXXXXX3~(label~'EC2-3*20CPU**4f7f**7528**7387~stat~'Minimum))
)~view~'timeSeries~stacked~false~region~'ap-northeast-1~title~'**30b0**30e9**30d5**306e**30bf**30a4**30c8**30eb~stat~'Average~period~300~annotations~(horizontal~(~(label~'**95be**5024~value~25))~vertical~(~(label~'**969c**5bb3**767a**751f**6642**523b~value~'2022-06-18T11*3a00*3a00.000Z)))~yAxis~(left~(label~')));
query=~'*7bAWS*2fEC2*2cInstanceId*7d*20InstanceId*3d*i-0XXXXXX1*22
$ 

image.png
共有用URLのgraph=の中のmetrics~(~以降がメトリクスの情報になり、query=~以降は参照タブの検索条件になっています。

また、メトリクスの情報の'...という記載は最初に記載した情報と同じため省略するという意味です。上記の例でいうと'...'AWS*2fEC2~'CPUUtilization~'InstanceIdと同じ記載になり、これは省略せずに記載しても正しくグラフに遷移します。

なお、複数メトリクスが存在する場合は、末尾に~をつけないように気を付けてください。(おそらく,と同じ意味で解釈している)

これはどれだけカスタマイズしたグラフであっても同じルールになっていますので、同様の方法で共有用URLを編集・作成することができます。

・メトリクスのグラフのデータをダウンロードできる

メトリクスのグラフを画像だけでなく数値データとして取得して自前で加工したい場合もあると思います。

そういう場合はアクションボタンの.csv形式でダウンロードを選択するとCSVファイルがDLされ、グラフの元となった数値データを取得することができます。
image.png
特に期間の短いCloudWatchメトリクスのデータは保存期間が短いため、後で確認しようと思ったら保存期間が切れていてグラフが確認できなかった...ということがありますので、後でデータを確認する必要がある場合はCSVファイルをダウンロードしてデータを確保しておいた方が良いかもしれません。

Amazon CloudWatch のよくある質問

Q: すべてのメトリクスの保存期間はどうなっていますか?

カスタムメトリクスをパブリッシュして 1 秒の解像度まで保存できます。2016 年 11 月 1 日にメトリクス保存期間の延長が開始され、以前は 14 日間でしたが、お客様のすべてのメトリクスを 15 か月保存できるようになりました。CloudWatch では、次のようにメトリクスデータを保持します。

・期間が 60 秒未満のデータポイントは 3 時間使用できます。このようなデータポイントが高分解能カスタムメトリクスです。
・期間が 60 秒 (1 分) のデータポイントは、15 日間使用できます。
・期間が 300 秒 (5 分) のデータポイントは、63 日間使用できます。
・期間が 3600 秒 (1 時間) のデータポイントは、455 日 (15 か月) 間使用できます。

AWS-CLIの操作

・メトリクスのデータが取得できる

AWS-CLIではGetMetricStatisticsを使用してCloudWatchメトリクスのデータを取得する事ができます。

GetMetricStatisticsのサンプル
$ aws cloudwatch get-metric-statistics \
>   --namespace "AWS/EC2" \
>   --metric-name "CPUUtilization" \
>   --dimensions "Name=InstanceId,Value=i-0XXXXXX" \
>   --statistics "Average" \
>   --period 300 \
>   --start-time "2022-06-18T00:00:00.000Z" \
>   --end-time "2022-06-18T00:20:00.000Z"
{
    "Label": "CPUUtilization",
    "Datapoints": [
        {
            "Timestamp": "2022-06-18T00:00:00+00:00",
            "Average": 22.15000000000388,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-06-18T00:10:00+00:00",
            "Average": 21.833333333333343,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-06-18T00:05:00+00:00",
            "Average": 23.01666666666278,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-06-18T00:15:00+00:00",
            "Average": 22.38333333332168,
            "Unit": "Percent"
        }
    ]
}
$ 

また、マネージメントコンソールで取得したいCloudWatchメトリクスのグラフを作成し、発信元タブのイメージAPIに記載されているパラメータを使用すると簡単にAWS-CLIコマンドを作成することができます。
image.png
なお、コマンドの詳細はAWS CLI Command Reference - GetMetricStatisticsに説明が用意されているので、興味のある方はそちらを参照してください。

AWS-CLIを使用したCloudWatchメトリクスのデータ取得ではGetMetricDataを使用することが推奨されています。
GetMetricData または GetMetricStatistics のどちらを CloudWatch メトリクスに使用すればよいですか?

GetMetricStatistics ではなく GetMetricData API を使用するのがベストプラクティスです。なぜなら、GetMetricData を使用すると、大規模かつより高速にデータを取得できるからです。 また、GetMetricData は Metric Math をサポートしているほか、順番付けされページ分割された結果を返します。

・複数のメトリクスのデータを同時に取得できる

また、AWS-CLIではGetMetricDataを使用して複数のCloudWatchメトリクスのデータを取得する事ができます。

GetMetricDataのサンプル
$ aws cloudwatch get-metric-data \
>   --metric-data-queries '{"Id":"q1","MetricStat":{"Metric":{"Namespace":"AWS/EC2","MetricName":"CPUUtilization","Dimensions":[{"Name":"InstanceId","Value":"i-0XXXXXX"}]},"Period":300,"Stat":"Average"}}' \
>   --start-time "2022-06-18T00:00:00.000Z" \
>   --end-time "2022-06-18T00:20:00.000Z"
{
    "MetricDataResults": [
        {
            "Id": "q1",
            "Label": "CPUUtilization",
            "Timestamps": [
                "2022-06-18T00:15:00+00:00",
                "2022-06-18T00:10:00+00:00",
                "2022-06-18T00:05:00+00:00",
                "2022-06-18T00:00:00+00:00"
            ],
            "Values": [
                22.38333333332168,
                21.833333333333343,
                23.01666666666278,
                22.15000000000388
            ],
            "StatusCode": "Complete"
        }
    ],
    "Messages": []
}
$ 

また、こちらもGetMetricStatisticsと同様にマネージメントコンソールで取得したいCloudWatchメトリクスのグラフを作成し、発信元タブのイメージAPIに記載されているパラメータを使用すると簡単にAWS-CLIコマンドを作成することができます。
image.png
なお、コマンドの詳細はAWS CLI Command Reference - GetMetricDataに説明が用意されているので、興味のある方はそちらを参照してください。

・メトリクスのグラフの画像が取得できる

AWS-CLIではCloudWatchメトリクスのデータを取得するだけでなく、GetMetricWidgetImageを使用してグラフ画像を取得することもできます。

GetMetricWidgetImageのサンプル
$ aws cloudwatch get-metric-widget-image \
>   --output-format "png" \
>   --output text \
>   --query MetricWidgetImage \
>   --metric-widget '{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-0XXXXXX",{"label":"EC2-1CPU使用率"}]],"view":"timeSeries","stacked":false,"stat":"Average","period":300,"width":990,"height":200,"start":"2022-06-18T00:00:00.000Z","end":"2022-06-18T00:20:00.000Z"}' \
> | base64 --decode > img.png
$ 

また、GetMetricWidgetImageではマネージメントコンソールで取得したいCloudWatchメトリクスのグラフを作成し、発信元タブのイメージAPIに記載されているテキストの空白と改行を削除した文字列が--metric-widgetに指定するパラメータになります。
image.png
なお、上記で取得できた画像img.pngは下図になります。ラベルなどに日本語(マルチバイト文字列)を入れていると文字化けするので日本語の使用は控えた方がよさそうです。
img.png
コマンドの詳細はAWS CLI Command Reference - GetMetricWidgetImageに説明が用意されているので、興味のある方はそちらを参照してください。

活用事例

今まで紹介したCloudWatchメトリクスの機能を活用した事例をいくつか紹介します。

・Slackでグラフを共有する

障害対応やAWS作業をおこなっている時に、話題のAWSリソースの状況をSlackでグラフの画面キャプチャと共有用URLを貼り付けて作業メンバーに共有しています。
image.png
共有用URLのリンクがあれば各自マネージメントコンソール上で詳細を確認したり、他の期間やリソースを参照できるので便利です。

また、Slackでグラフを共有するだけでなく、作業内容を残す際にもカスタマイズしたCloudWatchメトリクスのグラフの画像と共有用URLを活用しています。
image.png
上記のようにカテゴリのリソースが少ない場合は検索式Metrics Insightsが意外と活躍します。

・ダッシュボードでグラフを確認する

よく確認するグラフ群は、すぐに見られるようにCloudWatchメトリクスのダッシュボードに登録しています。
image.png
縦に並べておくと問題が発生した場合に関連リソースの状況が時系列で確認しやすく、またダッシュボードは複数作成できるためジャンルごとに作成しておくと便利です。

・Slackのbotでグラフを確認する

Slackにコマンドを投げるとコマンドに記載したリソース状況のグラフ画像をAWS-CLIのGetMetricWidgetImageで取得してSlackに通知するbotを作成しています。
image.png
移動中や外出中に障害発生などでメトリクスを確認したい場合、スマホのブラウザやアプリでマネージメントコンソールを操作してCloudWatchメトリクスのグラフを確認するのは面倒で見にくいため、Slack上で簡単にグラフの画像を確認できるようにしています。

・共有URLのリンクのまとめを作成する

ダッシュボードにまとめるほど使用頻度は高くないけど後で使う場面がありそう...などのグラフは共有用URLをまとめたリンク集をwikiにまとめています。
image.png
管理するリソースが多いとメトリクスを作成するだけでも大変なので、作業内容を残すだけの使い捨てのグラフとは別にwikiにまとめておくと後々便利に活用できます。また、使用頻度があがってくるとダッシュボードへ昇格させる場合もあります。

・エビデンスを確保する

ある周期で特定の時間だけ問題発生する、AWS作業を行った後の経過観察を行うなど、定期的にCloudWatchメトリクスのデータを確保しておきたい場合にEC2のcrontabでAWS-CLIのGetMetricDataを使用してデータの取得を行なっています。
特に期間の短いCloudWatchメトリクスのデータは保存期間が短いため、後で確認しようと思ったら保存期間が切れていてグラフが確認できなかった...ということがありますので、定期的にデータの取得をしておく機会は意外と多いです。

Amazon CloudWatch のよくある質問

Q: すべてのメトリクスの保存期間はどうなっていますか?

カスタムメトリクスをパブリッシュして 1 秒の解像度まで保存できます。2016 年 11 月 1 日にメトリクス保存期間の延長が開始され、以前は 14 日間でしたが、お客様のすべてのメトリクスを 15 か月保存できるようになりました。CloudWatch では、次のようにメトリクスデータを保持します。

・期間が 60 秒未満のデータポイントは 3 時間使用できます。このようなデータポイントが高分解能カスタムメトリクスです。
・期間が 60 秒 (1 分) のデータポイントは、15 日間使用できます。
・期間が 300 秒 (5 分) のデータポイントは、63 日間使用できます。
・期間が 3600 秒 (1 時間) のデータポイントは、455 日 (15 か月) 間使用できます。

59
42
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
42