WindowsのイベントログをKinesis Firehoseに送る


Windows ServerのイベントログをKinesis Firehoseに送りたかったので調べたら、 Amazon Kinesis Agent for Microsoft Windowsなるものがあった。githubのリポジトリはスター数少ないし、ダウンロードページは異様に淡白なUIだし不安になったが、ちゃんと動いたのでざっくりメモ。

公式ドキュメントなど

インストール

ダウンロードページではmsiでのインストールがrecommendedになってるけど、ドキュメントには別にそんなこと書いてないので、ワンライナーなPowershellで入れた。

iex ((New-Object System.Net.WebClient).DownloadString('https://s3-us-west-2.amazonaws.com/kinesis-agent-windows/downloads/InstallKinesisAgent.ps1'))

設定ファイル

%PROGRAMFILES%\Amazon\AWSKinesisTapによしなに書いたappsettings.jsonを置けばいいらしい。

イベントログを投げ込む設定ファイルの例が転がってるのでそれを参考にjsonを用意する。
https://docs.aws.amazon.com/ja_jp/kinesis-agent-windows/latest/userguide/configuring-kaw-examples.html

{
    "Sources": [
        {
            "Id": "SystemLogSource",
            "SourceType": "WindowsEventLogSource",
            "LogName": "Application",
            "Query": "*[System[(Level=1  or Level=2) and (EventID=260)]]" // 後述
        }
    ],
    "Sinks": [
        {
            "Id": "myKinesisFirehoseSink",
            "SinkType": "KinesisFirehose",
            "AccessKey": "", // FirehoseストリームがあるAWSアカウントのアクセスキー
            "SecretKey": "", //  シークレットキー
            "Region": "us-east-1", // Firehoseがあるリージョン
            "StreamName": "windows-event-log-stream-01" // 作ったFirehoseのストリーム名
        }
    ],
    "Pipes": [
        {
            "Id": "EventLogToFirehose",
            "SourceRef": "SystemLogSource", // SourceのIDに一致させる
            "SinkRef": "myKinesisFirehoseSink" // SinkのIDに一致させる
        }
    ],
    "SelfUpdate": 0
}

イベントログのクエリ

イベントビューアーから、取りたいイベントログを取得するカスタムビューをポチポチ作ればクエリが表示される。

複数ストリームを使う

Souces, Sinks, Pipesをそれぞれ増やせばいい。

起動

Start-Service -Name AWSKinesisTap
Get-Service -Name AWSKinesisTap // 起動してるか確認

トラブルシューティング

とにかく↓のログを見る。
%PROGRAMDATA%\Amazon\AWSKinesisTap\logs

送信に成功したときは特にログは出ないっぽいので、Kinesisのログなどで確認。