CloudWatch Logsのメトリクスフィルタリングを便利に使う

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

技術一課の杉村です。CloudWatch Logs を使っていますか?知っている人には「いまさらなかよー」な情報ですが、小技のご紹介です。

メトリクスフィルタリング機能をうまく使うことで、ログ監視、APIコールの監視、などなどを行うことができます。

メトリクスフィルタリング??

CloudWatch Logs のロググループに出力された特定の文字列をフィルタでひっかけて、その出現数を CloudWatch の一種のカスタムメトリクスとしてカウントすることができます。 一定の出現数を超えたら、SNS 通知を飛ばすことができます。

例1. アプリケーションのログ監視

最もシンプルな使い方です。 Lambda 関数のログは通常、CloudWatch Logs のロググループに出力すると思います。

そのロググループに例えば "ERROR" という文字列でメトリクスフィルタを作成します。 そのような文字列が出現したら、SNS で通知を投げるように設定が可能です。

もちろん「〇分間の合計値が×を超えたら発動」のような設定方法も可能です。

EC2 にあるアプリケーションから CloudWatch エージェントを使って CloudWatch Logs にログを送信し、それに対してメトリクスフィルタを設定することも当然できますので、Zabbixなどを使わなくても独自のアプリケーションのログ監視が可能です。

例2. AWSのAPIコールを監視する

AWS 利用者の IAM 権限は厳重に管理すべきものですが、意図せぬ API コールが行われていないか監視したい、またオペミスなどを監視するために特定のオペレーションが行われたら通知が欲しい、などのニーズがあるかもしれません。 AWS の API コールは CloudTrail で記録することが可能ですが CloudWatch Logs と組み合わせることで特定の API コールを監視することが可能です。

CloudTrail のログは通常、S3バケットに出力されますが、同時に CloudWatch Logs にも出力することが可能です。 CloudWatch Logs にイベントを送信する

そして出力先に指定したロググループに対して、メトリクスフィルタを指定すればよいのです。

なおメトリクスフィルタでは、構文を使って記述することでけっこう複雑なフィルタリングが可能です。

例 特定のIAM Role以外から発生したとあるAPIコールをフィルタ

{ $.userIdentity.arn != "arn:aws:sts::<YourAWSAccountID>:assumed-role/<IAMRoleName>/*" && $.eventName = "<APIEventName>" }

CloudTrail のレコードの属性名でフィルタすることで「特定のIAM User以外から○○をやられたくない」「特定の時間以外で××が発生するのはおかしいから、監視したい」という要望を実現できますね。

下記のような画面でフィルタを定義するのですが、しっかりとお目当てのレコードが検出されるか、テストすることもできます。

ちなみに、検知すると以下のようなメールが発信されます。

You are receiving this email because your Amazon CloudWatch Alarm "<CloudWatch Alarm名>" in the Asia Pacific (Tokyo) region has entered the ALARM state, because "Threshold Crossed: 1 datapoint [1.0 (02/04/19 07:30:00)] was greater than or equal to the threshold (1.0)." at "Tuesday 02 April, 2019 07:35:22 UTC". View this alarm in the AWS Management Console: https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#s=Alarms&alarm=<CloudWatch Alarm名> Alarm Details: - Name: <CloudWatch Alarm名> - Description: <Description> - State Change: INSUFFICIENT_DATA -> ALARM - Reason for State Change: Threshold Crossed: 1 datapoint [1.0 (02/04/19 07:30:00)] was greater than or equal to the threshold (1.0). - Timestamp: Tuesday 02 April, 2019 07:35:22 UTC - AWS Account: <AWSアカウントID> Threshold: - The alarm is in the ALARM state when the metric is GreaterThanOrEqualToThreshold 1.0 for 300 seconds. Monitored Metric: - MetricNamespace: LogMetrics - MetricName: <CloudWatchメトリクス名> - Dimensions:
- Period: 300 seconds - Statistic: Sum - Unit: not specified State Change Actions: - OK: - ALARM: [arn:aws:sns:ap-northeast-1:<AWSアカウントID>:<SNSトピック名>] - INSUFFICIENT_DATA:

以上です。

杉村 勇馬 (記事一覧)

サーバーワークス → 株式会社G-gen 執行役員CTO

2021 Japan APN Ambassadors / 2021 APN All AWS Certifications Engineers

マルチAWSアカウント管理運用やネットワーク関係のAWSサービスに関するブログ記事を過去に執筆。

2021年09月から株式会社G-genに出向、Google Cloud(GCP)が専門に。G-genでもGoogle Cloud (GCP) の技術ブログを執筆中。