@shinyaz

CloudWatch Query Studio で AWS メトリクスを PromQL で横断クエリする

目次

はじめに

2026年4月3日、AWS は Amazon CloudWatch Query Studio のパブリックプレビューを発表した。CloudWatch 初のネイティブ PromQL クエリ環境であり、AWS ベンダーメトリクスと OpenTelemetry メトリクスを単一のインターフェースで照会できる。

CloudWatch Query Studio と OTel エンリッチメントを組み合わせると、Prometheus エクスポーターや外部バックエンドなしに AWS ベンダーメトリクスを PromQL で横断的に照会できる。本記事では有効化から Query Studio でのクエリ・アラーム作成までを検証し、Prometheus ユーザーが移行・併用を判断するための実践データを共有する。公式ドキュメントは Query metrics with PromQL を参照。

本記事の内容は 2026年4月時点のパブリックプレビューでの動作に基づいており、GA 時に変更される可能性がある。

前提条件:

  • AWS CLI v2(エンリッチメント有効化に使用)
  • cloudwatch:* および observabilityadmin:* 権限(必要な権限の詳細は IAM permissions for PromQL を参照)
  • 検証リージョン: us-east-1(プレビュー対応リージョン)
  • EC2 インスタンスなど、CloudWatch メトリクスが存在するリソース

OTel エンリッチメントの有効化

Query Studio で PromQL を使うには、2つのエンリッチメント設定を有効化する必要がある。

1つ目は、AWS リソースタグをテレメトリに伝播する設定だ。

Terminal
aws observabilityadmin start-telemetry-enrichment --region us-east-1
Output
{
    "Status": "Running",
    "AwsResourceExplorerManagedViewArn": "arn:aws:resource-explorer-2:us-east-1:XXXXXXXXXXXX:managed-view/AWSManagedViewForCloudWatchTelemetryEnrichment/..."
}

Resource Explorer のマネージドビューが自動作成される。これにより、EC2 インスタンスや Lambda 関数に付与したタグが PromQL ラベルとして利用可能になる。

2つ目は、CloudWatch ベンダーメトリクスの OTel エンリッチメントだ。

Terminal
aws cloudwatch start-o-tel-enrichment --region us-east-1

有効化の確認:

Terminal
aws cloudwatch get-o-tel-enrichment --region us-east-1
Output
{
    "Status": "Running"
}

2コマンドで即座に有効化が完了する。なお、公式ブログでは describe-o-tel-enrichment-status というコマンド名が記載されているが、実際の AWS CLI(v2.34 時点)では get-o-tel-enrichment である。

コンソールからも有効化できる。CloudWatch の Settings 画面で「Enable resource tags on telemetry」と「Enable OTel enrichment for AWS metrics」をオンにすればよい。

Query Studio で PromQL クエリを実行する

Query Studio へのアクセス

CloudWatch コンソールのナビゲーションペインから Query Studio (Preview) を選択する。クエリ言語のドロップダウンで PromQL を選ぶと、Builder モードと Editor モードが利用可能になる。右上の </> アイコンで両モードを切り替えられる。

基本クエリ — EC2 CPUUtilization

まず Builder モードで EC2 の CPUUtilization を照会してみる。

  1. Metric フィールドで CPUUtilization を選択
  2. Run をクリック

これだけで時系列グラフが表示される。結果には OTel エンリッチメントにより以下のラベルが自動付与されている:

ラベル説明
@aws.accountAWS アカウント ID123456789012
@aws.regionメトリクスが取り込まれたリージョンus-east-1
@aws.tag.NameEC2 インスタンスの Name タグmy-ec2-instance
@resource.cloud.resource_idリソースの完全な ARNarn:aws:ec2:us-east-1:...
@instrumentation.@nameソースサービスの識別子cloudwatch.aws/ec2
@instrumentation.cloudwatch.sourceサービス識別子aws.ec2
InstanceId元の CloudWatch ディメンションi-0123456789abcdef0

これらは手動でのインストルメンテーションなしに利用可能だ。

Prometheus との構文差異 — histogram 関数

ここが Prometheus ユーザーにとって最大の注意点だ。CloudWatch のベンダーメトリクスは内部的に ExponentialHistogram として格納されている。Builder モードでは集約された値がグラフに表示されるが、Editor モードで同じクエリを書くと挙動が異なる。

Editor モードに切り替えて {"CPUUtilization"} と入力し Run すると、集約された値ではなく生のヒストグラムデータが返る。

# Editor モード — 生のヒストグラムデータが返る
{"CPUUtilization"}

集約された値を得るには histogram_avg で囲む必要がある:

# Editor モード — 集約された平均値が返る
histogram_avg({"CPUUtilization"})

Prometheus では node_cpu_seconds_total のような gauge/counter メトリクスを直接クエリできるが、CloudWatch PromQL ではベンダーメトリクスに対して histogram_avg()histogram_sum() で集約する必要がある。CloudWatch メトリクスは統計値(Average, Sum, Min, Max, SampleCount)を持つデータモデルであり、PromQL では ExponentialHistogram として格納される。

用途CloudWatch PromQLPrometheus 相当
平均値histogram_avg({"CPUUtilization"})avg(node_cpu_idle)
合計値histogram_sum({"Invocations"})sum(invocations_total)
パーセンタイルhistogram_quantile(0.99, {"Duration"})histogram_quantile(0.99, rate(duration_bucket[5m]))

@ プレフィックスによるスコープ指定

PromQL ラベルは OTLP のスコープに応じた @ プレフィックスを持つ。

スコーププレフィックス
Resource@resource.@resource.cloud.resource_id
Instrumentation@instrumentation.@instrumentation.@name
AWS 予約@aws.@aws.tag.Name, @aws.region
Datapoint@datapoint. またはプレフィックスなしInstanceId

UTF-8 文字を含むラベル名は Editor モードではダブルクォートで囲む必要がある(例: "@instrumentation.@name")。Builder モードではドロップダウンから選択するだけなので意識する必要はない。

サービス横断クエリ — タグベース集計

OTel エンリッチメントの真価は、リソースタグによるサービス横断クエリにある。

CPUUtilization は EC2 だけでなく RDS など複数のサービスが同名のメトリクスを持つ。@instrumentation.@name ラベルでソースサービスを絞り込める:

histogram_avg({"CPUUtilization", "@instrumentation.@name"="cloudwatch.aws/ec2"})

さらに sum by でリソースタグによる集計ができる。例えば、同じ Name タグを持つ複数の EC2 インスタンスの CPU 使用率をタグごとに集約する:

sum by ("@aws.tag.Name")(histogram_avg({"CPUUtilization", "@instrumentation.@name"="cloudwatch.aws/ec2"}))

@aws.tag.Environment@aws.tag.Team など、任意のリソースタグで集計できるため、複数サービス・複数インスタンスのメトリクスをタグベースで横断的に分析できる。Prometheus エクスポーターなしでこれが実現できる点が、この機能の最大の価値だ。

Builder モード vs Editor モード

観点Builder モードEditor モード
操作性GUI でメトリクス名・ラベルを選択PromQL を直接入力
オートコンプリートメトリクス名・ラベル名の候補表示ありシンタックスハイライトあり
複雑なクエリ基本的なフィルタ・集計に限定任意の PromQL 式を記述可能
適したユーザーPromQL 初心者、メトリクス探索時Prometheus 経験者、複雑な分析時

メトリクスの探索は Builder モードで始め、複雑なクエリが必要になったら Editor モードに切り替えるのが効率的だ。

アラーム作成とダッシュボード連携

Query Studio からアラームを作成する

Query Studio で PromQL クエリを実行した後、アクションメニューから Create alarm を選択すると、クエリが事前入力された状態でアラーム作成画面に遷移する。

PromQL アラームの特徴は、閾値条件をクエリ内に埋め込む点だ。従来の CloudWatch アラームでは閾値を別パラメータで指定するが、PromQL アラームでは > 80 のような比較演算子が PromQL 式の一部になる。Builder モードでは Basic Operation ドロップダウンで比較演算子と閾値を設定できる。Editor モードでは直接式に記述する:

histogram_avg({"CPUUtilization", "@instrumentation.@name"="cloudwatch.aws/ec2"}) > 80

設定項目は3つ:

  • Evaluation interval — クエリの評価間隔(例: 1分)
  • Pending period — ALARM 状態に遷移するまでの待機時間(例: 120秒)
  • Recovery period — OK 状態に復帰するまでの待機時間(例: 300秒)
CLI からアラームを作成する場合
Terminal
aws cloudwatch put-metric-alarm \
  --region us-east-1 \
  --alarm-name "PromQL-EC2-CPU-High" \
  --evaluation-criteria '{
    "PromQLCriteria": {
      "Query": "histogram_avg({__name__=\"CPUUtilization\", \"@instrumentation.@name\"=\"cloudwatch.aws/ec2\"}) > 80",
      "PendingPeriod": 120,
      "RecoveryPeriod": 300
    }
  }' \
  --evaluation-interval 60

作成されたアラームを確認すると、PromQL クエリが EvaluationCriteria に格納されていることがわかる:

Terminal
aws cloudwatch describe-alarms \
  --region us-east-1 \
  --alarm-names "PromQL-EC2-CPU-High"
Output
{
    "MetricAlarms": [
        {
            "AlarmName": "PromQL-EC2-CPU-High",
            "StateValue": "OK",
            "StateReason": "No time series evaluated to ALARM",
            "EvaluationCriteria": {
                "PromQLCriteria": {
                    "Query": "histogram_avg({__name__=\"CPUUtilization\", \"@instrumentation.@name\"=\"cloudwatch.aws/ec2\"}) > 80",
                    "PendingPeriod": 120,
                    "RecoveryPeriod": 300
                }
            },
            "EvaluationInterval": 60
        }
    ]
}

CLI 経由の場合、メトリクス名は __name__= 形式で指定する必要がある点に注意。

ダッシュボードへの追加

Query Studio でクエリを実行した後、アクションメニューから Add to dashboard を選択し、追加先のダッシュボードを指定する。ウィジェットはダッシュボードのリフレッシュ間隔で PromQL クエリを再実行し、最新のデータを表示し続ける。

まとめ

  • CLI 2コマンドで即座に有効化start-telemetry-enrichmentstart-o-tel-enrichment を実行するだけで、既存の AWS ベンダーメトリクスが PromQL で照会可能になる。追加のインフラ構築は不要だ。
  • histogram 関数が必須 — CloudWatch ベンダーメトリクスは ExponentialHistogram として格納されるため、histogram_avg / histogram_sum で集約する必要がある。Prometheus から移行する際の最大の構文差異であり、既存の PromQL クエリをそのまま使い回すことはできない。
  • タグベース横断クエリが実用的 — OTel エンリッチメントにより @aws.tag.* ラベルが自動付与され、サービスを横断したタグベースの集計・フィルタが可能。Prometheus エクスポーターなしでこれが実現できる点が最大の価値だ。
  • PromQL 関数の互換性 — 検証した rate, avg_over_time, histogram_quantile, topk, count, sum by はすべて動作した。Prometheus 3.0 ベースで UTF-8 ラベル名もサポートされている。

プレビューの制約

  • 対応リージョン: us-east-1, us-west-2, eu-west-1, ap-southeast-1, ap-southeast-2 の5リージョンのみ(東京リージョン未対応)
  • 料金: プレビュー期間中は無料。GA 後の料金体系は未発表
  • クエリ制限: 最大 500 時系列/クエリ、最大 7 日間のレンジ、20 秒のタイムアウト
  • recording rules: Prometheus のような recording rules はサポートされていない。アラームは put-metric-alarm の PromQL 形式で個別に作成する
補足: Prometheus 互換 API エンドポイントからのクエリ

Query Studio のコンソール以外に、Prometheus 互換の HTTP API エンドポイントから直接 PromQL クエリを実行することもできる。Grafana との連携や自動化スクリプトで利用する場合に有用だ。

エンドポイント:

https://monitoring.<region>.amazonaws.com/api/v1/query        # instant query
https://monitoring.<region>.amazonaws.com/api/v1/query_range  # range query

SigV4 署名のサービス名は monitoringawscurl を使えば署名を自動処理できる。

Terminal
REGION="us-east-1"
BASE="https://monitoring.${REGION}.amazonaws.com/api/v1/query"
QUERY='histogram_avg({__name__="CPUUtilization", "@instrumentation.@name"="cloudwatch.aws/ec2"})'
ENCODED=$(python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" "$QUERY")
 
awscurl --service monitoring --region "$REGION" \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "query=${ENCODED}" \
  "$BASE"

メトリクス名の指定方法に注意: Query Studio の Editor モードおよび API エンドポイント経由では、メトリクス名をダブルクォートで囲む必要がある({"CPUUtilization"})。__name__= 形式({__name__="CPUUtilization"})でも動作する。

Grafana との連携: Amazon Managed Grafana で Prometheus データソースを追加し、URL に https://monitoring.<region>.amazonaws.com/v1/metrics、認証に SigV4 を設定すれば、Grafana ダッシュボードから同じ PromQL クエリを実行できる。

クリーンアップ

Terminal
# アラームの削除
aws cloudwatch delete-alarms \
  --region us-east-1 \
  --alarm-names "PromQL-EC2-CPU-High"
 
# OTel エンリッチメントの無効化(不要な場合)
aws cloudwatch stop-o-tel-enrichment --region us-east-1
aws observabilityadmin stop-telemetry-enrichment --region us-east-1

共有する

田原 慎也

田原 慎也

ソリューションアーキテクト @ AWS

AWS ソリューションアーキテクトとして金融業界のお客様を中心に技術支援をしており、クラウドアーキテクチャや AI/ML に関する学びをこのサイトで発信しています。このサイトの内容は個人の見解であり、所属企業の公式な意見や見解を代表するものではありません。

関連記事