ども、初老丸です。
tl;dr
Windows Server 上のイベントログや IIS のログって CloudWatch Logs にどうやって送るのかしらと思って調べて試したメモ。
参考
- http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2-configuration-cwl.html
- http://iga-ninja.hatenablog.com/entry/2014/10/22/205350
メモ
構成図

ざっくり手順
- 適切なポリシーを EC2 にアタッチ済みの IAM role にアタッチする(既に IAM role がアタッチされている前提)
- EC2Config サービスにて CloudWatch Logs integration を有効にする
- AWS.EC2.Windows.CloudWatch.json を修正
- EC2Config サービスの再起動
以下のようなポリシーを EC2 にアタッチ済みの IAM role にアタッチする
- AmazonEC2RoleforSSM
- CloudWatch Logs に対する以下のポリシー(Managed Policy の CloudWatchFullAccess でも良いと思う)
{ "Version": "2012-10-17", "Statement": [[f:id:inokara:20160210231534p:plain] { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
EC2Config サービスの設定変更
スタートメニューから All apps に遷移して EC2ConfigService Setting を起動する。

起動したら Enable CloudWatch Logs integration をチェックする。

チェックして Apply 又は OK でウィンドウを閉じる。
AWS.EC2.Windows.CloudWatch.json の修正
C:\Program Files\Amazon\Ec2ConfigService\Settings\AWS.EC2.Windows.CloudWatch.json を適当なエディタで開いて修正する。今回の要件を改めて整理すると...
この要件を満たす設定は以下の通り。(ポイントは // でコメントを付ける)
(snip)
// IIS の Log の転送定義
//
// - TimestampFormat を IIS のログに合わせて定義する
// - Encoding を定義する
//
{
"Id": "IISLog",
"FullName": "AWS.EC2.Windows.CloudWatch.IisLog.IisLogInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
"TimestampFormat": "yyyy-MM-dd HH:mm:ss",
"Encoding": "UTF-8"
}
},
(snip)
// 転送先定義
//
// - IAM role が適用されていなければ AccessKey や SecretKey を適宜設定する
// - CloudWatch Logs の Region を定義
// - LogGroup と Log Stream を定義する
//
{
"Id": "CloudWatchLogs",
"FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"AccessKey": "",
"SecretKey": "",
"Region": "ap-northeast-1",
"LogGroup": "Default-Log-Group",
"LogStream": "{instance_id}"
}
},
// 転送先定義
//
// - IAM role が適用されていなければ AccessKey や SecretKey を適宜設定する
// - CloudWatch Logs の Region を定義
// - LogGroup と Log Stream を定義する
//
{
"Id": "CloudWatchLogs02",
"FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"AccessKey": "",
"SecretKey": "",
"Region": "ap-northeast-1",
"LogGroup": "Default-Log-Group",
"LogStream": "{instance_id}-02"
}
},
(snip)
そして... このエージェントが収集したログをどこに(LogGroup / LogStream)転送するかを以下のように Flow セクションで定義する。 Flow セクション自体は CloudWatch Logs だけではなく CloudWatch でも収集したパフォーマンスカウンタのメトリクスをどこの Namespace に転送するかも定義する。
"Flows": { "Flows": [ "IISLog, (CloudWatchLogs, CloudWatchLogs02)" ] }
上記の定義だと、ID: IISLog に定義されたログは ID: CloudWatchLogs と ID: CloudWatchLogs02 に定義された転送先に転送するということ。
少しわかりづらいので図示。

うむ...これでもわかり辛い。
EC2Config サービスの再起動
そして、EC2Config サービスを再起動する。
# # 一旦、サービスを確認 # C:\Users\Administrator>sc query | find "DISP" (snip) DISPLAY_NAME: Diagnostic Policy Service DISPLAY_NAME: Ec2Config DISPLAY_NAME: Windows Event Log (snip) DISPLAY_NAME: Windows Remote Management (WS-Management) C:\Users\Administrator> # # Ec2Config を停止 # C:\Users\Administrator>sc stop Ec2Config SERVICE_NAME: Ec2Config TYPE : 10 WIN32_OWN_PROCESS STATE : 3 STOP_PENDING (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 # # Ec2Config を開始 # C:\Users\Administrator>sc start Ec2Config SERVICE_NAME: Ec2Config TYPE : 10 WIN32_OWN_PROCESS STATE : 2 START_PENDING (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x7d0 PID : 3888 FLAGS : C:\Users\Administrator>
ちなみに、上記の操作はコマンドプロンプトにて実施すること。
適当にアクセスすると...
以下のように適当にアクセスして IIS にログを吐かせる。
$ curl -s -I win01-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
しばらくすると...

ふむ。
ひとまずは目的達成。
以上
Windows Server 上の各種ログを CloudWatch Logs に転送する雰囲気はつかめた気がする。気がするだけかも。