CloudWatch エージェントが Windows イベントログのフィルタに対応したので試してみた

CloudWatch エージェントが Windows イベントログのフィルタに対応したので試してみた

CloudWatch エージェントが Windows イベントログのフィルタに対応しました。 不要なログ転送を減らし、コスト削減と監視効率の向上が期待できます。
2025.10.29

こんにちは。オペレーション部のShiinaです。

はじめに

CloudWatch エージェントで Windows イベントログを収集していると、本当に必要なイベントだけ抽出したいと感じたことはありませんか?
先日のアップデートで、CloudWatch エージェントが Windows イベントログのフィルタ機能に対応し、メッセージ内容を正規表現で柔軟に絞り込めるようになりました。
早速試してみましたので、設定例や動作結果を紹介します。

アップデート内容

CloudWatch エージェントで Windows イベントログをフィルタリングすることが可能になりました。
これにより、ログを効果的に絞り込み、CloudWatch Logs にプッシュできます。
従来のevent_levelsevent_idsオプションと組み合わせることで、より柔軟かつ効率的なフィルタリングが可能になります。
必要なログのみを CloudWatch エージェントで収集できるため、ログ転送量とコスト削減にも貢献します。

https://aws.amazon.com/about-aws/whats-new/2025/10/amazon-cloudwatch-agent-windows-event-log-filters/

windows_events セクションに filters オプション機能[1]が追加されていることが確認できます。
フィルタには RE2 Syntax [2]の正規表現文字列を利用します。
https://github.com/aws/amazon-cloudwatch-agent/releases/tag/v1.300059.0

やってみた

前提

  • CloudWatch Agent インストール済み
  • CloudWatch にログを書き込むために必要なアクセス許可を付与されていること

1. バージョン確認

以下のコマンドで現在のバージョンを確認します。

& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -m ec2 -a status
{
  "status": "running",
  "starttime": "2025-10-28T16:05:29",
  "configstatus": "configured",
  "version": "1.300060.0b1248"
}

2. エージェントの設定

Windows イベントログフィルタを行うためのエージェント設定ファイル用意します。

今回は動作の確認として、下記のエージェント設定ファイル(config.json)を利用しました。

config.json
{
	"logs": {
		"logs_collected": {
			"windows_events": {
				"collect_list": [
					{
						"event_name": "Application",
						"filters": [
							{
								"type": "include",
								"expression": ".*MyApp.*"
							}
						],
						"log_group_name": "TestLog1",
						"log_stream_name": "{instance_id}"
					},
					{
						"event_ids": [2001],
						"event_levels": ["WARNING"],
						"event_name": "Application",
						"filters": [
							{
								"type": "include",                                
								"expression": ".*Request timed out.*"
							},
							{
								"type": "exclude",
								"expression": ".*fallback.*"
							}
						],
						"log_group_name": "TestLog2",
						"log_stream_name": "{instance_id}"
					},
                    {
						"event_levels": ["ERROR"],
						"event_name": "Application",
						"filters": [
							{
								"type": "include",                                
								"expression": "Database.*failed|Authentication.*|login.*"
							}
						],
						"log_group_name": "TestLog3",
						"log_stream_name": "{instance_id}"
					}                    
				]
			}
		}
	}
}

3. エージェント設定ファイルの反映

用意したエージェント設定ファイルを指定して CloudWatch エージェントの起動を行います。

& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:"C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json"

ユースケース1

シンプルに、ログメッセージの中にMyAppが含まれているログのみをフィルタしてみます。
イベントログ条件
なし
メッセージフィルタ条件(正規表現)
含める:.*MyApp.*

定義例

					{
						"event_name": "Application",
						"filters": [
							{
								"type": "include",
								"expression": ".*MyApp.*"
							}
						],
						"log_group_name": "TestLog1",
						"log_stream_name": "{instance_id}"
					},

メッセージパターン
フィルタ条件に一致:MyApp configuration file not found
フィルタ条件に一致しない:Session timeout detected

擬似イベントログ発行

New-EventLog -Source "TestLog1" -LogName "Application" 

Write-EventLog -LogName "Application" -Source "TestLog1" -EventID 1001 -EntryType Information -Message "MyApp configuration file not found"

Write-EventLog -LogName "Application" -Source "TestLog1" -EventID 1002 -EntryType Information -Message "Session timeout detected"

イベントログ確認
イベントログが発行されていることが確認できます。
1-a

1-b

CloudWatch Logs ロググループ確認
フィルタ条件に一致したMyApp configuration file not foundが収集されていることを確認しました。
一方、条件に一致しないSession timeout detectedは収集対象外であることを確認できます。
1-1-1

ユースケース2

イベント ID とレベルの条件を組み合わせてフィルタを行ってみます。
同じイベント ID やレベルであっても、メッセージ内容によって重大度が異なる場合に、重大度の高いログのみを抽出するといった用途に活用できます。

イベントログ条件
イベントID:2001
レベル:WARNING

メッセージフィルタ条件(正規表現)
含める:.*Request timed out.*
含めない:.*fallback.*

定義例

					{
						"event_ids": [2001],
						"event_levels": ["WARNING"],
						"event_name": "Application",
						"filters": [
							{
								"type": "include",                                
								"expression": ".*Request timed out.*"
							},
							{
								"type": "exclude",
								"expression": ".*fallback.*"
							}
						],
						"log_group_name": "TestLog2",
						"log_stream_name": "{instance_id}"
					},

メッセージパターン
含めるフィルタ条件に一致:Request timed out after 30 seconds waiting for database response
含めないフィルタ条件に一致:Connection pool threshold exceeded. Using fallback database

擬似イベントログ発行

New-EventLog -Source "TestLog2" -LogName "Application" 

Write-EventLog -LogName "Application" -Source "TestLog2" -EventID 2001 -EntryType Warning -Message "Request timed out after 30 seconds waiting for database response"

Write-EventLog -LogName "Application" -Source "TestLog2" -EventID 2001 -EntryType Warning -Message "Connection pool threshold exceeded. Using fallback database"

イベントログ確認
イベントログが発行されていることが確認できます。
両方ともイベントID 2001、レベルが警告となっています。
2-a

2-b

CloudWatch Logs ロググループ確認
含める条件に一致したRequest timed out after 30 seconds waiting for database responseが収集されていることを確認しました。
一方、含めないフィルタ条件に一致したConnection pool threshold exceeded. Using fallback databaseは収集対象外であることを確認できます。
2-1-1

ユースケース3

複数の条件でログをフィルタし、特定の重大なイベントのみを抽出してみます。
ログメッセージの中から重要なキーワードを指定して、システム障害や認証エラーなどの特定イベントだけを対象にしたい場合などに活用できます。
イベントログ条件
レベル:ERROR

メッセージフィルタ条件(正規表現)
含める:Database.*failed|Authentication.*|login.*

これは3つのパターンの OR 条件です。

  • 条件1:「Database」で始まり、続いて(0文字以上の)任意の文字があり、最後に「failed」という単語が出てくる
  • 条件2:「Authentication」で始まり、そのあと任意の文字が続く
  • 条件3:「login」で始まり、そのあと任意の文字が続く

定義例

                    {
						"event_levels": ["ERROR"],
						"event_name": "Application",
						"filters": [
							{
								"type": "include",                                
								"expression": "Database.*failed|Authentication.*|login.*"
							}
						],
						"log_group_name": "TestLog3",
						"log_stream_name": "{instance_id}"
					}     

擬似イベントログ発行

New-EventLog -Source "TestLog3" -LogName "Application" 

Write-EventLog -LogName "Application" -Source "TestLog3" -EventID 3001 -EntryType Error -Message "Database connection failed"

Write-EventLog -LogName "Application" -Source "TestLog3" -EventID 3002 -EntryType Error -Message "Authentication error: invalid token"

Write-EventLog -LogName "Application" -Source "TestLog3" -EventID 3003 -EntryType Error -Message "login error: wrong password"

Write-EventLog -LogName "Application" -Source "TestLog3" -EventID 3004 -EntryType Error -Message "Cannot connect to database server"

イベントログ確認
イベントログが発行されていることが確認できます。
3-a

3-b

3-c

3-d

CloudWatch Logs ロググループ確認

条件1〜3に一致する以下のメッセージが収集されていることを確認しました。

  • Database connection failed
  • Authentication error: invalid token
  • login error: wrong password
    一方で、いずれの条件にも一致しないCannot connect to database serverは収集対象外であることを確認できます。
    3-2

日本語にも対応

正規表現って英語だけかな?と思いきや、ちゃんと日本語にも対応しています。
.*テスト.* のように書けば、テストメッセージといった日本語ログも問題なくフィルタリングできます。
日本語ログを扱う環境でも安心して利用できます。
ex-a

ex-b

ex-1

ウィザードにも対応

エージェント設定ファイルウィザード (amazon-cloudwatch-agent-config-wizard)を利用してエージェント設定ファイルを生成できます。
こちらでもイベントログのフィルタに対応しており、質問が追加されていました。
ウィザード経由の設定でも対応が行えます。

Do you want to add regex filters to include/exclude specific events?
1. yes
2. no
default choice: [1]:
1
Filter type:
1. Include (events matching regex)
2. Exclude (events matching regex)
default choice: [1]:

注意事項

  • CloudWatch エージェントでは正規表現の検証は行われません。適用前に十分なテストを実施してください。
  • 評価時間に制限はないため、複雑な正規表現を使用するとパフォーマンスに影響を与える可能性があります。

よくあるエラー

正規表現の構文誤り
正規表現の構文誤りがあると、下記のようなエラーが発生して CloudWatch エージェントの起動に失敗します。

[Under path : /logs/logs_collected/windows_events/collect_list/filters | Error : Filter expression map[expression:*Request timed out.* type:include] is invalid]
2025/10/29 14:11:23 E! config-translator process exited with non-zero status: 1

未対応バージョンの利用
未対応バージョンでは下記のようなエラーが発生して CloudWatch エージェントの起動に失敗します。

2025/10/29 05:33:24 E! Invalid Json input schema.
2025/10/29 05:33:24 E! Invalid Json input schema.
2025/10/29 05:33:24 Under path : /logs/logs_collected/windows_events/collect_list/0 | Error : event_levels is required
2025/10/29 05:33:24 Under path : /logs/logs_collected/windows_events/collect_list/0 | Error : Additional property filters is not allowed
2025/10/29 05:33:24 Under path : /logs/logs_collected/windows_events/collect_list/1 | Error : Additional property event_ids is not allowed
2025/10/29 05:33:24 Under path : /logs/logs_collected/windows_events/collect_list/1 | Error : Additional property filters is not allowed
2025/10/29 05:33:24 Under path : /logs/logs_collected/windows_events/collect_list/2 | Error : Additional property filters is not allowed
2025/10/29 05:33:24 Configuration validation first phase failed. Agent version: 1.0. Verify the JSON input is only using features supported by this version.

まとめ

従来はログファイルに対するフィルタのみが提供されていましたが、今回のアップデートで Windows イベントログにもフィルタ機能が対応しました。
CloudWatch エージェント側で必要なイベントログだけを選別できるようになったことで不要なログ転送を減らし、コスト削減と監視効率の向上が可能になります。
コスト効率の良い構成を組みたい方にとって、かなり便利なアップデートです。

本記事が参考になれば幸いです。

脚注
  1. https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html ↩︎

  2. https://github.com/google/re2/wiki/syntax ↩︎

この記事をシェアする

FacebookHatena blogX

関連記事