CloudWatch Logs に保存したログに特定の文言が出力されていたら通知する方法を調べていたら、CloudWatch Logs のサブスクリプションフィルタという機能を使えば実現できることが分かったので、メモとして残しておきたいと思います。
構成
構成としては、CloudWatch Logs のサブスクリプションフィルタという機能を使い、サブスクリプションフィルタで検知したログの内容を Lambda に送り、Lambda から SNS トピックにパブリッシュするという構成になっています。
ロググループごとに、最大2つのサブスクリプションフィルタを設定することができるようです。
また、今回は、Lambda に送っていますが、Amazon Kinesis や Amazon KinesisData Firehose などへ送ることもできるようです。
サブスクリプションを使用したログデータのリアルタイム処理 - Amazon CloudWatch Logs
構築
AWS CDK(v2) を使って構築を行います。
CDK コード一式は こちら から取得できますので、必要に応じてご利用ください。
デプロイすると、「SNSトピックとサブスクリプション」「Lambda」「サブスクリプションフィルタ」が作成されます。
サブスクリプションフィルタを設定する CloudWatch ロググループは、CDK で作成するのではなく(別の手段で作成した)既存のモノを使用するようにしています。
もしも、CDK で新規作成する場合は、以下のようなコードになります。
const logGroupNew = new LogGroup(this, 'SubscriptionFilterLogGroup', {
logGroupName: 'your-log-group-name',
retention: RetentionDays.THREE_MONTHS
})
今回はログデータに「Start」「START」「start」いずれかの文言が出力されていたら、通知が上がるように設定しています。
new SubscriptionFilter(this, 'LogSubscriptionFilter', {
logGroup,
destination: new LambdaDestination(logProcessingFunction),
filterPattern: FilterPattern.anyTerm('Start', 'START', 'start')
});
デプロイ
cdk deploy
コマンドを実行する際に、-c
オプションを使って、「通知メッセージを受けるメールアドレス」と「サブスクリプションフィルタを設定する(既存の)ロググループ名」を指定します。
cdk deploy -c notification_email="<your-mail-address>" -c log_group_name="<your-log-group>"
-c
オプションについてはこちらの AWS 公式ページに記載があります。
Get a value from a context variable - AWS Cloud Development Kit (AWS CDK) v2 (amazon.com)
動作確認
デプロイが完了すると、おなじみの SNS サブスクリプションの確認メールが届くので、Confirm subscription
をクリックします。
サブスクリプションフィルタを設定したロググループ に、「Start」「START」「start」のいずれかの文言を含むログが出力されると、指定したメールアドレス宛に通知メッセージが届きます。
後始末
後始末は cdk destroy
コマンドで行います。
デプロイ時と同じ様に、-c
を付与して実行します。
cdk destroy -c notification_email="<your-mail-address>" -c log_group_name="<your-log-group>"
参考ページ
今回の記事を書くにあたって以下のページを参考にしました。