CloudWatch Agentを使ってWindows Serverのメトリクスを監視してみた

CloudWatch Agentを使ってWindows Serverのメトリクス(ディスク空き容量・メモリ使用率)を監視してみた。
2018.10.03

はじめに

おはようございます、加藤です。 EC2インスタンスでは標準でCPU使用率、デイスク・ネットワークI/Oが確認、アラートを飛ばすことができます。本格的な運用監視を行っている方は、Prometheusの構築やMackerelのようなSaaSを利用していると思いますが、まずはライトに運用監視をしたいという方も一定数いるのではないでしょうか。 そんな方向けにWindows ServerのメトリクスをCloudWatch Agentを使って監視する方法をまとめてみました。 主に下記の公式ドキュメントを参考にしています。 CloudWatch エージェントを使用して Amazon EC2 インスタンスとオンプレミスサーバーからメトリクスとログを収集する - Amazon CloudWatch

前提

  • EC2インスタンスにAWS Systems Manager(以降、SSM)のAgentがインストールされている
  • SSMが動作する条件を満たしている

やってみた

EC2インスタンスの作成

IAMロールの作成

インスタンスがCloudWatchへアクセスすることを許可するIAMロールを作成します。 IAM コンソール(https://console.aws.amazon.com/iam/

  • CloudWatchAgentAdminPolicy
  • AmazonEC2RoleforSSM
  • AgentのインストールをAWS Systems Managerで行う為

上記のポリシーがアタッチされたIAMロールを作成します。ロール名は ec2_CloudWatchAgentAdminPolicy としました。

インスタンスの作成

以下のスペックでEC2インスタンスを用意します。

OS インスタンスタイプ IAMロール
Windows Server 2016 Japanese t3.large ec2_CloudWatchAgentAdminPolicy

CloudWatch Agentのインストール

SSMのRun Commandを使ってCloudWatch Agentをインストールします。 SSM コンソール(https://console.aws.amazon.com/systems-manager/

Run Commandドキュメント AWS-ConfigureAWSPackage を使用します。

インストールするパッケージネームは AmazonCloudWatchAgent です。

ターゲットを指定して実行します。 下記のコマンドでCLIから実行することも可能です。

aws ssm send-command --document-name "AWS-ConfigureAWSPackage" --document-version "\$DEFAULT" --targets "Key=instanceids,Values=インスタンスID" --parameters '{"action":["Install"],"version":["latest"],"name":["AmazonCloudWatchAgent"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-1

CloudWatch Agentの開始

SSMのSession Managerを使ってCloudWatch エージェント設定ファイルを作成します。 SSM コンソール(https://console.aws.amazon.com/systems-manager/

Session Managerの使用方法はこちらのブログを参考にしてください。

SSH不要時代がくるか!?AWS Systems Manager セッションマネージャーがリリースされました!

cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
.\amazon-cloudwatch-agent-config-wizard.exe

OSがWindowsかLinuxか

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

EC2かオンプレミスか

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]:

StatsD daemon(Node.js上で稼働するデータ収集デーモン)の有効化とポート番号指定

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]

StatsD daemonのデータ収集・集約間隔の指定

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]:

CloudWatch Log Agentの設定ファイルをインポートするか

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]:

CPUコア毎の使用率を取得する、追加の費用がが発生することがあります

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

ImageId、InstanceId、InstanceType、AutoScalingGroupNameなどが取得可能であれば取得する

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]:

メトリクスを高解像度(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]:
2

設定に問題が無いか確認する

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
                        },
                        "Paging File": {
                                "measurement": [
                                        "% Usage"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "PhysicalDisk": {
                                "measurement": [
                                        "% Disk Time"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "Processor": {
                                "measurement": [
                                        "% User Time",
                                        "% Idle Time",
                                        "% Interrupt Time"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "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]:

Windowsイベントログを監視しますか

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

上記の設定の内容を確認してください。 configファイルはconfig.jsonにもあります。 必要に応じて手動で編集します。 設定をSSMパラメータストアに保存しますか?

Saved config file to config.json successfully.
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
                        },
                        "Paging File": {
                                "measurement": [
                                        "% Usage"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "PhysicalDisk": {
                                "measurement": [
                                        "% Disk Time"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "Processor": {
                                "measurement": [
                                        "% User Time",
                                        "% Idle Time",
                                        "% Interrupt Time"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "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]:

SSMパラメータストアに保存するキー名を決めてください。 AWS管理ポリシーを称している場合、キー名は AmazonCloudWatch- で始まる必要があります。 プロジェクト名とロール名(そのサーバーのAP・Webなどの役割)を付けておくとわかりやすいです。

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]
AmazonCloudWatch-windows-project-role

SSMパラメータストアのリージョンを入力してください。

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]

SSMパラメータストアにデータを送信するのにアクセスキーを使用しますか

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

これで、SSMパラメータストアにCloudWatch Agentの設定が保存されました。

2回目以降は同じコンフィグならば下記の作業だけでOKです

次に、SSMのRun Commandを使ってCloudWatch Agentを開始します。 SSM コンソール(https://console.aws.amazon.com/systems-manager/

Run Commandドキュメント AmazonCloudWatch-ManageAgent を使用します。

Configuration Location には先程CloudWatch Agent Configを保存した、SSMパラメータストアの名前を入力します。 今回は AmazonCloudWatch-windows-project-role です。

ターゲットを指定して実行します。 ConfigはSSMパラメータストアに保存されているので、複数インスタンスに対して一括に設定が可能です。

メトリクスの確認

CloudWatch メトリクスで収集された値を確認します。 CloudWatch メトリクス コンソール(https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#metricsV2:)

SNS(メール通知)の設定

SNSを使ってメール通知を設定します。 SNS(https://ap-northeast-1.console.aws.amazon.com/sns/v2/home?region=ap-northeast-1#/topics)

トピックを作成します。

サブスクリプションを設定します。 Emailで希望の送信先を設定してください。

通知して問題ないかの確認メールが届くので承認します。

アラートの設定

今回は以下のメトリクスにしきい値を設定してアラートを飛ばします。

  • LogicalDisk % Free Space
  • ディスク容量
  • Memory % Committed Bytes In Use
  • メモリ使用率

CloudWatch Alarmを監視を設定します。 CloudWatch Alarm(https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#alarm:alarmFilter=ANY

Alarmを作成します。

メトリクス名: LogicalDisk % Free Space にチェックを入れます。

今回は通知テストを行いたいので、しきい値30%以下に設定しました。 事前に作成したSNSトピックを通知先に設定します。

無事にアラートを受け取ることができました。

メトリクス名: Memory % Committed Bytes In Use に対しても同様に設定することでメモリ使用率も監視できます。

あとがき

CloudWatch Agentを使ってディスク空き容量・メモリ使用率を監視してみました。 CloudWatch Agentをインストールしていて知りましたが、機能が多いですね、ログのエクスポートも行ってみたいです。 冒頭でも言ったとおり本格的な監視が必要な場合はSaaSなどを検討した方が良いと思いますが、簡単な監視ならCloudWatchだけで十分そうです! 以上でした。