CloudWatchサブスクリプションフィルターで特定ログのみメール通知する方法

はじめに

CloudWatchログに出力されるログの中で、特定の条件(例えば、通知するフラグ=true)を満たした場合のみ、SNSを通じて担当者にメール通知を送る仕組みをやってみました。

目次

今回の構成

CloudwatchLogに出力されたログの中から、条件に一致したログを取得して、SNSを通じてメール通知する。

やってみよう!

では、やってみましょう!

前提条件

  • AWS CLIが設定済み
  • 適切なIAM権限を持つユーザー
  • メール通知を受信するメールアドレス

Step 1: SNSトピックの作成

まず、メール通知用のSNSトピックを作成します。

注意: サブスクライブ後、メールで確認リンクが送信されるので、必ずクリックして確認しましょう。

SNSトピック確認

Step 2: IAMロールの作成

Lambda関数用のIAMロール:log-notification-role を作成します。
このロールには、下記ポリシーをアタッチします。

権限ポリシー (log-notification-policy.json)

  • logs:CreateLogGroup:CloudWatchにロググループを作成する権限
  • logs:CreateLogStream:ロググループ内にログストリームを作成する権限
  • logs:PutLogEvents:ログストリームにログイベント(実際のログメッセージ)を書き込む権限
  • sns:Publish:指定されたSNSトピックにメッセージを発行する権限

環境変数から、通知メールのSUBJECT、SNSトピックを取得しています。

Step 3: 通知機能Lambda関数の作成

ログを解析してSNSを通じてメール通知を送信するLambda関数を作成します。

Lambda関数コード (Python)

Step 4: CloudWatchログの準備

テスト用のログを出力するサンプルアプリケーションを作成します。

Step 5: サブスクリプションフィルターの設定

Lambda関数にCloudWatch Logsからの実行権限を付与

Lambda関数のlog-notification-processorにCloudWatch Logsのトリガーが設定されます。

サブスクリプションフィルター作成

ロググループ:/aws/lambda/log-sample-app に条件「notification_flag = true」に一致するログのみをLambda関数に送信するフィルターが設定されます。

Step 6: 動作テスト

サンプルアプリケーションを実行して動作確認!

  1. AWSコンソールでCloudWatch Logsを開く
  2. ロググループ /aws/lambda/sample-app を確認
  3. ログが出力されていることを確認

メール通知の確認

notification_flag が true のログのみメールに記載されて通知されました。

サブスクリプションフィルター vs CloudWatchアラーム

ログ監視には2つのアプローチがあります。要件に応じて適切な方式を選択することが必要です。

アーキテクチャ比較

サブスクリプションフィルター方式:

CloudWatchアラーム方式:

機能比較表

項目 サブスクリプションフィルター CloudWatchアラーム
リアルタイム性 即座(秒単位) 遅延あり(分単位)
通知内容 個別ログの詳細情報 集計情報のみ
メール本文 カスタマイズ可能 定型メッセージのみ
ログ詳細取得 ○(ロググループ、ストリーム、メッセージ等) ×(アラーム情報のみ)
設定の複雑さ 高(Lambda関数が必要) 低(設定のみ)
コスト Lambda実行料金 + SNS メトリクスフィルター + アラーム + SNS
カスタマイズ性 高(任意の処理可能) 低(閾値ベースのみ)
通知頻度制御 Lambda内で実装可能 アラーム設定で制御
複数条件判定 Lambda内で柔軟に実装 複数アラームが必要
障害時の影響 Lambda障害で通知停止 CloudWatchサービス依存

まとめ

CloudWatchサブスクリプションフィルターを使用することで、以下が出来ました。

  • ログの条件付き監視(notification_flag=trueのみ)
  • リアルタイムでのメール通知
  • 日本時間での通知
  • 構造化されたメール本文

この仕組みにより、重要なログのみを効率的に監視し、迅速な対応が可能になります。

応用例

  • エラーレベル別の通知先変更
  • Slackなど他の通知チャネルとの連携
  • ログの集計・分析機能の追加
  • 通知頻度の制御(同じエラーの重複通知防止)

注意点

  • Lambda関数の実行時間とコストを考慮
  • SNSの送信制限に注意
  • ログの量が多い場合はフィルターパターンの最適化が重要
  • セキュリティ上、機密情報をログに含めないよう注意

投稿者プロフィール

YoshiSaaaan
2023/1にスカイアーチネットワークスにJoin
AWSを日々勉強中