CloudWatch Logsのクエリから直接アラームを作成してみた

記事タイトルとURLをコピーする

今月誕生日の人、おめでとうございます🎉 エデュケーショナルサービス課の森純子です。

「ログにERRORが出たらすぐ気づきたい。でもメトリクスフィルター作るの面倒…」 そんなお悩み、ありませんでしたか?

2026年7月1日のアップデートで、CloudWatch Logsのクエリ結果から直接アラームを作成できる機能 がリリースされました🎉

Amazon CloudWatch supports creating alarms from log queries(2026年7月1日)

従来はログからアラームを作るために「メトリクスフィルター作成 → カスタムメトリクス生成 → アラーム設定」と3ステップ必要でした。今回の機能で、ログクエリに直接閾値を設定してアラームを作成できます。中間ステップ不要です。

ということで、やってみました。

本記事の登場サービス

略称 正式名称
CloudWatch Amazon CloudWatch
CloudWatch Logs Amazon CloudWatch Logs
Logs Insights Amazon CloudWatch Logs Insights
Lambda AWS Lambda
SNS Amazon Simple Notification Service

対象読者

  • CloudWatch Logsを使っていて、ログ監視をもっと簡単にしたい方
  • メトリクスフィルターの管理が面倒だと感じている方
  • ログからアラームを設定したいが、手順が多くて諦めていた方

本記事で分かること

  • ログクエリアラーム(Log Alarm)の作成手順(マネジメントコンソール)
  • 従来のメトリクスフィルター方式との違い
  • アラーム通知メールにログ行が含まれる設定方法
  • 作成から発火までの所要時間

従来の方法との違い

従来(メトリクスフィルター方式):

  1. ロググループにメトリクスフィルターを作成
  2. フィルターがカスタムメトリクスを生成
  3. カスタムメトリクスに対してアラームを設定

今回の新機能(Log Alarm方式):

  1. ログクエリを書いて閾値を設定 → 完了

メトリクスフィルターの作成・管理が不要になります。さらに、Logs Insightsのクエリをそのまま使えるので、filter @message like /ERROR/ のような柔軟なフィルタ条件を直接アラームに設定できます。

検証手順と結果

検証環境

項目 設定
リージョン ap-northeast-1(アジアパシフィック(東京))
検証用リソース AWS Lambda関数
ロググループ /aws/lambda/cwlogs-tag-enrichment-test
通知先 Amazon SNSトピック(Eメール)

手順1: SNSトピックを作成する

アラーム通知の送信先を作成します。

  1. Amazon SNS コンソールを開く
  2. 「トピックの作成」→ タイプ: スタンダード、名前を入力して作成
  3. 作成したトピックに「サブスクリプションの作成」→ プロトコル: Eメール、エンドポイントにメールアドレスを入力
  4. 届いたメールの「Confirm subscription」をクリック

受信メール

クリック後、新しいブラウザタブに「Subscription confirmed!」のメッセージが出れば成功です。

Confirm subscriptionリンク実行後ブラウザ

手順2: ERRORログを出力するLambda関数を用意する

アラーム発火を確認するため、ERRORログを出力するLambda関数を用意して実行します。

def handler(event, context):
    print("Hello from cwlogs-tag-enrichment-test!")
    print("ERROR: This is a test error for log alarm verification.")
    return {"statusCode": 200, "body": "OK"}

手順3: ログアラームを作成する

ここが今回の本題です。

1.CloudWatch コンソール → 左メニュー「アラーム」→「アラームの作成」

2.データソースで「ログ」を選択

3.Log AnalyticsはLogs Insights・Live Tail・Contributor Insightsを統合した新しいUIです。クエリの書き方は従来のLogs Insightsと同じです。「Log Analyticsでクエリを作成」を押す → Log Analyticsの画面に遷移

ログ選択画面

4.ロググループを選択し、以下のクエリを入力して「実行」

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

5.ERRORログが取れることを確認したら、右上の「アラームに進む」を押す

クエリ実行画面

6.アラームの条件を設定:

設定項目
集計式 COUNT(*)
比較演算子 より大きい(>)
しきい値 0
評価頻度 5分
開始時間オフセット 5分
データポイント 1 / 1
欠落データの処理 欠落データを見つかりませんとして処理

7.IAM権限: 「必要な権限を持つ新しいロールを作成」→「ロールを作成」を押す

必要な権限を持つ新しいロール作成を選択

8.「次へ」→ アクションの設定画面へ

9.「クエリ結果をアクションに含める」を展開し、クエリ結果の数を 5 に設定。IAMロールも「ロールを作成」を押す

10.「通知の追加」→ アラーム状態のときに作成したSNSトピックへ通知を設定

11.「次へ」→ アラーム名を入力 →「次へ」→ プレビューを確認して「ログアラームを作成」

次の成功メッセージが出ればOKです。

作成成功メッセージ

結果

アラーム作成から約10分後、アラームがALARM状態に遷移しました。

アラーム状態

同時にSNS通知メールが届きました。メールには以下の情報が含まれています:

  • アラーム名と状態遷移理由
  • クエリ文字列と集計式
  • アラームを発火させたログ行ERROR: This is a test error for log alarm verification.
  • Logs Insightsでクエリ結果を表示するリンク

受信メール

従来のメトリクスフィルター方式では、アラーム通知に「メトリクスの値が閾値を超えた」としか書かれず、どのログ行が原因かは別途Logs Insightsで確認する必要がありました。Log Alarm方式では、通知メールに直接ログ行が含まれるため、メールを見ただけで何が起きたか分かります。

作成されるIAMロール

マネジメントコンソールからLog Alarmを作成すると、以下の2つのIAMロールが自動作成されます。

ロール 用途
Log-Alarm-execute-query-* スケジュールクエリの実行用。logs.amazonaws.comが引き受ける
Log-Alarm-include-query-results-in-action-* 通知にログ行を含める用。cloudwatch.amazonaws.comが引き受ける

CLIで作成する場合は手動でIAMロールを用意する必要がありますが、コンソールならボタン1つで作成してくれます。

利用時の注意点

  1. 作成直後は「データ不足(INSUFFICIENT_DATA)」状態から始まる。最初のスケジュールクエリが実行されるまで待つ
  2. 評価頻度の最小は1分、最大は24時間。検証時は5分がちょうど良い
  3. 対応リージョン: 全商用リージョン(中東(UAE)、中東(バーレーン)を除く)
  4. コンソール、AWS CLI、AWS CloudFormation、AWS SDKで作成可能
  5. 自動作成されたIAMロールは削除・編集しないこと(アラームが動作しなくなる)

コスト

項目 コスト
Log Alarm アラーム1つあたり$0.10/月(標準アラームと同じ)
スケジュールクエリ Logs Insightsのクエリスキャン量に応じた通常料金
SNS通知 Eメール通知は無料(1,000件/月まで)
Lambda(検証用) 無料利用枠内

メトリクスフィルター方式と比較して、カスタムメトリクスの料金($0.30/月/メトリクス)が不要になります。

まとめ

  • Log Alarmはログクエリから直接アラームを作成できる。メトリクスフィルター不要
  • マネジメントコンソールからIAMロール作成含めて全てGUIで完結する
  • 通知メールにアラームを発火させたログ行が含まれる。原因特定が即座にできる
  • 作成から発火まで約10分(評価頻度5分の場合)
  • 従来のメトリクスフィルター方式より手順が少なく、カスタムメトリクス料金も不要

「ログにERRORが出たら通知してほしい」という要件なら、今後はLog Alarm一択です。ぜひ試してみてください!

CLIで作成する場合

マネジメントコンソールを使わずCLIで作成する場合は put-log-alarm コマンドを使用します。

aws cloudwatch put-log-alarm \
    --alarm-name "lambda-error-log-alarm" \
    --comparison-operator GreaterThanThreshold \
    --threshold 0 \
    --query-results-to-evaluate 1 \
    --query-results-to-alarm 1 \
    --treat-missing-data notBreaching \
    --alarm-actions "arn:aws:sns:ap-northeast-1:<アカウントID>:cloudwatch-log-alarm" \
    --scheduled-query-configuration '{
        "QueryString": "fields @timestamp, @message | filter @message like /ERROR/",
        "LogGroupIdentifiers": ["/aws/lambda/cwlogs-tag-enrichment-test"],
        "ScheduledQueryRoleARN": "arn:aws:iam::<アカウントID>:role/CWLogsScheduledQueryRole",
        "AggregationExpression": "count(*)",
        "ScheduleConfiguration": {
            "ScheduleExpression": "rate(5 minutes)",
            "StartTimeOffset": 300
        }
    }' \
    --region ap-northeast-1

CLIの場合はIAMロールを事前に作成する必要があります。詳細は公式ドキュメントを参照してください。

関連情報