Firelensで、fluentbitからdatadog/S3へデータを転送できるdockerイメージを作成する

Firelens構築記事の3回目となります。

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

githubのサンプルはfirelensとの連携まで完成しており、文章中の解説はサンプルベースで行います。

[サンプル(Github)](https://github.com/antennix/firelens)

## Firelensで動くサンプルの作成
前回、ローカル環境でfluentbitコンテナを構築し、カスタム構成ファイルの調整を行いました。

今回は、作成したカスタム構成ファイルをベースに
Firelens用のfluentbitカスタムイメージを作成し、
Amazon ECS上での動作を確認します。

### Firelens用のfluentbitカスタムイメージを作成する

docker-composeの、firelens-fluentbitコンテナ部分の解説となります。
#### docker-compose
```docker-compose:/docker-compose.yml
  firelens-fluentbit:  
    build:
      context: firelens-fluentbit
    image: *****/firelens:firelens-fluentbit
``` 

#### dockerfile
ローカル環境では、fluentbitはオリジナルのイメージを使用しましたが
fireLens用のfluentbitイメージは、awsの提供イメージからカスタムします。
その他は同じです。
https://hub.docker.com/r/amazon/aws-for-fluent-bit

```dockerfile:/firelens/firelens-fluentbit/dockerfile
FROM amazon/aws-for-fluent-bit:1.3.2
ENV TZ='Asia/Tokyo'
・・・
```

#### fluentbitカスタム構成ファイル

ドキュメントを元に、FIreLens用の修正を加えます
https://docs.aws.amazon.com/en_us/AmazonECS/latest/userguide/using_firelens.html


#### ローカルのカスタム構成ファイルとの相違点

##### fluent-bit.confには、INPUTセクションは記述しない
当該セクションはFireLensにより上書きされるので、記述しません。

```:document
In your custom configuration file, for tasks using the bridge or awsvpc network mode, you should not set a Fluentd or Fluent Bit forward input over TCP because FireLens will add it to the input configuration.
```
INPUTされたデータへのタグ定義も記述出来ませんが、
FireLensよりINPUT時のタグが指定されるため
stream-processorでワイルドカードを２つ使用して、Firelensタグを検出します。


```:stream-processor.conf
[STREAM_TASK]
    Name   access
    Exec   CREATE STREAM access WITH (tag='access') AS SELECT * from TAG:'*-firelens-*' WHERE service = 'access.log';
```

その他は、ローカルのfluentbitと同じように
S3の出力プラグインをマルチステージビルドにより生成し
各種カスタム構成ファイルを含めたdockerイメージを生成します。
作成したイメージはECRにPUSHし、呼び出せるようにします。
Firelens用fluentbitイメージの生成は以上です。


### Amazon ECSの設定

作成したアプリケーションコンテナとFirelens用fluentbitコンテナで
Amazon ECS（Fargate起動タイプ）を構築します。

#### タスク定義

類似の記事は多いので、行うべき内容だけまとめます。
1. アプリケーションコンテナと、fluentbitコンテナを定義する
2. アプリケーションコンテナのログドライバをfluentbitにする
3. fluentbitコンテナのログドライバをcloudwatchにする
4. fluentbitコンテナで、カスタム構成ファイルの指定を宣言する
その他
5. コンテナに注入する環境変数（Credential情報等）を定義する

##### 1.アプリケーションコンテナと、fluentbitコンテナを定義する
Log Router Integrationの項目が追加され、使用するfluentbitイメージの選択が可能です。
但し、詳細な設定項目は無く、結局JSONベースで設定を行う必要があります。
![スクリーンショット 2019-11-23 23.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477542/ad064737-8c2a-d4ee-538f-a18bd1e3871b.png)



##### 2.アプリケーションコンテナのログドライバをfluentbitにする

```
 "logConfiguration": {
    "logDriver": "awsfirelens",
    "secretOptions": null,
    "options": null
  },
```


##### 3.fluentbitコンテナのログドライバをcloudwatchにする

```
"logConfiguration": {
    "logDriver": "awslogs",
    "secretOptions": null,
    "options": {
        "awslogs-group": "/ecs/first-run-task-definition",
        "awslogs-region": "ap-northeast-1",
        "awslogs-stream-prefix": "firelens"
    }
},
```


##### 4.fluentbitコンテナで、カスタム構成の指定を宣言する

fluent_bit_custom.confの使用をJSONで記述します。
fluentbitイメージに内包しているカスタム構成ファイルのパスを指定します。

https://docs.aws.amazon.com/en_us/AmazonECS/latest/userguide/using_firelens.html
**Specifying a Custom Configuration File**

```
    "firelensConfiguration": {
        "type": "fluentbit",
        "options": {
            "config-file-type": "file",
            "enable-ecs-log-metadata": "true",
            "config-file-value": "/fluent-bit/etc/fluent_bit_custom.conf"
        }
    },
```

##### 5.コンテナに注入する環境変数（Credential情報等）を定義する
余談ですが、環境とfluentbitコンテナの依存度を低くするため
コンテナの環境変数として、各種Credentialを指定します。
必要に応じ、KMS等で暗号化を施してください。

### クラスタ定義
Fargate起動タイプで作成します。

### クラスタより、タスク実行
ここも細かい指定は無いですが、動作確認の為
・セキュリティグループで８０ポートのインバウンドを許可
・パブリックIPを使用する
等、PHPにアクセスができるよう調整します。

## サンプルの実行
実行すると、作成したfagateタスクにパブリックIPが付与されるので
アクセスすると、ローカルと同様に、datadog,s3への疎通が確認できます。
（第二回と同様の内容なので、キャプチャは割愛します）


## まとめ
「fargateとFirelensを組み合わせ、複数のログを複数の場所に出力する」
というポイントで、三回の内容でお送りしました。
現状のFirelensの仕様やドキュメントの内容では、細かいログ管理を行いたい時に中々手間が掛かるなと思い、試行錯誤の結果をまとめた次第です。
もう少し内容の整備が進むと良いと思いました。

基本はこれで終わりですが
fuentbitのカスタム構成ファイルのチューニングで、スマートな構築が出来そうだった為
追加でもう一度記事を書いて、今回の内容は終わりにしたいと思います。