複数のWindows Serverにカスタムメトリクスを一括設定する方法

CloudWatch

こんにちは。大阪の市田です。
今回は「Run Commandでカスタムメトリクス」についてです。

概要

CloudWatchのカスタムメトリクスで標準以外のリソース状況をモニタリングするケースはよくあると思います。この場合、台数が数台なら手作業で設定してもあまり負担にはなりませんが、対象が数十台以上になってくると、全て手作業でやるのは現実的ではありません。

そこで、今回は簡単に「大量のWindows Serverに対して一括でカスタムメトリクスの設定を行う方法」についてご紹介します。

ポイント

方法は簡単です。一言で言えば、「Run Command」 を使うだけです。
ポイントは、「PowerShellのスクリプトは不要」 という点です。

Run Commandを使うと、SSHやRDPでログインすることなくコマンドの実行やアプリケーションのアップデートなどが行なえます。しかも嬉しいことに「Windowsインスタンスに対してCloudWatchのカスタムメトリクス設定もRun Command標準のコマンドで」 行えてしまいます。

ただし、Linux系はエージェントインストールする必要があり、別途シェルスクリプトを作成する必要があります。

手順

  • 対象のEC2インスタンスにRun Commandを実行する為のIAM Roleを付与します。
  • CloudWatchのカスタムメトリクス用のjsonファイルを準備します。
  • Run Commandを実行します。

必要に応じてRun Commandの実行結果を出力する為のS3を用意します。(必須ではありません)

jsonファイルの準備

最初にカスタムメトリクスの内容を定義したjsonファイルを用意しておきます。取得したい内容に応じてjsonファイルをご用意下さい。今回は下記のように、Cドライブのディスク使用率とメモリ使用率を取得する内容にしています。

Ec2Configのバージョンが4.0以降の場合、このファイルは、対象サーバ上のC:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.jsonとして展開されます。4.0以前の場合はC:\Program Files\Amazon\Ec2ConfigService\Settings\AWS.EC2.Windows.CloudWatch.jsonに展開されます。 このjsonの設定内容については、下記に詳細な記載があります。

{
    "EngineConfiguration": {
        "PollInterval": "00:00:15",
        "Components": [
            {
                "Id": "ApplicationEventLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogName": "Application",
                    "Levels": "1"
                }
            },
            {
                "Id": "SystemEventLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogName": "System",
                    "Levels": "7"
                }
            },
            {
                "Id": "SecurityEventLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                "LogName": "Security",
                "Levels": "7"
                }
            },
            {
                "Id": "ETW",
                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogName": "Microsoft-Windows-WinINet/Analytic",
                    "Levels": "7"
                }
            },
            {
                "Id": "IISLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.IisLog.IisLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1"
                }
            },
            {
                "Id": "CustomLogs",
                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogDirectoryPath": "C:\\CustomLogs\\",
                    "TimestampFormat": "MM/dd/yyyy HH:mm:ss",
                    "Encoding": "UTF-8",
                    "Filter": "",
                    "CultureName": "en-US",
                    "TimeZoneKind": "Local"
                }
            },
            {
                "Id": "MemoryAvailableMegabytes",
                "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "CategoryName": "Memory",
                    "CounterName": "Available MBytes",
                    "InstanceName": "",
                    "MetricName": "MemoryAvailable",
                    "Unit": "Megabytes",
                    "DimensionName": "InstanceId",
                    "DimensionValue": "{instance_id}"
                }
            },
            {
                "Id": "MemoryUtilization",
                "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "CategoryName": "Memory",
                    "CounterName": "% Committed Bytes in Use",
                    "InstanceName": "",
                    "MetricName": "MemoryUtilization",
                    "Unit": "Percent",
                    "DimensionName": "InstanceId",
                    "DimensionValue": "{instance_id}"
                }
            },
            {
                "Id": "MonitoringFreeSpaceC",
                "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "CategoryName": "LogicalDisk",
                    "CounterName": "% Free Space",
                    "InstanceName": "C:",
                    "MetricName": "DiskFreeC",
                    "Unit": "Percent",
                    "DimensionName": "InstanceId",
                    "DimensionValue": "{instance_id}"
                }
            },
            {
                "Id": "CloudWatchLogs",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "us-east-1",
                    "LogGroup": "Default-Log-Group",
                    "LogStream": "{instance_id}"
                }
            },
            {
                "Id": "CloudWatch",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters":
                {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "ap-northeast-1",
                    "NameSpace": "Classmethod/EC2"
                }
            }
        ],
        "Flows": {
            "Flows":
            [
                "(MonitoringFreeSpaceC,MemoryAvailableMegabytes,MemoryUtilization),CloudWatch"
            ]
        }
    }
}

やってみる

動作確認対象

やってみる前に、動作確認した対象について補足します。
本記事の動作確認は、2017年02月02日現在で下記のAMIから作成したインスタンスで確認しています。

  • Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2017.01.11
  • Windows_Server-2016-Japanese-Full-Base-2017.01.11

テスト用インスタンスの作成

それでは作業を開始したいと思います。
まず、動作確認用にカスタムメトリクスを取得するWindows Serverを立てます。今回は「Windows Server 2012R2」を3台作りました。(Windows Server2016でも確認済みです)

01-windows2012r2

02-ec2

IAM Roleの付与

Run Commandが実行できるように対象インスタンスには「AmazonEC2RoleforSSM」 というRoleを付与しておきます。

15-role

Run Commandの実行

「コマンドの実行」 をクリックして作業開始です。

03-runcommand

コマンドのドキュメントから 「AWS-ConfigureCloudWatch」 を選択します。

04-configcloudwatch

次に対象のインスタンスを選択します。

05-selectinstance

画面を下側にスクロールしていって「Status」を「Enabled」 にします。
「Properties」 に先程のjsonの内容を貼り付けます。

S3バケットは必要に応じて設定して下さい。指定しているとエラーメッセージの全文が出力されるので、指定しておくとトラブルシュート時に便利です。

06-setting

コマンドが成功すると下記のように表示されます。

07-result

結果を見てみます。状態が「成功」になっています。

08-output

出力内容も「Success」と出ていますね。

09-output2

カスタムメトリクスの確認

以上で作業は終了です。
実際にCloudWatchの画面でどうなっているか確認してみます。今回は名前空間を「Classmethod/EC2」としています。

10-custommetrics

無事に3インスタンス全てで取得出来ています。

11-graph

成功時の出力内容

この時、S3バケットの指定をしていると下記のようにjsonの内容を読み込んで処理されているのが分かります。
(出力の内容は途中省略しています。)

13-result1

14-result2

カスタムメトリクス設定の変更

例えば運用していく中で「Dドライブを追加してディスク容量のカスタムメトリクス設定を追加したい」といった場合があると思います。
その場合は、先程の手順で「jsonの内容を貼り付け」 る時に、新しい内容で貼り付けて実行 すればOKです。

DisabledからEnabledにする場合

途中でカスタムメトリクス設定を無効にして、後から有効にする場合もこの手順と同じように、jsonの内容を貼り付ける必要があります。
「再度Enabledにする場合でも、改めてjsonの内容を送る必要がある」 ことに注意して下さい。無効にする前に設定していても、Properties欄 が空だとサーバ上の設定も消えてしまいます。

最後に

いかがだったでしょうか。
Run Commandを使うとRDPログインしなくても カスタムメトリクスの設定が出来てしまいます。台数が多くても規模に関係なく簡単に設定できるので、とても便利だと思います。
もちろん、台数が1台の場合でも同様に簡単に設定できるので、どんどん活用していきましょう。

以上です。

AWS Cloud Roadshow 2017 福岡