IKS のアプリログの出力単語を Logstash Pod で検知して slack に転送する

#### はじめに

IKS のPodのアプリログを手動で作成した Logstash Pod を使用して特定の単語検知してSlackに抽出したメッセージを転送する方法を確認しました。

---
#### 環境


IBM Kubernetes Service  1.24
 ・Logstash Pod

IBM Cloud File Storage

IBM Cloud Container Registry

Slack


---
#### Logstash コンテナ・イメージの作成


slack output plugin を導入したコンテナ・イメージを作成しています。

 Dockerfileの内容


```Dockerfile
FROM docker.elastic.co/logstash/logstash:8.6.2

# Slack plugin
RUN logstash-plugin install logstash-output-slack
```

Dockerfile をビルドし **"image: jp.icr.io/testspace/logstashtest:2"** というイメージ名を使用します。
(IBM Cloud 内の Container Registry に配置)



下記は IKS の deployment.yaml です。
ログファイルは永続ストレージを定義した IBM Cloud File Storage にマウントしています。

```deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: logstash-test
  labels:
    app: logstash-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: logstash-test
  template:
    metadata:
      labels:
        app: logstash-test
    spec:
      containers:
      - name: logstash-test
        image: jp.icr.io/testspace/logstashtest:2     #<= ビルドしたイメージ
        command: ["logstash", "-f", "/config/logstash.conf"]
        volumeMounts:
        - name: volume-logstash
          mountPath: /config
        - name: volume-logs
          mountPath: /logs
        env:
        - name: XPACK_MONITORING_ENABLED
          value: "false"
      volumes:
      - name: volume-logstash
        configMap:
          name: cm-logstash-test
          items:
          - key: logstash.conf
            path: logstash.conf
      - name: volume-logs
        persistentVolumeClaim:
          claimName: pvc-logstash-test
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-logstash-test
data:
  logstash.conf: |
    input {
      file {
        path => "/logs/test.log"　　　　　　　　　　　　　　　　　　　　　　　　　     #<= 検知対象ファイル
        add_field => {"errPoint" => "logstash-test"}
      }
    }

    filter {
      if [errPoint] == "logstash-test" {
        grok {
          match => { "message" => "(?<keyWord>.*(testlogstash).*)" }　　　    #<= testlogstash という単語を検知
        }
      }
    }

    output {                                                                 #<= output プラグインに slack を使用 
       slack {
          url => ["https://hooks.slack.com/services/xxxxxx/xxxxxx/xxxxxxxxxxxxxxx"]
          format => ["%{message}"]
       }  
    }

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-logstash-test
spec:
  storageClassName: pv-logstash-test
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-logstash-test
spec:
  storageClassName: pv-logstash-test
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /xxxxxxxxxxxxx_x/data01
    server: fsf-tokxxxxx-fz.service.softlayer.com
  mountOptions:
  - nfsvers=3

```
---

#### 設定

ibmcloud にログイン

```
# ibmcloud login --apikey <apikey> -r jp-tok -g default 
```

IKSクラスターに接続 (ここでは test-cluster1という名前です)

```
# ibmcloud cs cluster config --cluster test-cluster1
```

Deployment を適用

```
# kubectl apply -f deployment.yaml
deployment.apps/logstash-test created
configmap/cm-logstash-test created
persistentvolumeclaim/pvc-logstash-test created
persistentvolume/pv-logstash-test created
```




---
#### テスト出力確認

テスト方法： 別のPodから対象のファイルに対して検知単語を記入しました。


確認： Slack の検知メッセージ

<img width=20%><img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/b4968875-7011-467f-228b-1fc5aa455846.png">




Logstash の検知による Slack の通知が確認できました! 


---

#### おわりに

最初に ChatGPT に Logstash plugin の書き方を質問しながら slack output plugin など書いてみました。
回答は一見正しそうに見えましたが動きませんでした。(上記のdeployment.yaml は修正後の内容です。)
ChatGPTは参考にはなりましたが判断と修正は人間でまだ必要のようです。




以上です。