LambdaでWebを監視して、CloudWatchにログ連携してアラートメールを出す


## 全体の流れ

大まなか流れは以下の感じでしょうか。

* Lambdaを書く（テストしてログの連携を確認する）
* CloudWatchのルール設定（Lambda関数が定期実行されるようにする）
* CloudWatchでメトリクス設定（ログ中のError文字列を検出する）
* CloudWatchでアラート設定（メールで通知する）

## 監視と通知の仕様

Lambda関数で特定のURLにリクエストを投げ、statusCodeが200ならOK、それ以外ならErrorとする。
Errorの場合はメールに通知する。

## Lambdaを書く

まず、Lambda関数を用意します。

### Webの監視コードを書く

webStatusCheckという名前で関数を作成します。

http/httpsモジュールは標準で使えるので、それを利用します。単に、リクエストを投げて、statusCodeを取得しているだけ。

```js:index.js
const https = require('http');

exports.handler = (event, context, callback) => {
    
    //URL
    var url = 'http://www.bluecode.jp/lambda/';
    
    const req = https.request(url,(response)=>{

        //statusCode取得
        var code = response.statusCode;
        
        if(code == 200){
            //OK
            console.log("OK " + code);
        }else{
            //Error
            console.log("Status Error " + code)
        }
    });
    
    //リクエスト自体がエラー
    req.on('error',(error)=>{
        console.log("Fatal Error "+error.message);
    });
    
    req.end();
    
};
```

>複雑なことをやりたければ、レスポンスをパースするなどして、もっと詳細なステータスを見ればよいでしょう。

### CloudWatchとの連携

console.log("")で出力するだけで、CloudWatchに連携されるので特に何もすることはありません。
[テスト]をして、ログがCloudWatchに出力されていることを確認しておきます（下記は正常と異常時のチェックをしています）。

<img width="1468" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/0f253538-609a-d1ca-34da-d48b5824e09b.png">

>なお、Lambdaのコードが変わると、ログのストリームが変更されるので注意が必要です。

## ルール・メトリクス・アラームの設定

### ルールの設定

では、まずルールの設定を行います。
先ほど作成したLambda関数を1分毎に実行するように設定します。

<img width="1342" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/5d046b39-6d80-718d-30fc-7f318ccd6756.png">

### メトリクスの設定

次にメトリクスの設定をします。
メトリクスはログに対して設定するため、ログのメニューから[メトリクスフィルタの作成]を選択して作成します。

<img width="1352" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/7e29d5b0-f8f4-8e84-a4ec-bdf877a2e16d.png">

ここではログに"Error"という文字列が含まれていたら反応するメトリクスを設定します。

<img width="1064" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/2b0e63ab-5e82-7d09-a724-11f5db648c11.png">

>正規表現などは利用できないようです。

### アラームの設定

メトリクスの作成途中で、アラートも設定します。

<img width="1108" alt="005.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/09d93dbc-035e-d902-c934-c26e763f74d9.png">

Errorが起こるとしきい値が1となるようなので、条件を >0 と設定し、欠落データの処理方法を[適正]とします。
更に間隔を1分間隔に、エラー発生時の通知先を設定します。

>メールは新規の場合、確認メールが送られるようなのでConfirmする必要があります。

<img width="1924" alt="006.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/71164363-852f-2328-ee42-403a0f67ef86.png">

設定が終われば監視がスタートします。

>最初は[不足」となっていますが、しばらく立つとOKになります（適正と設定したので）。

<img width="1138" alt="007.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/82b120ee-9512-5311-d1c3-46c27a0e7d04.png">

## アラームのテスト

一通り設定が完了したのでテストをしてみます。

監視先URLのファイルを削除してみます。
アラートが検出されました。

<img width="901" alt="008.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/b0664a81-16ac-1b4b-f22e-2f22afd9e98c.png">

メールも届きました。

<img width="809" alt="009.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/cc63985b-1a3a-ac87-19f6-2255c886fd5a.png">


障害が復旧した場合、自動的に元に戻るようです。

![010.png](https://qiita-image-store.s3.amazonaws.com/0/55188/fdb5a3de-3c82-6b9d-3549-bef3e1e78eba.png "010.png")

以上。