CloudWatch Logs Insights の保存クエリにパラメータを設定して使い回してみた
こんにちは。
SELECT hope FROM life;
オペレーション部のかわいです。
2026年4月13日、Amazon CloudWatch Logs Insights の保存クエリにパラメータ(変数)を設定できるようになりました。
これまでは、ログレベルやサービス名を変えつつ同じ構造のクエリを使い回したい場合、値が異なるクエリをいくつも用意するか、毎回エディタ上で手書き編集するしかありませんでした。
今回のアップデートで、クエリ定義に {{parameterName}} 形式のプレースホルダを埋め込み、実行時に値を渡せるようになりました。これにより、1つのテンプレートで複数の用途をカバーできます。
本記事では、パラメータ付き保存クエリを作成、実行する手順を検証します。
パラメータ付き保存クエリとは?
CloudWatch Logs Insights は、ログデータをインタラクティブに検索・集計できるサービスです。
よく使うクエリは「保存クエリ」として名前をつけて保管できます。
これまでは、ログレベルやサービス名などの、値が異なるだけでほぼ同じ構造のクエリを、それぞれ別の保存クエリとして管理する必要がありました。今回のアップデートでは、クエリ定義に {{パラメータ名}} 形式のプレースホルダを埋め込み、実行時に値を渡せるようになりました。1つのテンプレートで複数の用途をカバーできるため、メンテナンスするクエリ数を大幅に削減できます。
※パラメータ機能は Logs Insights Query Language(CWLI)を使用するクエリのみ対応しています。PPL(Piped Processing Language)や SQL では現時点では使用できません。
■変更前の例(値が固定)
fields @timestamp, @message
| filter level = "ERROR"
| filter applicationName = "OrderService"
| sort @timestamp desc
| limit 20
■変更後の例
fields @timestamp, @message
| filter level = {{logLevel}}
| filter applicationName = {{applicationName}}
| sort @timestamp desc
| limit {{maxResults}}
また、実行時は以下のように呼び出します。
$ErrorsByApp(logLevel="ERROR", applicationName="OrderService", maxResults=20)
【制限事項】
| 制限項目 | 内容 |
|---|---|
| 最大パラメータ数 | 1クエリにつき20個まで |
| 展開後の最大文字数 | 10,000文字 |
| パラメータ名の先頭文字 | 英字またはアンダースコアのみ |
| ネスト呼び出し | 保存クエリ内から別の保存クエリを $ で参照するのは非サポート |
| 対応クエリ言語 | CloudWatch Logs Insights QL のみ(OpenSearch SQL 等は非対応) |
何が嬉しいのか
直接クエリを書けばいいんじゃないの?と思うかもですが、パラメータ付き保存クエリは、特に以下のような場面で使えそうです。
-
Default値を用いて、クエリを省略して実行できる
例えば$OrderError()のような書き方で実行できます。普段は固定値で、必要なときだけパラメータ側を編集すればok。 -
チームで共通テンプレートを持てる
クエリ構造はチームで統一しつつ、実行時の値だけを変える運用ができます。 -
複数クエリを部品として組み合わせられる
パラメータ付き保存クエリ同士をパイプでつなぎ組み合わせることで、複雑な分析が可能になります(詳しくは後述)。
逆に個人利用や単発フィルタの変更程度であれば、エディタで直接書いて実行するほうが楽です。
コスト見積もり
| リソース | 想定コスト | 備考 |
|---|---|---|
| CloudWatch Logs Insights クエリ | $0.005/GB スキャン × 数回 = $0.01未満 | スキャンしたデータ量に対して課金 |
| CloudWatch Logs 取り込み | $0.50/GB × 少量 ≈ $0.01 未満 | 毎月5GBまで無料枠あり |
| CloudWatch Logs 保存 | $0.03/GB・月 × 少量 ≈ $0.01 未満 | 毎月5GBまで無料枠あり |
| 合計 | ~$0.10 | 無料枠に収まればクエリ代のみ |
事前準備
習うより慣れろ。早速やっていきましょう。
操作は AWS マネジメントコンソール 上で実施します。
サンプルログの用意
パラメータ付きクエリを試すためにサンプルログを用意します。
今回は Lambda 関数で JSON 形式のログを出力させます。
1. Lambda 関数の作成
マネジメントコンソールから Lambda を開き、【Create Function】をクリックします。
| 設定項目 | 値 |
|---|---|
| 関数名 | test-log-generator |
| ランタイム | Python 3.13 |
| アーキテクチャ | x86_64 |
lambda_function.pyを以下に置き換えて Deploy
services と levels からランダムに値を選び、1回の実行で20件の JSON ログを出力します。
出力例は以下のようなイメージ。
{"level": "ERROR", "applicationName": "PaymentService", "message": "Sample log entry 3", "requestId": "abc-123"}
{"level": "INFO", "applicationName": "OrderService", "message": "Sample log entry 7", "requestId": "abc-123"}
▼コード
import json
import logging
import random
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
services = ["OrderService", "PaymentService", "NotificationService"]
levels = ["INFO", "WARN", "ERROR"]
for i in range(20):
log = {
"level": random.choice(levels),
"applicationName": random.choice(services),
"message": f"Sample log entry {i}",
"requestId": context.aws_request_id
}
logger.info(json.dumps(log))
return {"statusCode": 200}
- Test → テストイベントを任意の名前で作成し、間隔を空けて数回実行する
これで /aws/lambda/test-log-generator にサンプルログが出力されます。

検証
1. パラメータなしの保存クエリを作成
後でパラメータ付きと比較するため、まずは値が固定された保存クエリを作成します。
- CloudWatch コンソール → Logs → Logs Insights
- ロググループ に
/aws/lambda/test-log-generatorを選択 - クエリエディタに以下を入力し Run queryで実行

fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 20

ログレベル「ERROR」のみが抽出されました
- 保存 をクリック
- 名前を
ErrorLogとして保存
この時点では値("ERROR")がクエリ定義にハードコードされています。
例えばログレベルを"WARN" に変えて使いたい場合は別途保存するか、毎回編集が必要です。
2. パラメータ付き保存クエリを作成
次に、ログレベルとサービス名をパラメータ化したクエリを作成します。
- クエリエディタの内容を以下に書き換える
fields @timestamp, @message
| filter @message like /{{logLevel}}/
| filter @message like /{{applicationName}}/
| sort @timestamp desc
| limit 20
※ {{}} はプレースホルダ構文で、ここに書いた名前がそのままパラメータ名になります。大文字/小文字は区別されます(logLevel と loglevel は別物)。
- 保存 をクリック
- クエリ名に
OrderErrorを入力
ここで、「Query parameters - optional」セクションが表示されます。

- Add parameter をクリックし、以下を入力
| Name | Default value | Description |
|---|---|---|
logLevel |
ERROR |
フィルタするログレベル |
applicationName |
OrderService |
フィルタするアプリケーション名 |
- 保存 をクリック
3. パラメータ付きクエリを実行する
a) デフォルト値で実行
-
画面右上のフォルダアイコンをクリックして Saved queries パネルを開く
-
OrderError - CWLIの横の + アイコンをクリック

-
エディタに以下が自動展開されます
$OrderError(logLevel=ERROR, applicationName=OrderService)
- そのまま Run query
Default値 の ERROR と OrderService が適用されてクエリが実行されます。出力は以下。
b) 値を変えて実行
a) で展開された呼び出し文を、エディタ上で直接書き換えます。
$OrderError(logLevel="WARN", applicationName="PaymentService")
logLevel を "WARN"、applicationName を "PaymentService" に変えて Run query をクリックします。アップデートさえしなければ、保存済みクエリの定義(テンプレート)は変わらず、実行時の値だけが変わります。

c) 複数クエリを組み合わせる
パラメータ付き保存クエリ同士をパイプでつないで実行できます。ここでは新たに MostRecentLogs という保存クエリを作成し、直近の10件を取得するようにしてみます。OrderError と組み合わせることで、条件に合うログの中から直近10件だけ取得するクエリになります。
【MostRecentLogs クエリの作成】
- 新規エディタに以下を入力して Save
sort @timestamp desc
| limit {{count}}
- クエリ名に
MostRecentLogsを入力 - クエリパラメータを追加(パラメータ名:
count、Default値:10) - Save をクリック
【組み合わせ実行】
先ほどの Saved queries パネルから OrderError の +(プラス) をクリックしてエディタに展開、末尾に | $MostRecentLogs() を追記します(パイプで繋ぎます)。
$OrderError(logLevel="ERROR", applicationName="OrderService") | $MostRecentLogs()
Run query を実行するとcount のデフォルト値 10 が適用され、展開後は以下と同様のクエリとして処理されます。
fields @timestamp, @message
| filter @message like /ERROR/
| filter @message like /OrderService/
| sort @timestamp desc
| limit 10

直近の10件が出力されました
まとめ的なやつ
本記事では、CloudWatch Logs Insights のパラメータ付き保存クエリを検証してみました。
{{parameterName}} でプレースホルダを埋め込んだクエリを保存しておけば、実行時に$QueryName(param=value) で値を渡して使い回せるようになります。
クエリ文を直接編集せずにクエリパラメータを変更したり、パラメータを定義したクエリ同士をパイプで組み合わせたりできるので、地味に便利だと思いました。
完
【参考リンク】









