CloudWatchエージェントでWindows 2019サーバ(IIS)のログ取得

# CloudWatch logsエージェントと統合CloudWatch エージェントの違い
## CloudWatch logsエージェントとは
- Linux を実行しているサーバーのみからのログを収集することができるエージェント
- 古いバージョンであるため、統合CloudWatchエージェントの使用が推奨されている。

## 統合CloudWatchエージェントとは
- Windows Serverを実行しているサーバーなど、様々なOSでサポートされているエージェント
- 基本的に新規インストールはこちらを使う。

# 前提条件
- 統合CloudWatchエージェントがサポートしているWindowsサーバであること
[参考：サポートOS一覧](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)
- 今回は「Microsoft Windows Server 2019 Base - ami-0a628b83485f640e7」を使用する。(※日本語化、IISのインストール済みとする。)
- 今回のサーバはパブリックサブネットに配置する。


# 資格情報の付与(IAMロール、IAMポリシー）
- インスタンスに以下のポリシーを含んだIAMロールをアタッチする
- 既存でIAMロールをEC2にアタッチしている場合は、以下のポリシーを付与する

| ポリシー名 | 役割 |
| ---- | ---- | ---- |
| AmazonSSMManagedInstanceCore |SSMでEC2を使用するために付与する |
| CloudWatchAgentServerPolicy | EC2がCloudWatchエージェントを使用するために付与する |

# CloudWatchエージェントのインストール
- パブリックサブネットに配置されたWindowsサーバへのCloudWatchエージェントのインストールはCloudFormationを使用しない場合、大きく2つの方法に分かれる。
- インターネット経由でmsiをダウンロードしてインストールする。
- System Managerを使用してインストールする。
- なお、今回はSystem Managerを使用します。

## SSMを使用したCloudWatchエージェントのインストール
- マネコンからAWS Systems Managerを検索します。
- ナビゲーションペインのRun Commandを選択します。
- 「Run command」を選択します。
- 検索から「AWS-ConfigureAWSPackage」を選択します。
![](https://storage.googleapis.com/zenn-user-upload/jvchqxle0rlh10ivp52iio2zymj2)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371570/b99240f5-08f9-1404-7b0c-13a9498f53d4.png)

- パラメータを以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371570/4033202b-2eb4-dd28-b9c3-15d06dbf2367.png)
Name: AmazonCloudWatchAgent

- ターゲットでCloudWatchエージェントをインストールするインスタンスを選択します。
- 「実行」を選択します。

# CloudWatchエージェントのセットアップ
- Session Managerか、直接RDP接続してWindowsサーバへログインします。
- 今回は、Session Managerを使用します。
以下のコマンドを入力します。
直接RDP接続した場合は、cmdから以下を入力します。

```
cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
.\amazon-cloudwatch-agent-config-wizard.exe
```
以下からCloudWatchエージェントのセットアップウィザードから質問攻めにあいますが、今回はIISのログが取る目的ですので割愛します。
何を聞かれているかに関しては[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html)をご覧ください。

設定値

```
============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [2]:

Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:

Which port do you want StatsD daemon to listen to?
default choice: [8125]

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:

What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:

Do you have any existing CloudWatch Log Agent configuration file to import for migration?
1. yes
2. no
default choice: [2]:

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:

Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:

Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:

Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize
for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:

Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:

Current config as follows:
{
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "LogicalDisk": {
                                "measurement": [
                                        "% Free Space"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "Memory": {
                                "measurement": [
                                        "% Committed Bytes In Use"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:

Do you want to monitor any customized log files?
1. yes
2. no
default choice: [1]:

Log file path:
C:\inetpub\logs\LogFiles\W3SVC1\*.log
Log group name:
default choice: [u_ex%y%m%d.log]
IIS_Access_Log
Log stream name:
default choice: [{instance_id}]

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:

Log file path:
C:\Windows\System32\LogFiles\HTTPERR\*.log
Log group name:
default choice: [httperr1.log]
IIS_Error_Log
Log stream name:
default choice: [{instance_id}]

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any Windows event log?
1. yes
2. no
default choice: [1]:

Windows event log name:
default choice: [System]

Do you want to monitor VERBOSE level events for Windows event log System ?
1. yes
2. no
default choice: [1]:

Do you want to monitor INFORMATION level events for Windows event log System ?
1. yes
2. no
default choice: [1]:

Do you want to monitor WARNING level events for Windows event log System ?
1. yes
2. no
default choice: [1]:

Do you want to monitor ERROR level events for Windows event log System ?
1. yes
2. no
default choice: [1]:

Do you want to monitor CRITICAL level events for Windows event log System ?
1. yes
2. no
default choice: [1]:

Log group name:
default choice: [System]

Log stream name:
default choice: [{instance_id}]

In which format do you want to store windows event to CloudWatch Logs?
1. XML: XML format in Windows Event Viewer
2. Plain Text: Legacy CloudWatch Windows Agent (SSM Plugin) Format
default choice: [1]:

Do you want to specify any additional Windows event log to monitor?
1. yes
2. no
default choice: [1]:
2
Saved config file to config.json successfully.
Current config as follows:
{
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "C:\\inetpub\\logs\\LogFiles\\W3SVC1\\u_ex%y%m%d.log",
                                                "log_group_name": "IIS_Access_Log",
                                                "log_stream_name": "{instance_id}"
                                        },
                                        {
                                                "file_path": "C:\\Windows\\System32\\LogFiles\\HTTPERR\\httperr1.log",
                                                "log_group_name": "IIS_Error_Log",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        },
                        "windows_events": {
                                "collect_list": [
                                        {
                                                "event_format": "xml",
                                                "event_levels": [
                                                        "VERBOSE",
                                                        "INFORMATION",
                                                        "WARNING",
                                                        "ERROR",
                                                        "CRITICAL"
                                                ],
                                                "event_name": "System",
                                                "log_group_name": "System",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "LogicalDisk": {
                                "measurement": [
                                        "% Free Space"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "Memory": {
                                "measurement": [
                                        "% Committed Bytes In Use"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-windows]

Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]

Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXXXXXX(From SDK)
2. Other
default choice: [1]:

Successfully put config to parameter store AmazonCloudWatch-windows.
Please press Enter to exit...

Program exits now.
```

## CloudWatchエージェントのセットアップ注目ポイント
IISのアクセス、エラーログは、デフォルトでは[こちら](https://blog.putise.com/iis%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AD%E3%82%B0%E3%81%AF%E3%81%A9%E3%81%93%E3%81%AB%E3%81%82%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%AD%E3%82%B0%E3%81%AE/)のように構成されているので以下のように設定します。
※Log group nameやLog stream nameは要件に合わせて設定してください。

```
Do you want to monitor any customized log files?
1. yes
2. no
default choice: [1]:

Log file path:
C:\inetpub\logs\LogFiles\W3SVC1\*.log
Log group name:
default choice: [u_ex%y%m%d.log]
IIS_Access_Log
Log stream name:
default choice: [{instance_id}]

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:

Log file path:
C:\Windows\System32\LogFiles\HTTPERR\*.log
Log group name:
default choice: [httperr1.log]
IIS_Error_Log
Log stream name:
default choice: [{instance_id}]

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
```

System Managerのパラメータストアに今回セットアップしたパラメータを保存したい場合は、
以下の質問をyesにして従ってください。
※【重要】保存したい場合は、IAMロールの「CloudWatchAgentServerPolicy」を一時的に「CloudWatchAgentAdminPolicy」に**変更**してください。

```
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-windows]

Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]

Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXXXXXX(From SDK)
2. Other
default choice: [1]:

Successfully put config to parameter store AmazonCloudWatch-windows.
Please press Enter to exit...

Program exits now.
```

# CloudWatch エージェントの実行
- マネコンからAWS Systems Managerを検索します。
- ナビゲーションペインのRun Commandを選択します。
- 「Run command」を選択します。
- 検索から「AmazonCloudWatch-ManageAgent」を選択します。
![](https://storage.googleapis.com/zenn-user-upload/pxq57nbs35nl9ixscnmmsyzq87be)
- パラメータストアに保存した場合はパラメータを以下のように設定します。
- 保存していない場合は設定しません。
![](https://storage.googleapis.com/zenn-user-upload/yk9fy1qbxymj8oconwtvzqljnbkq)
Optional Configuration Locationの値は、セットアップ時の

```
What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-windows]
```
で設定した名前です。

- ターゲットでCloudWatchエージェントをインストールするインスタンスを選択します。
- 「実行」を選択します。

ログが収集できています！お疲れ様でした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371570/b3aeb8a5-635b-3360-43c4-e24fa9a14188.png)