【CloudWatch】Windowsインスタンス用のアプリケーションログ等を出力させるSSMパラメータストアの記載方法

#【CloudWatch】Windowsインスタンス用のアプリケーションログ等を出力させるSSMパラメータストアの記載方法

どうも。pon0000です。

今回紹介するのは
「CloudwatchにWindowsインスタンス用のアプリケーションログを出力させる方法」
です。

##【実現したい事】
CloudWatchを使用し、Windowsインスタンス用のCloudWatch対象ロググループへアプリケーションログを出力したい。

##【方法】

前提として
①Windowsインスタンスには「AWS SSM」を使用し「CloudWatchAgent」をインストール、設定が完了している。

②SSMパラメータストアの編集内容としてイベントログのみ出力される設定（デフォルト）し(例：【パラメータストア名】awsCloudWatch)
CloudWatch内の対象ロググループ（例:Windows_Group）にはイベントログである"Application"、"Security"、"System"は出力されているのでインストール、設定はされている事は確認している

のですが、そもそもWindowsのパラメータストア（JSON形式）でどのように編集すればいいのか謎でした。

例えばLinux（Cent OS）インスタンスの「cloudwatch-agent.log」を取得したいのであれば、SSMのパラメータストアを以下のように編集します。

■【Linux】ログ転送コンフィグファイル
(SSM パラメータストア編集箇所：/opt/aws/amazon-cloudwatch-agent/etc/awsCloudWatch）
ロググループ名（例：Linux_Group）

```ruby:awsCloudWatch
{
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
                        "log_group_name":"Linux_Group",
                        "log_stream_name": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
                    },
                    {
                        "file_path": "/var/log/messages",
                        "log_group_name": "Linux_Group",
                        "log_stream_name": "/var/log/messages"
                    },

・・中略・・

                    {
                        "file_path": "/var/log/httpd/access_log",
                        "log_group_name":"Linux_Group",
                        "log_stream_name": "/var/log/httpd/access_log"
                    }
                ]
            }
        }
    }
}

```

上記ではログストリーム名とファイルパスを一致させており、「collect_list」以下の"file_path"に注意しつなげていけば対象のログが取得できるので、対象がほかのアプリログ等が出力されている場合でも、ファイルパスさえ知っていれば、ログ出力することは難しくはないハズです。

しかし、Windowsの場合、ほとんど私はイベントログしか出力してこなかったため（というより経験ないので）、「”該当ファイルパス”にある”xxx.log”を取得したい」との要求を受けたとき一体どのように書けばいいのか頭を悩ませました・
（そもそもカスタムログとして取り扱うのか、もしくは一度イベントログに巻き込んでから出力するのかetc）

##【結論】
調査していくと下記の記載方法で大丈夫そう。
※アプリケーションイベントログに、xxx.logを巻き込みCloudWatchに出力

■【Windows】 ログ転送コンフィグファイル
(SSM パラメータストア編集箇所：C:\Program Files\amazon\SSM\Plugins\awsCloudWatch）

```ruby:awsCloudWatch
{
 agent:{
		region:"ap-northeast-1"
	},
	logs:{
		logs_collected:{
			files:{
				collect_list:[
					{
						file_path:"＜ファイルパス1＞",
						log_group_name:"Windows_Group",
						log_stream_name:"Application.evtx",
						timezone:"Local"
					},
					{
						file_path:"＜ファイルパス2＞",
						log_group_name:"Windows_Group",
						log_stream_name:"Application.evtx",
						timezone:"Local"
					}
				]
			},
			windows_events:{
      			collect_list:[
            		{				
            			event_name:"System",			
           				event_levels:[		
               				INFORMATION,		
               				ERROR		
           				],		
	               		log_group_name:"Windows_Group",			
    	           		log_stream_name:"System.evtx"			
            		},				
        	   		{			
            			event_name:"Application",			
              			event_levels:[			
                			INFORMATION,			
                			ERROR			
               			],			
               			log_group_name:"Windows_Group",			
               			log_stream_name:"Application.evtx"			
            		},				
            		{				
            			event_name:"Security",			
           				event_levels:[		
            	   			INFORMATION,		
               				ERROR		
           				],		
	        	       	log_group_name:"Windows_Group",			
    	        	   	log_stream_name:"Security.evtx"			
            		}				
         		]				
        	}					
      	}					
	}					
}
						
```

例えば、「CloudWatchAgentログ」を出力する場合：（今回出したかったログ）
＜ファイルパス1＞の箇所に

`c:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\amazon-cloudwatch-agent.log`

を入力すればOKです。
※上記の記載法で、ログストリーム名イベントログ”Application”に出している場所と同じ場所を指定し、アプリケーションログとしての出力ができました

注意しなければならないことは、Linuxとは違い「イベントログ」と「その他ログ」で定義の仕方を変えてやらねばいけなかったみたいですね（ただ「つなげる」だけじゃない・・）

また「windows_events:」以下はイベントログを出力するのですが（.evtx形式）、従来（？）のイベントレベルを数値表現する方法ではなく、直接レベル指定し記載する方法でも上手く出力できました。

##最後に
結論として、Windowsアプリケーションログなどを出力させたい場合は
パラメータストアで上記の「collect_list:」以下のファイルパスを変更すれば出力されるはずなので、何かの参考にして頂ければと思います
※もっと上手い方法はあると思うので、ぜひその時はご教授頂ければと・・・・あと、間違ってたらごめんなさいm(__)m

では、また！！！！！！！

【参考UR】
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/send_logs_to_cwl_gs.html