目的

以前紹介したAWSでLambdaを使ってみるの応用編の続きということで、lambdaのログをCloudWatchで監視して、特定の文字列が出力されたらメールを送るように設定します。

手順

Lambdaの設定

特定のパラメーターを送るとエラーを返すLambda関数を作成します。

  1. こちらを参照して、Lambda関数を作成します。

  2. 関数を以下のように作成します。

    exports.handler = (event, context, callback) => {
        let name = "lambda";
        if (event.queryStringParameters !== null) {
            name = event.queryStringParameters.name;
        }
        if (name === "hoge") {
            var error = new Error("hoge is wrong");
            callback(error);
        }
        let response = {
            statusCode: 200,
            headers: {
                "x-custom-header": "my custom header value"
            },
            body: "hello " + name
        };
        context.succeed(response);
    };
    

    nameにhogeというパラメーターが送られてくると、エラーを返します。
    この時、ログには”hoge is wrong”と出力されるので、後ほどのCloudWatchの設定でこの文字列を拾います。

  3. 下記例のように、nameにhogeを指定してcurlでリクエストを投げると、”Internal server error”が返却されることを確認します。

    $ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/hello/hello-name?name=hoge
    {"message": "Internal server error"}
    

CloudWatchの設定

作成したLambda関数のログを監視して、特定文字列が見つかった場合にアラートを上げてメール通知するよう設定します。

  1. CloudWatchのコンソールにアクセスします。
    CloudWatchのコンソールにアクセスします。

  2. 左のメニューから「ログ」を選択して、lambdaで作成した関数のロググループにチェックを入れて「メトリクスフィルタの作成」をクリックします。
    メトリクスフィルタを作成します。

  3. ログメトリクスフィルタを定義します。フィルタパターンにアラートを上げるために検出する文字列を入力します。今回は、Lambdaで出力するよう設定した”hoge is wrong”です。
    ログメトリクスフィルタを定義します。

  4. メトリクスフィルタを作成し、定義を割り当てます。ここではメトリクス名を入力して「フィルタの作成」をクリックします。
    メトリクスフィルタを作成します。

  5. メトリクスが作成できたら、メトリクスにアラームを設定します。「アラームを作成」をクリックしてアラームの設定画面を開きます。
    アラームの作成画面へ移動します。

  6. アラームを設定します。1分間隔で監視を実行して、5分間の内1回でもメトリクスに引っかかったらメールが送信されるよう設定します。データポイントとは設定した間隔の中のある一点で、評価期間は間隔xデータポイント数です。評価機関の中でメトリクスに引っかかる閾値を設定しています。
    アラームを作成します。

動作確認

curlで以下のようなリクエストを送信します。

curl https://xxxxxx-api.ap-northeast-1.amazonaws.com/hello/hello-name?name=hoge

CloudWatchのコンソール画面で、以下のようにアラームが赤くマークされます。
アラームが上がっていることを確認します。

また、以下のようなタイトルのメールが送られてきています。

ALARM: "hoge-alarm" in Asia Pacific (Tokyo)

まとめ

今回は、CloudWatchでLambda関数のログを監視して、特定の文字列が出力された場合にメールを飛ばすための設定方法について説明しました。
今まではこれを普通にやろうとすると手間がかかっていましたが、AWSを使うとものの数十分で実現できてしまいます。

参照

公式ドキュメント https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/US_SetupSNS.html