WindowsイベントログのCloudWatch AgentによるLogs管理

2019-09-20

Windows Server 2012インスタンスからSSMを使ってイベントログを送る方法

目的

  • EC2インスタンス上のWindowsサーバーが個々に持つログをCloudWatch Logsに集約すること。
  • ログの対象は、Windows Server OSの各種イベントログの他に、IISなどローカルに保存されるログファイルも転送すること。
 

前提条件

  • Windows Serverに、SSM Agent、CloudWatch Agentがインストールされていること。
  • EC2インスタンスのroleには、CloudWatchFullAccess、AmazonSSMFullAccessのポリシーがアタッチされていること。
  • サーバーOSは、Windows Server 2012 R2 を対象としています。新しいOSは、設定方法が異なる可能性があります。
  • また、SSM(Systems Manager)ではなく、CloudWatch Agentを使ったログとメトリクス収集の設定方法を下記記事で紹介しています。こちらも合わせて、ご覧ください。

SSMのステートマネージャーによる設定

  • AWS Systems Managerのステートマネージャーを開きます。
  • 関連付けの作成を選択します。
 
  • 関連付けの名前を指定します。省略可能です。
 
  • ドキュメントから「AWS-ConfigureCloudWatch」を選びます。
 
  • パラメータにて、StatusをEnabled、PropertiesにJSONパラメータを貼り付けます(サンプルは後述)。
 
  • ターゲットを選択します。このアカウント、このリージョンのすべてのマネージドインスタンスの選択、タグの指定、インスタンスの手動選択のいずれかを選択します。
    • 今回は、Auto Scalingにて増加するEC2に対しても設定を行いたかったので、すべてのインスタンスとしました。
  • スケジュールを選択します。関連付けを 1回のみ実行するか(スケジュールなし)、Cron/Rateによる間隔を指定してスケジュールを指定します。
    • 今回は30分間隔でコマンドが実行されるように指定しました。

cron(0 */30 * * * ? *)
   
  • 関連付けの作成を押します。ステータスが保留となりますが、(問題なければ)間もなく成功に変わります。
 

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

  • CloudWatch Logsにて、ロググループが追加されイベントが記録されていることを確認します。
 

JSONファイルの書き方

簡単な説明

  • ベースとなるAWS.EC2.Windows.CloudWatch.jsonファイルをAWSからダウンロードします。
  • JSON ファイルの先頭で、IsEnabled の「false」を「true」に変更します。
  • JSON ファイルで、CloudWatchLogs セクションを見つけます。
    • [AccessKey] および [SecretKey] フィールドは空白のままにしておきます。IAM ロールを使用して認証情報を設定します。
    • Region には、ログデータを送信するリージョンを入力します。
    • LogGroup には、ロググループの名前を入力します。この名前は、CloudWatch コンソールの [ロググループ] 画面に表示されます。
    • LogStream には、送信先のログストリームを入力します。この名前は、CloudWatch コンソールの [ロググループ] > [ストリーム] 画面に表示されます。デフォルトの {instance_id} を使用する場合、ログストリーム名はこのインスタンスのインスタンス ID です。
  • 送信するデータを設定します。アプリケーションイベントログの場合、JSON ファイルで、ApplicationEventLog セクションを見つけます。
    • Levels には、アップロードするメッセージのタイプを指定します。次のいずれかの値を指定できます。
      • 1 – エラーメッセージだけをアップロードします。
      • 2 – 警告メッセージだけをアップロードします。
      • 4 – 情報メッセージだけをアップロードします。
  • 送信先を設定します。JSON ファイルで、Flowsセクションを見つけます。Flows には、アップロードされる各データ型 (たとえば、ApplicationEventLog) とその送信先 (たとえば、CloudWatchLogs) を追加します。
  • その他、CloudWatch Agentの設定ファイルの詳細は、下記ドキュメントを参照ください。

サンプル

  • 今回ステートマネージャーのパラメータに使ったサンプルを紹介します。

{
    "IsEnabled": true,
    "EngineConfiguration": {
        "PollInterval": "00:00:15",
        "Components": [
            {
                "Id": "CloudWatchLogsApplicationEventLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "ap-northeast-1",
                    "LogGroup": "Windows_ApplicationEventLog",
                    "LogStream": "{hostname}_{instance_id}"
                }
            },
            {
                "Id": "CloudWatchLogsSystemEventLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "ap-northeast-1",
                    "LogGroup": "Windows_SystemEventLog",
                    "LogStream": "{hostname}_{instance_id}"
                }
            },
            {
                "Id": "CloudWatchLogsSecurityEventLog",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "ap-northeast-1",
                    "LogGroup": "Windows_SecurityEventLog",
                    "LogStream": "{hostname}_{instance_id}"
                }
            },
            {
                "Id": "CloudWatchLogsIISLogs",
                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "AccessKey": "",
                    "SecretKey": "",
                    "Region": "ap-northeast-1",
                    "LogGroup": "Windows_IISLogs",
                    "LogStream": "{hostname}_{instance_id}"
                }
            },
            {
                "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": "IISLogs",
                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                "Parameters": {
                    "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC2",
                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss",
                    "Encoding": "UTF-8",
                    "Filter": "",
                    "CultureName": "en-US",
                    "TimeZoneKind": "UTC",
                    "LineCount": "3"
                }
            }
        ],
        "Flows": {
            "Flows": 
            [
                "ApplicationEventLog,CloudWatchLogsApplicationEventLog",
                "SystemEventLog,CloudWatchLogsSystemEventLog",
                "SecurityEventLog,CloudWatchLogsSecurityEventLog",
                "IISLogs,CloudWatchLogsIISLogs"
            ]
        }
    }
}