Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

CloudWatch Logs メトリクスフィルターのテスト方法

はじめに

CloudWatch Logs利用時のログ監視のテスト方法について、ときどき思い出す必要があるので備忘的に記しておこうかと思います。
EC2であればOSへログインし、loggerコマンドで監視対象文字列をログ出力させ、監視ツールが正常に異常検知するかというようなテストがあると思います。
上記のようなテストをCloudWatch Logs利用時はどのように行うか、という内容のまとめになります。

テスト環境作成

この後に記載する、テスト方法で利用するAWSリソースを作成します。
こちらも備忘的に記していますが、テスト方法の手順だけ確認したい方は、本項は読み飛ばしてください。
どのような環境を作成しているかというと、下記の例と同様に発生したログのイベント数をカウントさせるような環境です。

例: ログイベントのカウント - Amazon CloudWatch Logs

コマンドの引数、パラメーターの意味が気になる方はこちらをご参照ください。

logs — AWS CLI 2.11.15 Command Reference

①ロググループを作成します。

aws logs create-log-group --log-group-name /test-log-group \
--profile <プロファイル名>

②メトリクスアラームを作成します。
※xxx-actions箇所、SNSトピックは事前作成しておりますので、必要な場合は別途作成ください

aws cloudwatch put-metric-alarm \
--alarm-name 'test-alarm' \
--actions-enabled \
--ok-actions 'arn:aws:sns:ap-northeast-1:<AWSアカウント番号>:test' \
--alarm-actions 'arn:aws:sns:ap-northeast-1:<AWSアカウント番号>:test' \
--metric-name 'test-metric' \
--namespace 'FilterLogsCount' \
--statistic 'Maximum' \
--period 300 \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--threshold 0 \
--comparison-operator 'GreaterThanThreshold' \
--treat-missing-data 'notBreaching' \
--profile <プロファイル名>

③CloudWatch Logsのメトリクスフィルターを作成します。
ログlevelがERRORの時(--filter-pattern)に検知するように設定します。

aws logs put-metric-filter \
--log-group-name /test-log-group \
--filter-name test-filter \
--filter-pattern '{ $.level = "ERROR" }' \
--metric-transformations \
  metricName=test-metric,metricNamespace=FilterLogsCount,metricValue=1,unit=Count \
--profile <プロファイル名>

テスト方法

<事前作業>
環境を汚さないようにテスト用のログストリームを作成します。

aws logs create-log-stream \
--log-group-name /test-log-group \
--log-stream-name test-stream \
--profile <プロファイル名>

<本手順>
①まずはメトリクスフィルターに引っかけたいイベントを作成します。
ポイントとしてはtimestampがUNIX時間(ミリ秒数)であることです。
UNIX時間変換ツールやサイト等利用すると簡単に確認できます。
ファイル名:ERROR-event.json

[
 {
  "timestamp": 1679470239362,
  "message": "{\"message\":\"Test\",\"level\":\"ERROR\"}"
 }
]

②CloudWatch Logsにログイベントを投入します。

aws logs put-log-events \
--log-group-name /test-log-group \
--log-stream-name test-stream \
--log-events file://ERROR-event.json \
--profile <プロファイル名>

③検知確認
マネジメントコンソールのCloudWatch画面の履歴や、SNSトピックに登録されているメールが届いているかなどを確認して完了です。 検知確認

<事後作業>
事前作業で作成したログストリームを削除します。

aws logs delete-log-stream \
--log-group-name /test-log-group \
--log-stream-name test-stream \
--profile <プロファイル名>

最後に

メモ的な備忘でしたが、誰かのお役に立てばと思います。