【最新】Windows + CloudWatch Agentによるメトリクス/ログ管理

2019-09-25

Windowsインスタンスの統合CloudWatch エージェント設定方法

はじめに

目的

  • EC2インスタンス上のWindowsサーバーが個々に持つログを収集して、CloudWatch Logsに集約すること。
  • CloudWatchを使って、各EC2インスタンスのカスタムメトリクスを監視すること。
  • 何が【新】かと言えば、2017年12月に発表された新機能である統合 CloudWatch エージェントを使用した設定を表します。

ハマったこと!

  • これまで、Windowsサーバーのログ収集は下記記事で紹介したSSM(Systems Manager)による設定を行っておりました。以前の設定は、AWS.EC2.Windows.CloudWatch.jsonファイルをベースにした旧形式の設定ファイルになります。
  • しかし、その後Windows Server OS内のCloudWatch Agentを使って、アプリ側のログファイルをCloudWatch Logsに出力する設定を追加したため、各EC2に旧形式新形式の設定ファイルが混在することになりました。今回、新形式の設定ファイルに統合し、CloudWatchのカスタムメトリクスも追加しています。
  • また、SSM(Systems Manager)のステートマネージャーは、30分より短い間隔でコマンドを発行することができないため、今回はSSMではなく、CloudWatch Agentを使用しています。
  • 今回の作業で一番ハマったことは、新形式の設定ファイルの書き方に困ったこと、エージェントの起動方法が不明であったことです! なんとかTry&Error で回避しました。

前提条件

  • Windows Serverに、SSM Agent、CloudWatch Agentがインストールされていること。
  • EC2インスタンスのroleには、CloudWatchFullAccess、AmazonSSMFullAccessのポリシーがアタッチされていること。
  • サーバーOSは、Windows Server 2012 R2 を使用しています。

設定ファイル(JSON)の作成方法

ウィザードを使って設定ファイルを作成する

  • 下記コマンドを実行し、ウィザードを使って設定ファイルを作成します。

cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
amazon-cloudwatch-agent-config-wizard.exe
  • ウィザードでメトリクスを設定する際に、事前定義されたメトリクスセット(1. Basic / 2. Standard / 3. Advanced)を選択します。メトリクスセットの内容およびその他ウィザードを使用した設定ファイルの作成については、下記ドキュメントを参照ください。

手動で設定ファイルを作成する

  • 既に動作実績のある設定ファイルが手元にある場合は、サーバーに合わせてカスタマイズする方法がお勧めです。
  • 一から手動で作成する場合は、下記ドキュメントのサンプルを使用します。
  • CloudWatch エージェント設定ファイルは、agentmetricslogs の 3 つのセクションを持つ JSON ファイルです。
    • agent セクションには、エージェントの全体的な設定に関するフィールドが含まれています。ウィザードを使用する場合、agent セクションは作成されません。
    • metrics セクションでは、収集と CloudWatch への発行に関するカスタムメトリクスを指定します。ログを収集するためだけにエージェントを使用している場合は、ファイルから metrics セクションを省略できます。
    • logs セクションでは、CloudWatch Logs に発行されるログファイルを指定します。サーバーで Windows Server が実行されている場合、これには Windows イベントログからのイベントが含まれることがあります。

  • その他手動で設定ファイルを作成する場合の説明は、ドキュメントを参照ください。
  • 以下、今回手動で作成した設定ファイルのサンプルです。旧形式と書式が異なることがお分かりになるかと思います。

{
    "agent": {
        "metrics_collection_interval": 60,
        "logfile": "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\amazon-cloudwatch-agent.log"
    },
    "metrics": {
        "metrics_collected": {
            "Processor": {
                "measurement": [
                    {"name": "% Idle Time", "rename": "CPU_IDLE", "unit": "Percent"},
                    "% Interrupt Time",
                    "% User Time",
                    "% Processor Time"
                ],
                "resources": [
                    "*"
                ]
            },
            "LogicalDisk": {
                "measurement": [
                    {"name": "% Idle Time", "unit": "Percent"},
                    {"name": "% Disk Read Time", "rename": "DISK_READ"},
                    "% Disk Write Time",
                    "% Free Space"
                ],
                "resources": [
                    "*"
                ]
            },
            "Memory": {
                "metrics_collection_interval": 5,
                "measurement": [
                    "Available Bytes",
                    "Cache Faults/sec",
                    "Page Faults/sec",
                    "Pages/sec"
                ]
            },
            "Network Interface": {
                "metrics_collection_interval": 5,
                "measurement": [
                    "Bytes Received/sec",
                    "Bytes Sent/sec",
                    "Packets Received/sec",
                    "Packets Sent/sec"
                ],
                "resources": [
                    "*"
                ]
            },
            "System": {
                "measurement": [
                    "Context Switches/sec",
                    "System Calls/sec",
                    "Processor Queue Length"
                ]
            }
        },
        "append_dimensions": {
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}",
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}"
        },
        "aggregation_dimensions" : [["ImageId"], ["InstanceId", "InstanceType"], ["d1"],[]]
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                {
                    "file_path": "C:\\inetpub\\logs\\LogFiles\\W3SVC1\\*.log",
                    "log_group_name": "Windows_IISLogs",
                    "log_stream_name": "{local_hostname}_{instance_id}"
                }
                ]
            },
            "windows_events": {
                "collect_list": [
                {
                    "event_name": "System",
                    "event_levels": [
                        "INFORMATION",
                        "WARNING",
                        "ERROR"
                    ],
                    "log_group_name": "Windows_SystemEventLog",
                    "log_stream_name": "{local_hostname}_{instance_id}"
                },
                {
                    "event_name": "Security",
                    "event_levels": [
                        "INFORMATION",
                        "WARNING",
                        "ERROR"
                    ],
                    "log_group_name": "Windows_SecurityEventLog",
                    "log_stream_name": "{local_hostname}_{instance_id}"
                },
                {
                    "event_name": "Application",
                    "event_levels": [
                        "INFORMATION",
                        "WARNING",
                        "ERROR"
                    ],
                    "log_group_name": "Windows_ApplicationEventLog",
                    "log_stream_name": "{local_hostname}_{instance_id}"
                }
                ]
            }
        }
    }
}
 
  • なお、log_stream_nameにサーバーの判別をしやすくするため、{local_hostname}を指定しています。{hostname} は、EC2メタデータからホスト名を取得しますが、{local_hostname} は、OSのネットワーク設定ファイルから取得したホスト名を使用します。些細な違いですが、日常的にログを見る場合に何をヘッダーに付けるかを設計しましょう。

エージェントの起動方法

  • 始めに試行した時エージェントが起動できず、困りました! 単に設定ファイルを配置するだけでエージェントが起動できると思ったのが大間違いでした…。以下に、試行錯誤して確立した手順をまとめます。
  • 以下に前述の手順で作成した設定ファイルを配置します。(ファイル名:config.json)
    • C:\Program Files\Amazon\AmazonCloudWatchAgent
  • 「Windows PowerShell」をAdministratorとして起動します。下記コマンドを実行します。なお、設定ファイルはローカルに配置する方法以外に、Systems Managerのパラメータストアに格納する方法もありますがファイルサイズの上限(デフォルト4KBまで)があるため、ローカルに配置する方法が良いと思います。

PS C:\> cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
PS C:\Program Files\Amazon\AmazonCloudWatchAgent> ./amazon-cloudwatch-agent-ctl.ps1 -a fetch-config -m ec2 -c file:config.json
Successfully fetched the config and saved in C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp
Start configuration validation...
Valid Json input schema.
No csm configuration found.
Configuration validation first phase succeeded
Configuration validation second phase succeeded
Configuration validation succeeded
PS C:\Program Files\Amazon\AmazonCloudWatchAgent> ./amazon-cloudwatch-agent-ctl.ps1 -a start
PS C:\Program Files\Amazon\AmazonCloudWatchAgent> ./amazon-cloudwatch-agent-ctl.ps1 -a status
{
  "status": "running",
  "starttime": "2019-08-18T13:39:30",
  "version": "1.208036.0"
}
PS C:\Program Files\Amazon\AmazonCloudWatchAgent>
 
  • 上記コマンドを実行した結果、エージェントが起動できたことを確認します。また、下記ディレクトリにエージェントの起動に必要なjsonファイル、tomlファイルが配置されていることが分かります。
    • C:\ProgramData\Amazon\AmazonCloudWatchAgent

CloudWatch Logsでロググループをチェック!

  • CloudWatch Logsより、ロググループ、ログストリームが作成されたことを確認します。
 
  • メトリクスより、EC2のカスタムメトリクスが監視できていることを確認します。