ども、初老丸です。

tl;dr

Windows Server 上のイベントログや IIS のログって CloudWatch Logs にどうやって送るのかしらと思って調べて試したメモ。

参考

メモ

構成図

20160211003810

ざっくり手順

  1. 適切なポリシーを EC2 にアタッチ済みの IAM role にアタッチする(既に IAM role がアタッチされている前提)
  2. EC2Config サービスにて CloudWatch Logs integration を有効にする
  3. AWS.EC2.Windows.CloudWatch.json を修正
  4. 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 を起動する。

20160210231348

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

20160210231534

チェックして 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: CloudWatchLogsID: CloudWatchLogs02 に定義された転送先に転送するということ。

少しわかりづらいので図示。

20160211003742

うむ…これでもわかり辛い。

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

しばらくすると…

20160210235241

ふむ。

ひとまずは目的達成。

以上

Windows Server 上の各種ログを CloudWatch Logs に転送する雰囲気はつかめた気がする。気がするだけかも。

元記事はこちら

Windows Server 上の各種ログを CloudWatch Logs に送信するメモ