sakutarou’s blog

とりあえずWeb系技術をゆるく書いていく

WSL2で使用するメモリを制限する

初期設定の状態でWSL2でOSを立ち上げると、ある分全てメモリを食いつくしていきます。 自分の備忘録として残しておく

ファイル

%USERPROFILE%\.wslconfig このファイル修正する
ファイルがない場合は新規作成

[wsl2]
memory=2GB  # 最大メモリ数を指定(この指定だと全OSで2GB)

WSL2のCentOSでもsystemdを利用する

kozo.hatenablog.jp

WSL2でCentOSを使えるようになったけど、 systemd が全く使えません。
こんなエラーが出る。。。

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

調べてみるとIssueで議論されているみたいですね。

github.com

systemdが使えるようになるとしても、もう少し時間がかかりそうです。
その間は、genie で逃げておきましょう。

github.com

genieのインストール

genieをmakeしてインストールします。

.NET Core SDKのインストール

makeするのに、.NET Coreが必要になるのでインストールします。

docs.microsoft.com

genieをclone

git clone git@github.com:arkane-systems/genie.git

makeの事前準備

yum install -y daemonize

mkdir /usr/local/lib/genie
mkdir -p /usr/local/lib/systemd/system-environment-generators

make

make install

シンボリックの設定

genie を実行すると /lib/genie を見に行きます。
バグかな?
とりあえず、シンボリックで対応

ln -s /usr/local/lib/genie /lib/genie

genieの実行

これで、とりあえずsystemd関連が動きます。
公式で対応されるのを待ちましょう。

genie -c bash

WSL2でCentOS(CentOS7, CentOS8)を使う

WSL2Ubuntuでもいいですけど、CentOSも使いたいですよね
ただ、Microsoft StoreでCentOSを探すとなぜか有料だし、公式ですらありません。。。
絶対使いたくないですね。。。

GitHub上でWSL用のCentOSを公開している人がいるのでこれを利用します。

github.com

ダウンロード

リリースページより、CentOS7, CentOS8希望のOSをダウンロードして解凍します。
https://github.com/yuk7/CentWSL/releases

配置

OSの配置場所は以下になります。
以下フォルダを開いて、CentOSを配置するフォルダを作成して、解凍したフォルダの中身を入れます。

%userprofile%\AppData\Local\Packages

フォルダ作成

f:id:sakutarou:20200506195340p:plain

ファイル配置後

f:id:sakutarou:20200506195613p:plain

インストール

配置した CentOS7.exePowerShellから実行します。
これでおしまい
※実行するファイル名を登録する場合の名前に利用するので、同一OSを複数インストールする場合は、ファイル名を変更する

f:id:sakutarou:20200506200052p:plain

インストール後は .\CentOS7.exe を実行なり、Windows Terminal から起動するなりしてください。

アンインストール

OS自体を削除したい場合は、以下をPowerShellで実行する。

.\CentOS7.exe clean

注意点

現状WSLではsystemdが動作しないので、以下で動くようにする必要があります。

kozo.hatenablog.jp

filebeatで準備されてるダッシュボードを利用する

filebeatにはモジュールで利用可能なダッシュボードが準備されている

利用するモジュールを有効化する

利用可能なモジュール一覧

filebeat modules list

モジュール有効化

filebeat modules enable apache2

設定ファイルはこんな感じ

filebeat.modules:
- module: apache2
  access:
    enabled: true
    var.paths: ["/var/log/httpd/access_log*"]
  error:
    enabled: true
    var.paths: ["/var/log/httpd/error_log*"]

ダッシュボードなどの有効化

filebeat setup -e

ダッシュボードなどの有効化(logstashを利用している場合)

logstashを利用している場合はlogstashを一時的に無効化する必要があります。

filebeat setup -E setup.kibana.host=172.17.0.3:5601 -E output.elasticsearch.hosts=['172.17.0.2:9200'] -E output.logstash.enabled=false

これで、 こんな感じの VisualizeDashboard がドバっと使える状態になります

f:id:sakutarou:20180930153127p:plain

Grokのdebug方法(Logstash)

Grok DebuggerがkibanaにあるのでGrokの正規表現を作るときに利用しましょう

f:id:sakutarou:20180920225730p:plain

  1. Sample Dataに入力したデータを書いて
  2. Grok Patternに正規表現を書いて
  3. Simulateを押す!
  4. Structured Dataに結果が出力される!

Logstashを試してみる(Docker)

今回はLogstashを使ってみます。
こちらも基本的には公式を参考で問題ありません。

Elasticsearch、kibanaの起動はこちらをどうぞ

kozo.hatenablog.jp kozo.hatenablog.jp

ElasticSearch公式

www.elastic.co

とりあえずLogstash起動

イメージ取得 + イメージ名変更

docker pull docker.elastic.co/logstash/logstash:6.4.1
docker tag {取得したイメージID} logstash:6.4.1

起動

マウントしているディレクトリは、piplineの設定ファイルを配置する場所になります。

docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1

Successfully started Logstash API endpoint {:port=>9600} が表示されれば起動完了
ここまで来たら一旦止めちゃいましょう。

piplineの設定ファイル

Logstashの役割は、大枠以下になります。

  • ログファイルなどを受け付ける
  • 受け付けたデータを加工・整形などをする
  • Elasticsearchなどに受け渡す

piplineの設定ファイルを利用して、この一連の流れを設定します。

piplineサンプル

最小の設定ファイルになります。
この設定ファイルだと、「標準入力を受け付けて、受け付けてデータを標準出力に出力する」になります。

logstash.conf など適当なファイル名をつけて、 docker run 実行時にマウントするディレクトリに入れておきます。

input {
    stdin {}
}

output {
    stdout {}
}

もう一度Logstash起動

/logstash が↑で作成した、pipline設定ファイルを設置する場所になります。
(※パスはどこでも構いません)

docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1

Successfully started Logstash API endpoint {:port=>9600} 先ほど同様このメッセージが出れば起動完了。
Logstashが動いてるか確認しましょう。

piplineの設定は、「標準入力を受け付けて、標準出力に出力する」になってますので、適 "hoge" とか適当に週力しましょう。 以下のようなに、 messageに入力した文字列が表示されたjsonが出力されれば正常に動いてます。

{
    "message" => "hoge",
    "@version" => "1",
    "@timestamp" => 2018-09-20T06:31:10.197Z,
    "host" => "593b6a912f8e"
}

piplineに追記

ここまで、データを受け付けて、出力する最低限が設定されてます。
次は変換を行います。

message正規表現を書いて、「入力があったデータを解析・変換を行ってデータを渡す」フィルターをを行います。

%{IPORHOST:clientip} は定義済みのIPORHOST という正規表現に一致するデータを clientip という名前をつけるという内容になります。
定義済み正規表現は以下にあります。

logstash-patterns-core/grok-patterns at master · logstash-plugins/logstash-patterns-core · GitHub

input {
    stdin {}
}

filter {
  grok {
    match => {
      "message" => '%{IPORHOST:clientip} %{GREEDYDATA:etc}'
    }
  }
}

output {
    stdout {}
}

もう一度Logstash起動

docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1

起動したらアクセスログを入力してみる

172.17.0.3 - - [19/Sep/2018:11:44:23 +0900] "GET /index.php HTTP/1.1" 200 12345

clientip etcjsonに追加されていればOKです。

{
      "@version" => "1",
    "@timestamp" => 2018-09-20T13:33:32.662Z,
       "message" => "172.17.0.3 - - [19/Sep/2018 11:44:23 +0900] \"GET /index.php HTTP/1.1\" 200 12345",
      "clientip" => "172.17.0.3",
           "etc" => "- - [19/Sep/2018 11:44:23 +0900] \"GET /index.php HTTP/1.1\" 200 12345",
          "host" => "217da2c6672f"
}

次やること

  • Filebeatを置いて、ElasticSearch、kibana、Logstashをつなげて見える化する

やっとElasticsearchのクエリーでドキュメントの検索ができた

検索のやり方を備忘録として残しておく
データにはElasticsearchのサンプルデータを利用しています。

www.elastic.co

全文検索クエリ:単語一致

単語単位で検索する場合
RDBのLIKEに近いけどあくまで単語単位での検索

例1) 住所に単語として Street が含まれるドキュメントを検索する

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : "Street"
    }
  }
}'

例2)住所に Elton 又は Street が含まれているドキュメントを検索する(※RDBでいうところのOR検索)

※半角スペースで区切ることで、複数条件での検索になる

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : "Elton Street"
    }
  }
}'

例3)住所に Elton 且つ Street が含まれているドキュメントを検索する(※RDBでいうところのAND検索)

※半角スペースで区切ることで、複数条件での検索になる ※AND検索する場合は、operatorを指定する

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : {
        "query": "Elton Street",
        "operator": "and"
      }
    }
  }
}'

例4) ヒット率での検索

最低N個以上キーワードが含まれていること といったようなRDBにない検索が可能。 minimum_should_match に含まれていてほしい 個数 OR 割合(%) が指定可能である

以下の場合は Elton Street Putnam Place Rockwell Avenue のうち2個以上含まれている結果が取得できる

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : {
        "query": "Elton Street Putnam Place Rockwell Avenue",
        "minimum_should_match": 2
      }
    }
  }
}'

Termクエリ

Termクエリ

Termクエリはkeyword型に対して検索を行う。

ドキュメント格納時
  • text型はアナライザが単語分割を行って転置インデクスを構築する
  • keyword型はドキュメントにそのまま格納される

検索

  • text型は転置インデクスを利用して検索が行われる
  • keyword型は格納されたドキュメントと検索キーワードを直接比較する

また、termクエリは格納されている文字列と完全一致するものを検索する(大文字・小文字も含めて比較する)

例)

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "term": {
      "address": "171 Putnam Avenue"
    }
  }
}'