Elastic Workplace SearchをWSL2で試す。


# はじめに
Elastic Enterprise Search(EWS)が7.9になってBASICライセンス(無料)での提供がはじまりました（[ニュースリリース](https://www.elastic.co/jp/blog/whats-new-elastic-enterprise-search-7-9-0-free-workplace-search-kibana-access)）。太っ腹。   実は7.8のときにDocker使って軽くお試ししていたのですが、基本機能はもうすぐ無料になるということで静かに待っていました。よーし試すぞー、と試したのでメモ書き。


## Elastic Workplace Searchとは
Elastic Workplace Search(以下、EWS)は、Elastic社から[「Elastic Enterprise Search」](https://www.elastic.co/jp/enterprise-search)のサブ機能として提供されています。  
  
EWSでは、OSSの全文検索エンジンelasticsearchのフロントエンド機能が提供されていて、いろいろなデータソースにある様々なドキュメントを気軽に検索できるようになるそうです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/6f013b4d-b1ae-6975-f1ef-2a677d9445d3.png", width=70% />

↑本当は３つの機能があるぞ、の図（ホームページ）。  

# 目次
1. Ubuntu 20.4 on WSL2
2. Elastic Workplace Search 構築


# 1. Ubuntu 20.4 on WSL2
最近、マイマシンのWindowsでWSL2（Windows Subsystem for Linux 2.0）をバージョンアップしたので、せっかくだからとWSL2上で試してみようとなりました。

## ■ WSL2のアップデート
WSLのインストールはマイクロソフトのページを参考に。WSL2へのアップデートはQiitaを参考にしました。

- Microsoft - [Windows 10 用 Windows Subsystem for Linux のインストール ガイド](
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)
- Qiita - [WSL2入れてみた](https://qiita.com/TsuyoshiUshio@github/items/947301bd9317610572fc)

## ■ Ubuntu 20.4 インストール
省略しますが、アップデートしたりWSL1にインストールして大変だった。。
盛大に失敗したりしてるのでQiitaには大変助けられました。。感謝の意を込めてリンク。

* Qiita - [(今はまだ)WSL1にUbuntu 20.04を入れるな](https://qiita.com/AumyF/items/eaf42dd3345a2285ff9e)

ここからセットアップ。
### (1) いつものプロキシ設定（/etc/apt/apt.conf.d/proxy.conf）

```shell:bash
$ sudo touch /etc/apt/apt.conf.d/proxy.conf
$ sudo vi /etc/apt/apt.conf.d/proxy.conf
```

以下の通り編集  

```/etc/apt/apt.conf.d/proxy.conf
Acquire::http::Proxy "http://<uid>:<pass>@<proxyhost>:<proxyport>";
Acquire::https::Proxy "http://<uid>:<pass>@<proxyhost>:<proxyport>";
```
更新先を日本に（jaistが好き）

```shell:bash
sudo sed -i.bak -e "s%http://us.archive.ubuntu.com/ubuntu/% \ 
                 http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g"  \
                 /etc/apt/sources.list
```
更新実行

```bash
$ sudo apt update
$ sudo apt upgrade -y
```
### （２）もろもろ環境構築
日本語環境をお好みで。

```shell:bash
$ sudo apt install -y language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo apt install -y manpages-ja manpages-ja-dev
$ sudo dpkg-reconfigure tzdata
$ sudo apt install -y nkf
```
curlは標準で入っている？

```shell:bash
$ sudo apt install -y curl
```

# 2.Elastic Workspace Search構築
（参考その１）Elastic - [Download Enterprise Search](https://www.elastic.co/jp/downloads/enterprise-search)
（参考その２）Elastic - [Installing Workspace Search](https://www.elastic.co/guide/en/workplace-search/current/workplace-search-install.html#installation-self-managed)

## ①Prerequisitesインストール
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/da0b618c-084d-f18b-c2a6-12837085e2ba.png" width=80% />

```shell:bash
$ sudo apt install -y openjdk-11-jdk
```

## ②Elasticsearchを構築する。
Elasticsearchが検索エンジン本体ですね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/4afd06ea-7e79-3f78-f1a0-b26de08a50fc.png" width=80% />

wget使うなら/etc/wgetrcを編集。

```shell:bash
$ sudo apt install -y wget
$ vi /etc/wgetrc
```
認証が必要な場合はいつもの形式。ポート番号の後に"/"がないとエラーになるみたい。use_proxyもonにしておく。

```configuration:/etc/wgetrc
  :
# You can se
# You can set the default proxies for Wget to use for http, https, and ftp.
# They will override the value in the environment.
http_proxy = http://<uid>:<password>@<proxy_host>:<proxy_port>/
https_proxy = http://<uid>:<password>@<proxy_host>:<proxy_port>/

# If you do not want to use proxy at all, set this to off.
use_proxy = on
:
```

elasticsearchを取得しておく。DLしてゲット。
うまくいかない場合はブラウザでDLしてコピーしても良い。

```shell:bash
$ cd ~/
$ wget https://artifacts.elastic.co/downloads/\
       elasticsearch/elasticsearch-7.9.1-linux-x86_64.tar.gz
$ tar xvf elasticsearch-7.9.1-linux-x86_64.tar.gz
$ cd elasticsearch-7.9.1
```

### ②の2と3 elasticsearch.confを編集して起動
展開したフォルダにconfigフォルダがあるのでそこにある設定ファイルを編集する。

```shell:bash
$ vi ./config/elasticsearch.yml
```
以下を末尾に追加

```yml:config/elasticsearch.yml
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: true
```

```shell:bash
$ ./bin/elasticsaerch
```
なんのエラーもなく動く（と思う）

### ②の4 password auto
②の2と3で起動したまま別の窓を開いて実行。

```shell:bash
$ cd ~/elasticsearch-7.9.1
$ sudo bin/elasticsearch-setup-passwords auto
　　：
Changed password for user apm_system
PASSWORD apm_system = **********

Changed password for user kibana_system
PASSWORD kibana_system = **********

Changed password for user kibana
PASSWORD kibana = **********

Changed password for user logstash_system
PASSWORD logstash_system = **********

Changed password for user beats_system
PASSWORD beats_system = **********

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = **********

Changed password for user elastic
PASSWORD elastic = <ここのパスワードいる>
```

## ③Elastic Enterprise Searchを構築する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/b34c2209-6968-986c-df1d-2e32d6befa6b.png" width=80% />

### ③の1. ダウンロードしてuncompressed
ダウンロードしろとあったのでdlしてuncompressed。

```shell:bash
$ cd ~/
$ wget https://artifacts.elastic.co/downloads/\
    enterprise-search/enterprise-search-7.9.1.tar.gz
$ tar xvf enterprise-search-7.9.1.tar.gz
```

### ③の2. config/enterprise-search.ymlを見つけて設定追加

```shell:bash
$ cd enterprise-search-7.9.1
$ vi ./config/enterprise-search.yml
```
elasticsearchの認証用に末尾に３行追加する。途中をコメントアウトしてもいい。
さらにelasticsearchクラスタのインデキシングができるように1行追加。プレミアライセンスある場合はいらないとか。

```configuration:config/enterprise-search.yml
　　　　　　　　：
ent_search.auth.source: standard
elasticsearch.username: elastic
elasticsearch.password: <さっき出力されたパスワード>
allow_es_settings_modification: true # クラスタOK
```

### ③の3. Workplaceの時はencryption_keysどうしても必要なのよ
ってことでencryption_keys。256bit がいいってあるのでhex 64桁。間違ってたらごめんなさい。
opensshで作成してもいいのかな？
（参考）https://www.elastic.co/guide/en/workplace-search/current/encryption-keys.html#encryption-keys
初期ファイルだとこんな感じ。

```configuration:config/enterprise-search.yml
# ---------------------------------- Secrets ----------------------------------
#
# Encryption keys to protect your application secrets. This field is required.
#
secret_management.encryption_keys: []
#
```

```shell:bash 
$ echo "secret_management.encryption_keys: [" \ 
  `openssl rand -hex 64`", "`openssl rand -hex 64`"]" >> config/enterprise-search.yml
```
### 3の④Enterprise Searchを起動
で、規定のパスワード設定しつつenterpriseの方を起動する。

```shell:bash 
$ ENT_SEARCH_DEFAULT_PASSWORD=passwordexample  bin/enterprise-search
```

### 3の⑤アクセス確認
もいっこshell起動してcurlで確認

```shell:bash 
$ curl -L http://localhost:3002/ 
<!DOCTYPE html5><head><title>Elastic Enterprise Search</title>
      <link rel="icon" type="image/png" href="http://localhost:3002/enterprise-search-favicon-196x196.png" sizes="196x196" />
：
```

いける。。Windows側のブラウザで確認だー！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/7421cbf9-bdc1-3a98-fd6e-e56e180853d3.png" width=80% />

OH。

# 追加設定１：Windows-Ubuntu(WSL2)間のポートフォワード
Windows側のポートを確認。

```shell:cmd.exe
$ netstat -a | findstr LISTEN
```
（出力は割愛）
Windows側は3002,9200,9300のどのポートもLISTENしていない。
## (1) WSLのlocalhostForwarding設定を試す
WSL2 にはWSL2のlocalhost設定をする設定があるらしいので設定（以下を参考に実施）。

* Qiita - [WSL2内で立ち上げたサーバにWindows側からlocalhostで接続する](https://qiita.com/snaka/items/a8eee4cfc8f7d733e6ab)

### 結果: NG
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/7421cbf9-bdc1-3a98-fd6e-e56e180853d3.png" width=80% border=10/>

OH。Docker上に構築したときはできるのに。。。

## (2) netsh.exeのportproxy設定で試す。
リバースプロキシも考えたけどこっちのほうが気軽そうなので。参考にしたのはこちら。sshだけれども。

- Qiita - [wsl2でsshサーバを起動し、外部からそこに接続](https://qiita.com/yabeenico/items/15532c703974dc40a7f5)

Windowsのcmd.exdを起動して、Windowsにくる3002,9200,9300をportproxy。

```shell:cmd.exe 
$ netsh.exe interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3002 \
connectaddress=<Ubuntuのアドレス> connectport=3002
$ netsh.exe interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=9200 \
connectaddress=<Ubuntuのアドレス> connectport=9200
$ netsh.exe interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=9300 \
connectaddress=<Ubuntuのアドレス> connectport=9300
$ netsh.exe interface portproxy show v4tov4
```

### 結果: いけた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/c80813ad-6606-4ebc-a88f-aaa854facbce.png)

# 追加設定２：Elasticをdevelopmentモードで公開する。
せっかくなので外部からもアクセスできるようにしようということで、Elasticの方の設定も変更します。
## Elasticsearch 公開ホスト、ポートを設定

外部に公開する場合はelasticsearch.ymlの"network.host"に設定するのですが、そうするとdeveploment mode からproduction modeになってしまい、シングルノードではだめだよ、とかhttps使ってよとか起動時にチェックが入って起動できません。

* Elatic - [Bootstrap Checks](https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html)

production modeではなく、development mode起動させるには、elasticsearch.ymlに次の項目を設定します。

```shell:bash
$ cd ~/elasticsearch-7.9.1
$ vi ./config/elasticsearch.yml
```

```configuration:config/elasticsearch.yml
http.host: <Ubuntuのアドレス>
transport.host: <Ubuntuのアドレス>
discovery.type: single-node
```
また、合わせてenterprse-search.ymlのそれらしき設定を編集します。

```shell:bash
$ cd ~/enterprise-search-7.9.1
$ vi ./config/enterprise-search.yml
```

```configuration:config/enterprise-search.yml
elasticsearch.host: http://<Ubuntuのアドレス>:9200
ent_search.external_url: http://<Ubuntuのアドレス>:3002
ent_search.listen_host: <Ubuntuのアドレス>
ent_search.listen_port: 3002

```
## Windowsのブラウザで表示
localhostかWindowsのIPアドレスを使って3002にアクセスすると表示されます。  

- uid : enterprise_search
- pwd : 起動時に指定したパスワード(ex. passwordexample)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695006/daeb83dd-1abc-929c-c986-a88420485f0d.png" width=80% />
できた。

# おわりに。
WSL1に比べてできることが増えたWSL2。頑張って勉強しつつ活用してみます。
Elastic Workplace SearchのBASICライセンスでの公開は、実稼働の前に試す良いチャンス。
次は、EWSへのインデックス登録と使い勝手チェックでも書こうかな。

## 参考文献

- Elastic | [Download Elastic Enterprise Search](https://www.elastic.co/jp/downloads/enterprise-search)
- Microsoft - [Windows 10 用 Windows Subsystem for Linux のインストール ガイド](
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)
- Qiita - [WSL2入れてみた](https://qiita.com/TsuyoshiUshio@github/items/947301bd9317610572fc)
- Qiita - [(今はまだ)WSL1にUbuntu 20.04を入れるな](https://qiita.com/AumyF/items/eaf42dd3345a2285ff9e)


## 商標など
- Elasticsearchは米国および他の国々で登録されたElasticsearch B.V.の商標です。
- Windowsは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
- 記載の会社名、製品名、サービス名等はそれぞれの会社の商標または登録商標です。