Windowsサーバーのプロセス監視を無理やりCloudWatchLogsで実装してみた

どうも、タクローです。
初投稿となりドキドキしています。今後ちょくちょくアウトプットしていきたいと思います。

#はじめに
　cloudwatchで簡単に監視できるものが増え、あとはプロセス監視ぐらいできれば社内サーバーのほぼすべてをcloudwatchに入れ替えれそう・・・でもプロセス監視のカスタムメトリクスも見当たらない(Windows)。ということで無理やりやってみました。
今回は「メモ帳が起動していなかったら、アラームを上げる」仕組みを作ってみます。

#実行環境
　OS：Windows 2012
　インスタンスタイプ：t2.micro
　IAMrole：CloudWatch-FullAccess, CloudWatchLogs-FullAccess, EC2-FullAccess　
　※対象のec2インスタンスにロールを紐付けています。

#プロセス監視バッチの生成
　「タスクリストを確認して落ちていたら通報をあげる」だけのシンプルなバッチを作成。

```lang:process_chek.bat
@ECHO OFF

TASKLIST | FIND "notepad.exe" > NUL
IF NOT ERRORLEVEL 1  (
	GOTO END
) ELSE (
	GOTO NOTENG
)

:NOTENG
    set yyyy=%date:~0,4%
    set mm=%date:~5,2%
    set dd=%date:~8,2%
    set filename=%yyyy%%mm%%dd%
	ECHO %DATE% %TIME% notepadが起動していません >> "C:\Program Files\Amazon\cloudwatch\error\error_%filename%.log"
	GOTO END
:END
EXIT
```
上記のバッチファイルを適当な場所に格納し、タスクスケジューラで常駐化させます。
(お手軽監視なので、タスクスケジューラ自体がコケるケースなどは検討しません）
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/4b9645f6-b63d-1731-0dfb-cf423c538f42.png)

トリガーを時間起動（5分に1回無制限に変更）
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/f6d52072-8a00-2b9d-c733-733192db2c74.png)

操作は先ほど作ったバッチを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/92591acd-8a08-4ba1-3762-4fd9e8bb0ecf.png)

今回はテストということで管理者権限で実行。


#CloudWatch-Logsの設定
##基本設定
　次はいよいよCloudWatch-Logsの設定です。
　Windows2012サーバーにデフォルトで入っているec2configのバージョンは2.2.8となります。
　詳細を設定ファイル(json形式)で編集できるのがver.2.2.10以降なので、ec2configを[ダウンロード](http://aws.amazon.com/developertools/5562082477397515)する。
　ZIPファイルダウンロード＞解凍・展開＞インストール

##CloudWatchLogsの有効化
「C:\Program Files\Amazon\Ec2ConfigService」の中に**Ec2ConfigServiveSetting**が入っていますので、これを起動。
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/e1b6ea7c-a042-8d3d-9649-b78760cb0b5f.png)


起動し、CloudWatch Logsにチェックを入れて、OKボタンを押下。
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/bb337c5a-3f04-fc3c-fcbe-6276dbf3daf2.png)



##JSONファイルの編集
細かいCloudWatchLogsの設定については設定ファイル(JSON形式)を編集します。
　　■場所　C:\Program Files\Amazon\Ec2ConfigService\Settings
　　■ファイル名　AWS.EC2.Windows.CloudWatch.json

今回の変更箇所は3箇所

```lang:カスタムログの設定
           {
                "Id": "Processes",
                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogDirectoryPath": "C:\\Program Files\\Amazon\\cloudwatch\\error\\",
                    "TimestampFormat": "HH:mm:ss yyyy/MM/dd",
                    "Encoding": "shift_jis",
                    "Filter": "",
                    "CultureName": "ja-JP",
                    "TimeZoneKind": "Local"
                }
            }
```
もともとはId:Customlogになっていたと思います。
わかりやすい【ID】に変更し、【LogDirectoryPath】に通報が上がってくるファイルのパスを、【TimestampFormat】を変更し、【Encoding】をshift_jisにします。(日本語が入らない場合はUTF-8でも可)
【CultureName】も日本に変更し、【TimeZoneKind】もUTCではなく、localに変更します。


```lang:cloudwatchlogsの設定
  {
                "Id": "CloudWatchLogs",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "ap-northeast-1",
                    "LogGroup": "test",
                    "LogStream": "test-process"
                }
            }
```
ここは【Region】を希望のリージョンに変更
インスタンスにロールを紐付けていない場合は【AccessKey】と【SecretKey】を記入の必要がありますが、
今回はロールを紐付けているため、空白のまま。
【LogGroup】と【LogStream】にはそれぞれの名前を記入します。(CloudWatchLogsの画面で表示される名前となります)


```lang:Flowsの設定
        "Flows": {
           "Flows":
            [
                "(Processes),CloudWatchLogs"
            ]
        }
```
ここでは収集したデータの流れを設定します。
今回はID：Processesで取得したデータをCloudWatchLogsで設定したとおりに転送しますので、
上記のような内容となります。

##ec2configの再起動
*ここで注意*
Ec2Configサービスを再起動させて初めて変更が適用されるので、再起動を実施。
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/5a02ca0f-7dd9-efc6-dd80-234ff5b8eedb.png)


#結果とアラート設定
メモ帳が動いていない状態でバッチを稼働すると、無事にCloudWatchLogsに新しい【LogGroup】と【LogStream】ができていることが確認できました。
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/f0ff8b99-e48e-832a-565a-941d20db970e.png)

あとは、LogGroupの「メトリックスの作成」ボタンをからメトリックスフィルタを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/112767/acb5a39f-c657-3f8d-0a4d-e5c93b212d89.png)
【フィルタパターン】には検知したい文言を設定します。システムログなどを監視するなら「error」などを入れてもいいかもしれません。
”テストするログデータの選択”に監視したい【LogStream】を選択し、パターンのテストを実施すると結果として意図した内容になっているかを確認できます。

あとはメトリックス名などを設定すれば、一つのカスタムメトリクスとして登録できます。
対象のメトリクスにアラーム設定を入れれば完了です。

#終わりに
　タスクスケジューラで監視するなら、メールの検知もタスクスケジューラでいいんじゃない？という話もあるかもしれませんが、CloudWatchのアラームに検知を一本化したいなどの要望には答えられるかと。
どなたかもっといい方法をご存知の方がおられれば、ぜひご教示ください！ｗ


#参考にしたサイト
　AWSドキュメント
（http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2-configuration-cwl.html#create_json_file）
　WindowsサーバーのCloudWatch-Logs設定について
　(http://iga-ninja.hatenablog.com/entry/2014/10/22/205350)
　タスクスケジューラによるプロセス監視の方法
　(http://takaq1.plala.jp/contents/windows/proces_test/)