CloudWatch Logs Insights の新機能「estimate」の推定スキャン量と実測値を比べてみた

CloudWatch Logs Insights の新機能「estimate」の推定スキャン量と実測値を比べてみた

CloudWatch Logs Insights の `estimate` を使うと、クエリ実行前にスキャン量を確認できます。フィルターなしで試した4パターンでは、推定値は実測値とバイト単位まで一致しました。
2026.10.03

はじめに

2026年9月29日、CloudWatch Logs Insights にクエリのスキャン量を実行前に見積もる estimate コマンドが追加されました。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-Estimate.html

https://aws.amazon.com/jp/about-aws/whats-new/2026/09/cloudwatch-logs-estimate-bytes-scanned/

estimate クエリ自体には Logs Insights の料金はかからず、全商用リージョンで利用できます。

この記事では、estimate が返す推定スキャン量と実測値を比べ、クエリ実行前の確認手順として使えるかを確かめます。

コンソールでのスキャン量確認

マネジメントコンソールでは、クエリに estimate を書かなくても、クエリエディタの下部に「Estimated bytes scanned」として推定スキャン量が表示されます。Run を押す前に、時間範囲を変えながらスキャン量を確認できます。

同じクエリで、時間範囲だけを 5分・1時間・12時間と変えました。

5分:

5分の推定スキャン量

1時間:

1時間の推定スキャン量

12時間:

12時間の推定スキャン量

推定スキャン量は 212.2 KB・3.2 MB・31.6 MB と増えました。

CLI でのスキャン量確認

estimate は start-query の --query-string に渡します。--query-string "estimate" のように estimate だけを渡すと、指定したロググループと時間範囲の全データが対象になります。

aws logs start-query \
  --log-group-names \
    "/aws/lambda/function-a" \
    "/aws/lambda/function-b" \
    "/aws/ecs/service-a" \
  --start-time $(date -d '30 days ago' +%s) \
  --end-time $(date +%s) \
  --query-string "estimate"

estimate はクエリの最後のコマンドとして置く必要があります。フィルター付きクエリを見積もるには、末尾に | estimate を付けます。

aws logs start-query \
  --log-group-name "LOG_GROUP_NAME" \
  --start-time START_TIME \
  --end-time END_TIME \
  --query-string "fields @timestamp, @message | filter @message like /ERROR/ | estimate"

結果は get-query-results で取得します。推定値は @estimatedBytesScanned フィールドに入ります。以下は1つ目のコマンド(3ロググループ・30日)の結果です。

{
  "results": [[{"field": "@estimatedBytesScanned", "value": "85634"}]],
  "statistics": {"bytesScanned": 0.0, "logGroupsScanned": 3.0},
  "status": "Complete"
}

statistics.bytesScanned は 0.0 で、estimate では実際のスキャンは発生していませんでした。

同じロググループ・期間で、フィルターなしのクエリ(stats count(*) as cnt)を実行すると、実測値は statistics.bytesScanned に入ります。このクエリは全データをスキャンするため、通常どおり Logs Insights の料金がかかります。

{
  "results": [[{"field": "cnt", "value": "478"}]],
  "statistics": {
    "recordsMatched": 478.0,
    "recordsScanned": 478.0,
    "bytesScanned": 85634.0,
    "logGroupsScanned": 3.0
  },
  "status": "Complete"
}

推定値と実測値は一致しました。

複数パターンでの比較

ロググループと期間を変えた4パターン(上記の例を含む)で比較しました。推定値は --query-string "estimate" 単体の結果、実測値はフィルターなしのクエリ(stats count(*) as cnt)の bytesScanned です。いずれもロググループと期間の全データがスキャン対象です。

ロググループ(種類) 期間 推定値 (bytes) 実測値 (bytes) 差分
Lambda ×2 + ECS ×1(3グループ) 30日 85,634 85,634 0%
EventBridge 365日 3,299,539 3,299,539 0%
CloudWatch Synthetics 2026-01-01〜2026-07-01 18,817,667 18,817,667 0%
ECS 365日 906,347 906,347 0%

4パターンすべてで、推定値と実測値はバイト単位で一致しました。

公式ドキュメントでは、estimate の値は概算(approximate)であり、実際にクエリを実行したときのスキャン量と異なる場合があると説明されています。

まとめ

Logs Insights の料金はスキャン量に応じて決まります。実行前にスキャン量を確認できるようになったことで、想定外のスキャンを避けやすくなりました。

https://aws.amazon.com/cloudwatch/pricing/

これまで、多数のロググループをまたぐクエリや、出力量が時期によって変動するロググループに長期間を指定するクエリでは、スキャン量の事前見積もりが困難でした。コンソールではクエリエディタに推定スキャン量が表示されるため、長い期間を指定するときは Run の前に確認できます。CLI でスキャン量が大きくなりそうなクエリを扱うときは、実行前に estimate でドライランすることをおすすめします。


コスト最適化、打ちっぱなしで元通りになっていませんか

タグ付けも不要リソースの棚卸しも、施策は打てる。でも続ける仕組みがなければ、コストは数か月でじわじわ戻る。一度きりで終わらせず、FinOpsを組織に定着させる=CCoEの役割。最適化を回し続ける進め方を、無料資料にまとめました。

CCoE総合支援

FinOpsを定着させる資料をもらう

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事