Elastic StackのWinlogbeatをソースコードからビルドしてみる

# はじめに
Elastic Stackの[Winlogbeat](https://www.elastic.co/jp/products/beats/winlogbeat)をソースコードからビルドするための備忘録です。

#利用したソフトウェア
- OS: Microsoft Windows 10 Pro (x86_64)
- Winlogbeat (7.4.2)
- [Go-lang](https://golang.org/) (go1.13.4.windows-amd64.msi)
- [git for windwos](https://gitforwindows.org/) (Git-2.24.0.2-64-bit.exe)
- [MinGW-w64](http://mingw-w64.org/) (mingw-w64-install.exe)
- VMware Workstation Player等のVMソフトウェア

今回はVmware Workstation 15 Pro上で動作するWindwos 10上でビルド環境を構築してみました。

[Winlogbeat 7.4.2](https://www.elastic.co/jp/downloads/beats/winlogbeat)はあらかじめインストール済みとしておきます（インストールやセットアップについては[こちら](https://qiita.com/rhpenguin/items/6dc4c3f82cd87122958c)もご参照ください）。

# Go-langのインストール
[Go-lang](https://golang.org/)からダウンロードした**go1.13.4.windows-amd64.msi**を起動しインストールします。インストール先はデフォルトの「C:\Go\」のままです。C:\Users\<UserName>配下にも**go**というフォルダが作成されます。

#MinGW-w64のインストール
[MinGW-w64](http://mingw-w64.org/)からダウンロードした**mingw-w64-install.exe**を起動します。「Architecture」を**x86_64**に指定しインストールします。あとはデフォルト設定のまま。

インストール完了したら環境変数**Path**へ以下を追加します。

```
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
```

#git for windowsのインストール
[git for windwos](https://gitforwindows.org/)からダウンロードした**Git-2.24.0.2-64-bit.exe**を起動します。こちらもデフォルト設定のままでインストールしました。

#GitHubからBeatsのソースコードをcloneする

(1) Git Bashを起動します。
(2) Clone先フォルダを作成します。
 
```
$ cd C:\Users\<UserName>\go\src
$ mkdir github.com
$ cd github.com
$ mkdir elastic
$ cd elastic
```
(3) Winlogbeat 7.4のソースコードをCloneします。masterでなく7.4のブランチを指定しています。

```
$ pwd 
/c/Users/<UserName>/go/src/github.com/elastic/
$ git clone -b 7.4 https://github.com/elastic/beats.git
```
(4) winlogbeatをビルドします。

```
$ pwd 
/c/Users/<UserName>/go/src/github.com/elastic/
$ cd beats
$ cd winlogbeat
$ pwd
/c/Users/<UserName>/go/src/github.com/elastic/beats/winlogbeat
$ go build
$ ls *.exe
winlogbeat.exe*
```

(5) ビルドされたExeファイルを適用する
Powershellを起動し以下のようにWinlogbeatのインストールフォルダへコピーしWinlogbeatを再起動します。

```
> cd C:\Program Files\winlogbeat-xxx (Winlogbeatのインストールフォルダ)
> Stop-Service winlogbeat
> mv .\winlogbeat.exe .\winlogbeat.exe.org
> C:\Users\<UserName>\go\src\github.com\elastic\beats\winlogbeat\winlogbeat.exe .
> Start-Service winlogbeat
```

#まとめ
以上のようにソースコードからのビルドは非常に簡単に行うことができました。


#おまけ
今回なぜわざわざWinlogbeatをソースからビルドしなおしたかというと・・・**7.4**でProxyサーバ経由でElasticsearchへ接続する設定がうまく動作しなかったからでした。

```yaml:winlogbeat.yml
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["log.example.com:9200"]
...
  # Proxy server URL ★設定してもProxy経由通信にならない・・・
  proxy_url: http://proxy.example.com:3128
...
```

そこでこちらの[ソースコード](https://github.com/elastic/beats/blob/7.4/libbeat/outputs/elasticsearch/elasticsearch.go)を参照したところ・・・

```elastic/beats/libbeat/outputs/elasticsearch/elasticsearch.go
137: func makeES(
...
167: var proxyURL *url.URL
168: if !config.ProxyDisable {
169: 	proxyURL, err := parseProxyURL(config.ProxyURL) ★★★
170: 	if err != nil {
171: 		return outputs.Fail(err)
172: 	}
173: 	if proxyURL != nil {
174: 		logp.Info("Using proxy URL: %s", proxyURL)
175: 	}
176: }
...
```

ということで以下のように修正してビルドしたらProxy経由の通信が動作するようになりました。

```elastic/beats/libbeat/outputs/elasticsearch/elasticsearch.go
137: func makeES(
...
修正前: 169: proxyURL, err := parseProxyURL(config.ProxyURL)
修正後: 169: proxyURL, err = parseProxyURL(config.ProxyURL) 
```