OpenSearch + Logstashをインストールして試してみた

LogstashとOpenSearchの勉強のため、インストールしてログ収集する設定をします！

## OpenSearchとは
ElasticSeach + Kibanaを統合したツール。AWSマネージドサービス。OSSみたい。
https://aws.amazon.com/jp/opensearch-service/the-elk-stack/what-is-opensearch/

要件
- postfixメールログが検索できたらいい

環境
- メールサーバ
  - postfix2.6.6
  - CentOS6.8
- Logstash8.2.2 + Opensearch1.2 構成でログ収集を実現する


filebeatを使ってみたが、filebeatは正規表現が不必要な場合に向いているみたい。今回は正規表現を使っているためなし。

## OpenSearch ドメイン作成
[Dashboard](https://ap-northeast-1.console.aws.amazon.com/esv3/home?region=ap-northeast-1#opensearch/dashboard)よりドメイン作成
GUIでポチポチすすめる
VPC作ると手間なのでIP制限のみで試します。
VPC作る場合は、VPCとSecurityGroupとIAMを設定してあげてください。

- VPCは作らない。
- マスターアカウントのみ作成
  -  user: `user`
  - password: `password`
- きめ細やかなアクセスコントロールで必要なIPの許可設定をする


## Logstash 

### メールサーバにLogstashをインストールして起動する

リポジトリの追加してインストール

```sh
$ cat /etc/redhat-release
CentOS release 6.8 (Final)
$ cat > /etc/yum.repos.d/elasticsearch.repo <<EOF
[elasticsearch-8.x]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
$ yum install -y --disablerepo=base,extras,updates logstash
```

confファイルを作成する。
今回は`maillog`なので、メールログの正規表現でマッチするように後述のデバッカーでデバッグしながら次のような設定にした。
outputには`opensearch`を指定し、先ほど作成したドメイン情報を入力する。

```sh
$ vim /etc/logstash/conf.d/mail.conf
```

```/etc/logstash/conf.d/mail.conf
input {
    file {
        mode => "tail"
        path => ["/var/log/maillog"]
        sincedb_path => "/var/log/logstash/sincedb"
        start_position => "beginning"
        codec => plain {
            charset => "UTF-8"
        }
    }
}

filter {
  grok {
    match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{DATA:hostname} %{DATA:process}: %{DATA:queueid}: %{GREEDYDATA:message}" }
    overwrite => "message"
  }
}

output {
      opensearch  {
        hosts => ["https://***.ap-northeast-1.es.amazonaws.com:443"]
        index => "maillog-%{+YYYY.MM.dd}"
        user => "master"
        password => "password"
        ecs_compatibility => disabled
        ssl => true
        ssl_certificate_verification => true
    }
}
```


sudoで実行しない場合はlogstashユーザで対象ログへの読み込みと必要ファイルの書き込み権限を付与する必要がある。
そのまま実行するとフォアグラウンド実行になるので、`&`をつけてバックグランド実行する。
その後デーモン化する(この設定のままではPC再起動で起動しなくなるが、再起動しないので保留)

```sh
$ /usr/share/logstash/bin/logstash-plugin install logstash-output-opensearch #outputでopensearchを使えるように
$ chown logstash -R /etc/logstash/ #logstash userにかきかえとく。一応
$ chown logstash -R /var/lib/logstash/ #logstash userにかきかえとく。一応
# バックグランド実行
$ sudo /usr/share/logstash/bin/logstash --path.settings "/etc/logstash" &
$ jobs
$ disown %1 # daemon化
$ jobs
$ ps -ef | grep logstash # 起動確認
```


## デバッグ

デバッグはoutputを標準出力にして、想定の出力か確認する

```
output {
  stdout { codec => rubydebug }
}
```

上記の設定ではこんな出力になってた。

```text
{
   "event" => {
        "original" => "Jun 10 14:23:53 ik1-311-15559 postfix/smtp[6107]: E1F1060518: to=<test@example.com>, orig_to=<tetete@example.com>, relay=***:25, delay=0.66, delays=0.04/0.01/0.37/0.23, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 7D4DC2009C562C)"
    },
    "@version" => "1",
        "log" => {
        "file" => {
            "path" => "/var/log/maillog"
        }
    },
       "process" => "postfix/smtp[6107]",
       "host" => {
          "name" => "***.sakura.ne.jp"
        },
       "@timestamp" => 2022-06-10T06:17:24.534139Z,
       "message" => "to=<test@example.com>, orig_to=<tetete@example.com>, relay=***:25, delay=0.66, delays=0.04/0.01/0.37/0.23, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 7D4DC2009C562C)",
       "hostname" => "***",
       "queueid" => "E1F1060518",
       "timestamp" => "Jun 10 14:23:53"
}
```



正規表現のデバッグはgrokのパターンは公式のをみつつ

- [grok pattern](https://partners-intl.aliyun.com/help/en/log-service/latest/grok-patterns)
- [logstash-grok-guide](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html)

デバッカーでデバッグする

 - [grok debugger](https://grokdebug.herokuapp.com/)

## OpenSearch側で確認

Logstashからデータが送られているか、GUIより確認する。

1. OpenSearch -> Management-> Stack Management -> Index Patternから対象のIndexPatternを作成する(今回は`maillog-*`)
2. OpenSearch -> OpenSearchDashBoard -> Discover
3. 結果の確認

## 所感
logstashのOpenSearchプラグインをインストールするのをすっぽかしていたせいで「OSのせいか？Versionのせいか？！」とだいぶ沼ったけど、他はスムーズにいけて普通に使えました。サービス管理がめんどくさそうなのでdockerでlogstash起動したほうが楽かも
CloudWatch Logsからも簡単にデータ挿入できるみたいなので、EC2内とかならCloudWatchAgent->Logs->OpenSearchが定石なのかな?
普通のログならLogsがあれば事足りそうだけど...

あと試してないけどLogstashはメールキューファイルは取ってこれないのか気になります。

## 参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/opensearch-connect-filebeat-logstash/
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html