ども、初老丸です。
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 FilesAmazonEc2ConfigServiceSettingsAWS.EC2.Windows.CloudWatch.json を適当なエディタで開いて修正する。今回の要件を改めて整理すると…
- IIS のログを取得する
- IIS のログを 2 つのログストリームに転送する
この要件を満たす設定は以下の通り。(ポイントは //
でコメントを付ける)
(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:UsersAdministrator>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:UsersAdministrator> # # Ec2Config を停止 # C:UsersAdministrator>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:UsersAdministrator>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:UsersAdministrator>
ちなみに、上記の操作はコマンドプロンプトにて実施すること。
適当にアクセスすると…
以下のように適当にアクセスして IIS にログを吐かせる。
$ curl -s -I win01-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
しばらくすると…
ふむ。
ひとまずは目的達成。
以上
Windows Server 上の各種ログを CloudWatch Logs に転送する雰囲気はつかめた気がする。気がするだけかも。