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


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

1回目 firelensを使用した、ログ分割と監視処理
2回目 ローカルで、fluentbitからdatadog/S3へデータを転送できるdockerイメージを作成する

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

サンプル(Github)

Firelensで動くサンプルの作成

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

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

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

docker-composeの、firelens-fluentbitコンテナ部分の解説となります。

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

/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でワイルドカードを2つ使用して、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ベースで設定を行う必要があります。

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起動タイプで作成します。

クラスタより、タスク実行

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

サンプルの実行

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

まとめ

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

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