Amazon CloudWatch Metrics Insightsが一般提供開始(GA)されました

CloudWatchのInsights系に仲間が! その名も「Amazon CloudWatch Metrics Insights」。メトリクスに対してSQLで集計できるよ。
2022.04.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon CloudWatch Metricsに対してSQLで集計できるよ

こんにちは、のんピ(@non____97)です。

皆さんはCloudWatch Metricsに対してSQLで集計したいと思ったことはあります? 私はあります。

CloudWatch Metric Mathを使うことでメトリクスの四則演算や絶対値、最小値を求めたりなどは今までも出来ていました。

また、CloudWatch Metric Mathの機能単体で条件に当てはまるメトリクスを抽出して計算することもSearch式やIF式を使うことで可能ですが、式が複雑になってしまいがちでした。

今回、Amazon CloudWatch Metricsに対してクエリを実行できる機能、Amazon CloudWatch Metrics Insightsが一般提供開始(GA)されました。

これにより、SQLでメトリクスをリアルタイムで集計し、グループ化や計算ができるようになりました。

SQLに慣れている方には非常に嬉しいニュースではないでしょうか?

この記事では、こちらのAmazon CloudWatch Metrics Insightsについて紹介していきます。

いきなりまとめ

  • Amazon CloudWatch Metrics InsightsとはCloudWatch Metricsに対して実行可能なSQLベースのクエリエンジン
  • クエリは無料で実行可能
  • 東京リージョンを含む、全ての商用リージョンで使用可能
  • CloudWatch Metric Mathと組み合わせて実行することも可能
  • 制限事項
    • 2022/4/18時点でクエリできるのは最新の3時間のデータのみ
    • 1つのクエリで処理できるメトリクスは10,000個まで
    • 1つのクエリで返される値は500個まで
    • GetMetricData APIには1つのクエリしか設定できない

Amazon CloudWatch Metrics Insightsの特徴

Amazon CloudWatch Metrics Insightsとは

Amazon CloudWatch Metrics InsightsとはCloudWatch Metricsに対して実行可能なSQLベースのクエリエンジンです。

メトリクスを集計することで、CloudWatch Metricsの可視性を大きく向上させることができます。

実行するクエリはサンプルクエリから選択、もしくは自分で作成することができます。

クエリは無料で実行可能で、全ての商用リージョンで使用できます。

クエリ構文

Amazon CloudWatch Metrics Insightsのクエリ構文は以下の通りです。

SELECT FUNCTION(metricName)
FROM namespace | SCHEMA(...)
[ WHERE labelKey OPERATOR labelValue [AND ... ] ]
[ GROUP BY labelKey [ , ... ] ]
[ ORDER BY FUNCTION() [ DESC | ASC ] ]
[ LIMIT number ]
  • SELECT
    • 必須
    • 指定された期間によって決定される各タイムバケットの観測値を集計するためのFUNCTIONを指定する
    • 同時にクエリ対象のメトリクスの名前も指定する
  • FUNCTION
    • 有効な値は以下の通り
    • AVG : クエリで一致した観測値の平均
    • COUNT : クエリで一致した観測値のカウント (数)
    • MAX : クエリで一致した観測値の最大値
    • MIN : クエリで一致した観測値の最小値
    • SUM : クエリで一致した観測値の合計
  • FROM
    • 必須
    • メトリクスのソースを指定する
    • クエリ大将のメトリクスを含むメトリクス名前空間、あるいはSCHEMAテーブル関数のどちらかを指定する
    • カスタムメトリクス用にユーザーが作成したメトリクス名前空間なども含まれる
    • メトリクス名前空間の例 : "AWS/EC2""AWS/Lambda"
    • / など英数字、アンダースコア以外の文字を含むメトリクス名前空間は、ダブルクォーテーションで囲む必要がある
  • SCHEMA
    • FROM句内で使用できるオプションのテーブル関数.
    • SCHEMAは、クエリ結果をリストされたディメンションと完全に一致したメトリクスからのもの、あるいはディメンションを持たないメトリクスからのものに絞り込む
    • SCHEMA句を使用する際は、クエリ対象のメトリクス名前空間を指定するために、(最初の引数として) 少なくとも 1 つを渡す必要がある
  • WHERE
    • 1つまたは複数のラベルキーの特定のラベル値を使用して、指定した式に一致するメトリックのみに結果をフィルタリングする
    • ラベル値は常にシングルクォーテーションで囲む必要がある
  • WHERE 句サポートされている演算子
    • = : ラベル値は指定された文字列と一致する
    • != : ラベル値は、指定した文字列と一致しない
    • AND : 指定された 2 つの条件がともに true である場合に一致する
  • GROUP BY
    • クエリ結果を複数の時系列にグループ化する
    • デフォルトではアルファベット順に並べられる
  • ORDER BY
    • クエリが複数の時系列を返す場合に使用する順序を指定する
    • ASC(昇順)かDESC(降順)のどちらを使用するか指定する
    • ORDER BY句内で使用可能な関数は、AVG()COUNT()MAX()MIN()、およびSUM()
  • LIMIT
    • クエリによって返される時系列の数を、指定した値に制限する
    • 指定できる最大値は500

予約キーワードは以下AWS公式ドキュメントをご覧ください。

名前空間、メトリクス名、またはラベルキーに予約キーワードが含まれている場合、その単語はダブルクォーテーションで囲む必要があるので要注意です。

また、CloudWatch Metrics InsightsはMetric Mathと併用することも可能です。CloudWatch Metrics Insightsでデータの選択・集計をして、集計した結果をMetric Mathで計算するといった形です。

サンプルクエリ

2022/4/18時点でサンプルクエリとして提供されているクエリは42個です。

例えば以下のようなものが提供されています。

  • ALB
    • すべてのロードバランサー全体のリクエストの合計
    • 最もアクティブなロードバランサーの上位10個
  • AWS API
    • アカウント内の呼び出し数上位20 AWS API
    • 呼び出しで順でソートしたCloudWatch API
  • DynamoDB
    • プロビジョニング済み書き込み容量ユニットの数上位10テーブル
    • 指定した期間中に GetRecords オペレーション(Amazon DynamoDB Streams)によって返されるバイト数別の上位10テーブル
    • ユーザーエラー別の上位10テーブル
  • EBS
    • 書き込みバイト数上位10 EBSボリューム
    • 平均EBSボリューム書き込み時間
  • EC2
    • EC2インスタンスのCPU使用率(高い順)
    • EC2インスタンス全体の平均CPU使用率
    • CPU使用率の高いインスタンス上位10台

こちらのクエリはCloudWatch Metricsのクエリを追加から簡単に選択、実行することが出来ます。

クエリを追加

制限事項

Amazon CloudWatch Metrics Insightsの制限事項は以下の通りです。

  • 2022/4/18時点でクエリできるのは最新の3時間のデータのみ
  • 1つのクエリで処理できるメトリックは10,000個まで
  • 1つのクエリで返される値は500個まで
  • GetMetricData APIには1つのクエリしか設定できない
    • ただし、ダッシュボードには複数のウィジェットを設定でき、それぞれにクエリを設定することができる

最新の3時間のデータまでにしかクエリを実行できないのが特に注意が必要ですね。より長い期間でクエリを実行できるようになることに期待です。

また、1つのクエリで返される値は500個までなので、500以上の値が返ってくる場合はORDER BY句を使用して並び替えをすると良さそうです 。

やってみた

それでは実際にAmazon CloudWatch Metrics Insightsを触ってみます。

CloudWatch Metricsのコンソールからクエリを追加-AWS API usage examples-Top 20 AWS APIs by the number of calls in your accountをクリックします。

Top 20 AWS APIs by the number of calls in your account

すると、Query Builderに名前空間やメトリクス名などクエリを構成する各種値が入力され、アカウント内の呼び出し数による上位20のAWS APIのメトリクスが描画されました。

メトリクスの描画

ラベルにAPI名と、そのAPIの平均実行回数が記載されており、何だかイケていますね。動的ラベルの詳細は以下AWS公式ドキュメントをご覧ください。

クエリタブのEditorをクリックすると、Query Editorが表示され、以下のように生成されたクエリが入力されていました。

SELECT COUNT(CallCount)
FROM SCHEMA("AWS/Usage", Class, Resource, Service, Type)
WHERE Type = 'API'
GROUP BY Service, Resource
ORDER BY COUNT() DESC
LIMIT 20

次に、CloudWatch Metrics Mathと併用して、表示された20件のメトリクスの平均実行回数を描画してみます。

方法は簡単で、数式を追加から空の式で始まるをクリックし、AVG(q1)と入力するだけです。

表示された20件のメトリクスの平均実行回数

あなたの知りたいメトリクス、これで見つけられます

Amazon CloudWatch Metricsに対してクエリを実行できる機能、Amazon CloudWatch Metrics Insightsの一般提供開始(GA)を紹介しました。

アカウント内の呼び出し数上位20 AWS API」や「書き込みバイト数上位10 EBSボリューム」など今まで集計するには一手間必要だったものが簡単に確認できるようになったのはとてもありがたいです。

なお、「APIの集計ならCloudTrailの証跡ログをAthenaで集計しても良くない??」という意見も出てきそうですが、Amazon CloudWatch Metrics Insightsで集計することで、APIの実行数の推移を時系列で表示することが可能です。これはAthenaにはない魅力ですね。

より複雑なクエリを書いたり、3時間以上の長い期間で分析をしたりしたい場合はAthenaを使うなど状況に応じて使い分ければと考えます。

なお、AthenaでCloudWatch Metricsに対してクエリを実行したい場合は、Amazon Athena Cloudwatch Metricsコネクタを事前に準備する必要があります。

Amazon Athena Cloudwatch MetricsコネクタのデプロイはAWS SAMで行います。詳細は以下リポジトリをご覧ください。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!