Elasticsearch に AWX のログを連携する

#はじめに
k3sの検証環境上に[Elasticsearch](https://qiita.com/ussvgr/items/c3b1135540ba6b79098a)と[AWX](https://qiita.com/ussvgr/items/43f1d372d6b1b2693683)が揃ったので、AWXの実行ログを連携するようにしてみました。
前回同様、@sky_jokerxx氏のBlogを参考にしつつ、ES・AWXが同じKubernetesクラスタ上にある構成での設定の一例として記録を残しておきます。

参考：[Ansible Tower(AWX)のシステムログ及びジョブ実行ログを一先ずElasticsearchに取り込んで可視化する手順(備忘録)です。 | 日常系エンジニアのTech Blog](https://sky-joker.tech/2018/08/04/ansible-tower%E3%82%92elasticsearch%E3%81%AB%E5%8F%96%E3%82%8A%E8%BE%BC%E3%82%93%E3%81%A7kibana%E3%81%A7%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/)

#環境
 - k3s v0.10.0 (Kubernetes v1.16.2)
 - Elasticsearch 7.4.1
 - AWX 8.0.0

#Logstashのデプロイ
Elasticsearchにデータ連携をするため、LogstashもKubernetes上にデプロイします。

```logstash-awx.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: logstash-awx
  namespace: awx
data:
  logstash.conf: |-
    input {
        http {
            port => 5140
        }
    }
    filter {
      json {
          source => "message"
      }
    }
    output {
        elasticsearch {
            hosts => "elasticsearch-es-http.elastic"
            index => "awx"
            user => "elastic"
            password => "<Elasticsearchのパスワード>"
        }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: logstash-awx
  namespace: awx
spec:
  selector:
    matchLabels:
      app: logstash-awx
  template:
    metadata:
      labels:
        app: logstash-awx
    spec:
      containers:
      - image: docker.elastic.co/logstash/logstash-oss:7.4.1
        name: logstash-awx
        ports:
        - name: logstash
          containerPort: 5140
          protocol: TCP
        volumeMounts:
        - name: config
          mountPath: /usr/share/logstash/pipeline
          readOnly: true
        command:        
        - "/bin/sh"
        - "-c"
        - "sed -i -e 's/Xms1g/Xms256m/g' -e 's/Xmx1g/Xmx256m/g' /usr/share/logstash/config/jvm.options; logstash"
        resources:
          limits:
            memory: 0.5Gi
            cpu: "500m"
          requests:
            memory: 0.5Gi
            cpu: "500m"
      volumes:
      - name: config
        configMap:
          name: logstash-awx
          items:
          - key: logstash.conf
            path: logstash.conf
---
apiVersion: v1
kind: Service
metadata:
  name: logstash-awx
  namespace: awx
  labels:
    app: logstash-awx
spec:
  selector:
    app: logstash-awx
  ports:
  - name: logstash
    port: 5140
    targetPort: 5140
    protocol: TCP
```
LogstashのnamespaceはAWXと同じ(awx)にデプロイしています。
同一クラスタ内の別namespaceにあるServiceを宛先指定する際は、
\<Service名>.\<namespace名>
と指定すればOKです。（ConfigMap内のElasticsearchホスト指定部分）
ElasticsearchのUser/Passwordは取り敢えずデフォルトのものを指定しています。
別namespaceからはSecretを参照できないため、Passwordも直書きしてしまっています。（今後要検討）

また、ホストのリソースに余裕が無いため、リソースを削ることにしました。
（Javaヒープを上手く変える方法がなく、力業でなんとかしてます）

このYAMLファイルをデプロイして

```bash
$ kubectl apply -f logstash-awx.yaml 
configmap/logstash-awx created
deployment.apps/logstash-awx created
service/logstash-awx created
```
起動してポートがLISTENされるまで待ちます。

```bash
$ kubectl get pod -n awx
NAME                            READY   STATUS        RESTARTS   AGE
awx-postgresql-postgresql-0     1/1     Running       0          13h
awx-0                           4/4     Running       0          13h
logstash-awx-786599d98b-hswsk   1/1     Running       0          8s
$ kubectl logs -f logstash-awx-786599d98b-hswsk -n awx
〜中略〜
[2019-10-24T08:07:20,044][INFO ][logstash.inputs.http     ] Starting http input listener {:address=>"0.0.0.0:5140", :ssl=>"false"}
```
#AWXでログの出力設定
<img width="1007" alt="スクリーンショット 2019-10-24 18.10.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/3294ae04-8555-55c1-846c-dc3b97488498.png">
左メニュー下部の「設定」->「システム」をクリックしたのち上部の「ロギング」を選び、各項目に以下の値を設定します。

 - ログアグリゲーター：http://logstash-awx
 - ログアグリゲーターポート：5140
 - ログアグリゲーターのタイプ：「logstash」を選択
 - ログアグリゲーターのプロトコル：「HTTPS/HTTP」を選択

ログアグリゲーターのプロトコルはTCPでもテストは成功しますが、実際のデータ連携時にJSONのパースに失敗します。
また、HTTPS/HTTPを選んだ場合はアグリゲーターの指定に「http://」を付けないとhttpsで接続しにいき、コネクションに失敗します。

値を入力したら「テスト」をクリックし、問題なければ「保存」します。
保存後に、上部の「外部ログの有効化」をオンにしてください。

設定が完了したら、適当にジョブを動かしてみます。

#Elasticsearch(Kibana)で確認
Kibanaにログインし、Management->Elasticsearch Index Managementの欄に「awx」というインデックスが見えていればログ連携ができています。
<img width="1007" alt="スクリーンショット 2019-10-24 18.19.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/abd705e7-e3cc-a94d-54e5-fb782f99a617.png">
Kibana Index Patternsで「Create index pattern」をクリック、
「Time Filter field name」に「@timestamp」を指定して作成すればOKです。
<img width="1007" alt="スクリーンショット 2019-10-24 18.23.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/0a69c699-0c34-5b52-f9b8-1c6cf3c2dbed.png">

#終わりに
とりあえずログの連携まではできました。
あとはKibanaのDashboard（visualization）を作れれば完璧ですが、作り方がよくわからず…。