CloudWatchLogsを使ってWindowsServer2016からログ収集

##初めに
システムにおいてログ管理や収集は、円滑に運用を行う為にとても大事な部分です。
オンプレ環境では、ログサーバを使ってにログ取集を行うのが一般的ですが、AWSでは「CloudWatchLogs」サービスを利用してログ収集が可能な為、利用してみました。

#環境
- OS WinodwsServer2016
- インスタンス名 winsv2016

#やったこと
-  OS上での「CloudWatchLogs」の有効化やログ転送設定は「Systems Manager」の「RunCommand」を使用した。 
-  CloudWatchLogsへのログ転送は、ログ種別ごとに分けて転送した。

#Systems Managerの利用準備
まず「Systems Manager」を利用する為に、マネージドインスタンスの管理対象にする必要があります。

**■Systems Manager の前提条件**

- ロール作成
<br>
ec2インスタンスをマネージドインスタンスの管理対象にするには、適切なポリシーがアタッチされたロールをec2インスタンスに設定します。
すでにec2インスタンスにロールが設定されている場合は、そのロールに「AmazonEC2RoleforSSM」をアタッチすればOKです。
<br>
<br>
- インターネットアクセス
<br>
EC2 インスタンスで、アウトバウンドのインターネットアクセスが可能であることを確認します。インバウンドのインターネットアクセスは不要。
VPCエンドポイントを利用すれば、インターネットアクセスは不要であるが今回は割愛。
<br>
<br>
- SSMエージェント
<br>
Windows Server2016のAMIでは最初からインストールされていた。
<br>
<br>
**参考**
<br>https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-prereqs.html

**■ロール作成**
サービス > IAM > ロール > ロール作成

ロール名：ec2-role
     ※ロール名は任意、分かりやすい名前をつける。
ポリシー：AmazonEC2RoleforSSM

**■ecインスタンスへのロールの付与**
1.ec2インスタンス > 右クリック > IAMのロール割り当て/置換
![aws-cloudwatchlogs-winsv2016-1.png](https://qiita-image-store.s3.amazonaws.com/0/160993/0e4c9703-1ddb-7694-bb7b-8a182c1cb306.png)

2.先ほど作成したロールをプルダウンから選択 > 適用
![aws-cloudwatchlogs-winsv2016-2.png](https://qiita-image-store.s3.amazonaws.com/0/160993/031e8943-b158-1fe0-dd4f-8347e9689e83.png)

3.ここまで設定をすると、マネージドインスタンスに管理対象として「winsv2016」が表示されます。
![aws-cloudwatchlogs-winsv2016-3.png](https://qiita-image-store.s3.amazonaws.com/0/160993/1f2befdf-2632-6b0d-6b67-b7d331ef1b57.png)

##CloudWatch の JSON ファイル設定
ログ転送設定は、「json」or 「yaml」を利用できますが、今回は「json」での記述を選択しました。

公式のサンプルファイル
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/send_logs_to_cwl_gs.html

ロググループは対象インスタンス単位で、ログストリームはログ種別毎に転送するように設定しました。

**ポイントとなる部分のみ説明**

■ログ指定設定

アプリケーションログやシステムログを指定する部分。

```
 {
    "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
     "Id": "ApplicationEventLog",
     "Parameters": {
     "Levels": "7",
     "LogName": "Application"
     }
 },
```

- Levels<br>
転送するログレベルの指定はLevelsで行います。<br><br>
1 – エラーメッセージのみをアップロードします。<br>
2 – 警告メッセージのみをアップロードします。<br>
4 – 情報メッセージのみをアップロードします。<br>

全てのログを転送する場合は、合計値の7を設定する。



■転送先設定
CloudWatchLogsへの転送設定、ロググループ、ログストーム、リュージョンを設定する。
ログ種別毎にログストリームを分けたいので、CloudWatchLogsのIDを1～3作成して、各ログ種別名を記載した。

```
{
   "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
   "Id": "CloudWatchLogs1",
   "Parameters": {
   "AccessKey": "",
   "SecretKey": "",
   "LogGroup": "winsv2016",
   "LogStream": "Application",
   "Region": "ap-northeast-1"
   }
},
{
    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
    "Id": "CloudWatchLogs2",
    "Parameters": {
    "AccessKey": "",
    "SecretKey": "",
    "LogGroup": "winsv2016",
    "LogStream": "System",
    "Region": "ap-northeast-1"
    }
},
{
    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
    "Id": "CloudWatchLogs3",
    "Parameters": {
    "AccessKey": "",
    "SecretKey": "",
    "LogGroup": "winsv2016",
    "LogStream": "Security",
    "Region": "ap-northeast-1"
    }
}
```
- LogGroup<br>
ロググループ名を書く。
<br>
<br>
- LogStream<br>
ログストリーム名を書く。
<br>
<br>
- Region<br>
公式ドキュメントによると、Regionはインスタンスが実行されているのと同じリージョンに設定することをお勧めされたので、"ap-northeast-1"を指定した。



■転送設定
どこに転送するかのフロー制御設定。
ApplicationEventLogはCloudWatchLogs1へ転送する。
SystemEventLogはCloudWatchLogs2へ転送する。
以下割愛。

```
"Flows": {
   "Flows": [
      "ApplicationEventLog,CloudWatchLogs1",
      "SystemEventLog,CloudWatchLogs2",
      "SecurityEventLog,CloudWatchLogs3"
   ]
},
```

**作成したjsonファイル**

```
{
    "IsEnabled": true,
    "EngineConfiguration": {
        "Components": [
            {
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Id": "ApplicationEventLog",
                "Parameters": {
                "Levels": "7",
                "LogName": "Application"
                }
            },
            {
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Id": "SystemEventLog",
                "Parameters": {
                "Levels": "7",
                "LogName": "System"
                }
            },
            {
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Id": "SecurityEventLog",
                "Parameters": {
                "Levels": "7",
                "LogName": "Security"
                }
            },
            {
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Id": "CloudWatchLogs1",
                "Parameters": {
                "AccessKey": "",
                "SecretKey": "",
                "LogGroup": "winsv2016",
                "LogStream": "Application",
                "Region": "ap-northeast-1"
                }
            },
            {
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Id": "CloudWatchLogs2",
                "Parameters": {
                "AccessKey": "",
                "SecretKey": "",
                "LogGroup": "winsv2016",
                "LogStream": "System",
                "Region": "ap-northeast-1"
                }
            },
            {
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Id": "CloudWatchLogs3",
                "Parameters": {
                "AccessKey": "",
                "SecretKey": "",
                "LogGroup": "winsv2016",
                "LogStream": "Security",
                "Region": "ap-northeast-1"
                }
            }

        ],
        "Flows": {
            "Flows": [
                "ApplicationEventLog,CloudWatchLogs1",
                "SystemEventLog,CloudWatchLogs2",
                "SecurityEventLog,CloudWatchLogs3"
            ]
        },
        "PollInterval": "00:00:15"
    }
}
```

#OSへ設定ファイル転送
「RunCommand」を利用して先ほど作ったjsonファイルをOSに転送します。
それと同時にOS上の「CloudWatchLogs」機能を有効化します。

自分が大きく勘違いしてた部分の一つでもありますが、コマンドを送ったタイミングでログを取集してきて、定期的にログ収集をするためには、スケジュールを組んで定期的にコマンドを送る必要があると謎の勘違いしていましたが、一度OS上の「CloudWatchLogs」機能の有効化を行えば、OSでログが書き出された時点で「CloudWatchLogs」へログが転送される仕組みでした。

■設定
①コマンド実行を選択(青いボタン)
![aws-cloudwatchlogs-winsv2016-4.png](https://qiita-image-store.s3.amazonaws.com/0/160993/3e838ca4-8ebe-8d58-da9e-a029a9a7ad99.png)

②コマンドドキュメントの選択
　AWS-ConfigureCloudWatchにチェックをいれる。
![aws-cloudwatchlogs-winsv2016-5.png](https://qiita-image-store.s3.amazonaws.com/0/160993/78241550-be4c-fcda-9a58-0f8bfdd40771.png)

③対象とするマネージドインスタンスを選択する
![aws-cloudwatchlogs-winsv2016-6.png](https://qiita-image-store.s3.amazonaws.com/0/160993/36f77713-1624-ad17-0ea5-2a8e7277f9d5.png)

④CloudWatchLogsの有効化と転送するコードを記述する。
Status:Enabled
Properties:jsonコード貼り付け

![aws-cloudwatchlogs-winsv2016-7.png](https://qiita-image-store.s3.amazonaws.com/0/160993/f1293bbf-fa88-e961-93b4-7da5f4638345.png)


Runをクリックして実行。

⑤コマンド実行結果確認
![aws-cloudwatchlogs-winsv2016-8.png](https://qiita-image-store.s3.amazonaws.com/0/160993/4ab3d9d9-29d1-bf75-8529-962100759ce4.png)



#CloudWatchLogsでの確認
一度インスタンスを再起動すると、ログが出力されるので再起動してみましょう。

①ロググループを選択
ロググループと、ログストームはログが転送された時点で自動的に作成される様です。

![aws-cloudwatchlogs-winsv2016-9.png](https://qiita-image-store.s3.amazonaws.com/0/160993/56398c84-0a3e-3d5c-0b18-f96fc8088f9e.png)

②ログ種別ごとに分けた、ログストリームを選択。
今回は「Application」を選択します。
![aws-cloudwatchlogs-winsv2016-11.png](https://qiita-image-store.s3.amazonaws.com/0/160993/4d01e9e7-7dbc-6b25-9ba2-8da60d3eeb71.png)

③ログ確認
![aws-cloudwatchlogs-winsv2016-12.png](https://qiita-image-store.s3.amazonaws.com/0/160993/ff8fcf73-f43b-f6bc-b291-db6a860e654c.png)


#参考
■CloudWatch との統合を設定するための予備タスク
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/send_logs_to_cwl_gs.html

■CloudWatch のインスタンスを設定する
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/send_logs_to_cwl_instances.html#send_logs_cwl_configfile