Firelens構築記事の3回目となります。
1回目 firelensを使用した、ログ分割と監視処理
2回目 ローカルで、fluentbitからdatadog/S3へデータを転送できるdockerイメージを作成する
githubのサンプルはfirelensとの連携まで完成しており、文章中の解説はサンプルベースで行います。
Firelensで動くサンプルの作成
前回、ローカル環境でfluentbitコンテナを構築し、カスタム構成ファイルの調整を行いました。
今回は、作成したカスタム構成ファイルをベースに
Firelens用のfluentbitカスタムイメージを作成し、
Amazon ECS上での動作を確認します。
Firelens用のfluentbitカスタムイメージを作成する
docker-composeの、firelens-fluentbitコンテナ部分の解説となります。
docker-compose
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
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により上書きされるので、記述しません。
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_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起動タイプ)を構築します。
タスク定義
類似の記事は多いので、行うべき内容だけまとめます。
- アプリケーションコンテナと、fluentbitコンテナを定義する
- アプリケーションコンテナのログドライバをfluentbitにする
- fluentbitコンテナのログドライバをcloudwatchにする
- fluentbitコンテナで、カスタム構成ファイルの指定を宣言する
その他 - コンテナに注入する環境変数(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のカスタム構成ファイルのチューニングで、スマートな構築が出来そうだった為
追加でもう一度記事を書いて、今回の内容は終わりにしたいと思います。