【最新】Windows + CloudWatch Agentによるメトリクス/ログ管理
AWS,CloudWatch,EC2,OperatingSystem,WindowsServer
Windowsインスタンスの統合CloudWatch エージェント設定方法
Contents
はじめに
目的
- 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 エージェント設定ファイルは、agent、metrics、logs の 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のカスタムメトリクスが監視できていることを確認します。
AWS,CloudWatch,EC2,OperatingSystem,WindowsServer
Posted by takaaki