FireLens/fluentbit構成の見直しと改修

FireLensの記事は一旦完了したのですが、気になる部分を改修します。４回目の記事です。
修正済みのリソースをV2ブランチに反映しました。
https://github.com/antennix/firelens/tree/v2

[１回目](https://qiita.com/antennix/items/fb1b7c19ebac6c53d408) firelensを使用した、ログ分割と監視処理
[２回目](https://qiita.com/antennix/items/496cf08199253dc1e6cb) ローカルで、datadog/S3へデータを転送できるdockerイメージを作成する
[３回目](https://qiita.com/antennix/items/d6d19be67dff43ab34e8) Firelensで、datadog/S3へデータを転送できるdockerイメージを作成する

## 改修箇所
### datadogからS3にアップロードせず、全てfluentbitからS3にアップロードする
図表ではLogB,LogCはdatadogを経由し、S3へアップロードされる想定でしたが
ログアップロードの通信をAWS内で完結させようと考えました。
その為、datadogはリアルタイムアラートのみ対応し、その後ログを破棄します。

##### 以前の構成（１回目）
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_477542_77087867-4a2a-911b-2eeb-0f60bc24d2b7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477542/4be0c1de-93c3-a18a-4878-b1e01b6493ef.jpeg)


##### 今回
![開発構成図-Copy of fluentbit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477542/cd0d3e38-e208-919c-9751-554e8d4c542c.png)


### webコンテナのログ出力をJSON形式→文字列に戻す
必ずしもJSONでログを出力する必要は無く、通常の文字列の出力に戻すことにしました。
より疎結合で良いかと思います。

三種類のログをfluentbitで受け取る部分は同じですが、分類方法を見直します。

```
1. LogA（アクセスログ）:stdoutのもの
2. LogB（エラーログ）:stderrのもの
3. LogC（アプリケーションログ）:stdout/stderrに関わらず、ログの先頭に「application」の識別子が付与されているもの
```


#### fluent-bitのstream-processor見直し
stream-processorも再設計します。
この処理の流れは一見分かりにくく、フローを図にしました。概ね下記の様な流れになると認識しています。
![stream-processor (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477542/e802252a-4c9b-e1f3-0939-50ce1770879c.png)

#### docker-composeで付与タグの定義
前回の構成では、webコンテナから標準出力されたログにTagが付与されていない状態でした。
FireLensの挙動に合わせ、docker-composeレベルでTagを定義し、ログの照合に使用します。

```yml:docker-compose.yml
    logging:
      driver: fluentd    
      options:
        tag: "service-firelens-xxx"
        fluentd-address: "localhost:24224"
        fluentd-async-connect: "true"
```


#### ログのプロセス
以上の処理の結果、ログが下記のように出力されます。
書式がこんな感じで変わるというイメージだけ掴んで頂ければと思います。

##### LogA

```:web-container-out
172.23.0.1 - - [16/Dec/2019:15:44:49 +0000] GET / HTTP/1.1 200 23578 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 8956
```

```:fluentbit-continer-in
[0] xxx-firelens-xxx: [1576511089.000000000, {"source"=>"stdout", "log"=>"172.23.0.1 - - [16/Dec/2019:15:44:49 +0000] GET / HTTP/1.1 200 23578 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 8956", "container_id"=>"a8b309523a4352f95164b67ab0b19cfd9104b76e51cab930a8ac7060d8707c41", "container_name"=>"/firelens_web_1"}]
```

```:fluentbit-continer-out
[0] access: [1576511781.000000000, {"source"=>"stdout", "message"=>"172.23.0.1 - - [16/Dec/2019:15:56:21 +0000] GET /?exception HTTP/1.1 200 - - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 2209", "container_id"=>"b6fcbeebca39a0b06822f7b16df1de80cd1245521392354fe48b2f915a421834", "container_name"=>"/firelens_web_1", "service"=>"access"}]
```

##### LogB

```:web-container-out
exception
```

```:fluentbit-continer-in
[0] xxx-firelens-xxx: [1576511122.000000000, {"container_id"=>"a8b309523a4352f95164b67ab0b19cfd9104b76e51cab930a8ac7060d8707c41", "container_name"=>"/firelens_web_1", "source"=>"stderr", "log"=>"exception"}]
```
```:fluentbit-continer-out
[0] error: [1576511781.000000000, {"source"=>"stderr", "message"=>"exception", "container_id"=>"b6fcbeebca39a0b06822f7b16df1de80cd1245521392354fe48b2f915a421834", "container_name"=>"/firelens_web_1", "service"=>"error"}]
```

#### LogC

```:web-container-out
application error error-text
```
```:fluentbit-continer-in
[1] xxx-firelens-xxx: [1576511198.000000000, {"log"=>"application error error-text", "container_id"=>"a8b309523a4352f95164b67ab0b19cfd9104b76e51cab930a8ac7060d8707c41", "container_name"=>"/firelens_web_1", "source"=>"stderr"}]
```
```:fluentbit-continer-out
[0] application: [1576511737.000000000, {"status"=>"error", "message"=>"error-text", "source"=>"stderr", "container_id"=>"b6fcbeebca39a0b06822f7b16df1de80cd1245521392354fe48b2f915a421834", "container_name"=>"/firelens_web_1", "service"=>"application"}]
```

## その他改修
fluentbitのS３アップロードプラグインのバージョンアップに伴い
追加の修正を行いました。
S3 Prefixのバグや、複数箇所へのS3のアップロードに対応できているようです。

## まとめ
当初理解が不足していた部分を補完し、反映できました。
宜しくお願いいたします。