前書き
次の様な取り組みを行いました。
- Firelens検証環境をAWSへ構築
- 1で構築した環境上にFirelens設定を追加
- 実際にログが出力されるのを確認
本記事では、まずFirelensについて簡単に説明し、その後今回の取り組みについて、解説します。
Firelensについて
Firelensとは?
詳解 FireLens – Amazon ECS タスクで高度なログルーティングを実現する機能を深く知る
Amazon ECS は FireLens によるカスタムログルーティングのサポートを発表しました。FireLens によって、人気の高いオープンソースのロギングプロジェクトである Fluentd や Fluent Bit を簡単に使用することができ、さまざまな AWS サービスやパートナーの宛先にログを送信することができます。
要するに、firelensは、fluentd、fluent bitをECSタスクで使いやすくしたものです。
FireLens の内部構造
タスクの中で、firelensのログドライバーを設定したApplicationコンテナ(例えば、ブログサイトが立ち上がっているWebサーバー)とFirelensコンテナを起動していておき、ApplicationのログをFirelensで受け取って、Cloudwatchなりにログを出力するという方式になっています。
今回の取り組み
Firelens検証環境構築
検証環境の概略図です。タスクとして、web、php、firelensコンテナを立ています。
- ALB経由でwebサーバーへアクセス
- webサーバーが提供する画面からログを出力するボタンをクリック
- バックエンドのphpサーバーがログを出力
- phpサーバーのログをfirelensが受け取る
- firelensがcloudwatchへログを出力する
となっています。
タスク定義
以下が、タスク定義となります。
[
{
"name": "web",
"image": "<Webサーバーイメージ>",
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-region": "<Myリージョン>",
"awslogs-stream-prefix": "web",
"awslogs-group": "<webサーバー用のCloudwatchグループ>"
}
},
"portMappings": [
{
"protocol": "tcp",
"containerPort": 80
}
]
},
{
"name": "php",
"image": "<phpサーバーイメージ>",
"essential": true,
"logConfiguration": {
"logDriver": "awsfirelens",
"secretOptions": null,
"options": null
},
"portMappings": [
{
"protocol": "tcp",
"containerPort": 9000
}
]
},
{
"name": "firelens",
"image": "<Firelensイメージ>",
"essential": true,
"firelensConfiguration": {
"type": "fluentbit"
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-region": "<Myリージョン>",
"awslogs-stream-prefix": "firelens",
"awslogs-group": "<Firelensサーバー用のCloudwatchグループ>"
}
},
"environment": [
{
"name": "aws_fluent_bit_init_s3_1",
"value": "<設定設置s3バケット>/filter.conf"
},
{
"name": "aws_fluent_bit_init_s3_2",
"value": "<設定設置s3バケット>/output.conf"
}
]
}
]
次の2点に注目してもらいたいです。
- phpのlogConfiguration
"logDriver": "awsfirelens"
としています。これにより、phpサーバーにfirelensのログドライバーを設定します。 - firelensのenvironment
environmentにおいて、実際のロギングのためのfirelensの設定の設置箇所を指定しています。今回は、firelensのinitイメージを使用しています。このイメージを用いると、設定をs3バケット経由で指定することができ、独自の設定を組み込むためにカスタムイメージをビルドし直すということをしなくても良くなります。
firelens設定
fluentbitでは、ログの取り扱いのために様々な機能、プラグインが用意されていますが、今回は簡単な設定で動作確認します。
-
fileter.conf
[FILTER] Name rewrite_tag Match * Rule $log error error-log true
ログのフィルタ設定です。
上の設定は、phpから受け取ったログにタグをつけています。
具体的には、ログの中からerrorという文字列を作成し、error-log-tagというタグをつけるという意味になります。 -
output.conf
[OUTPUT] Name cloudwatch_logs Match error-log-tag region <Myリージョン> log_group_name <出力先のロググループ> log_stream_prefix <ログストリームのプレフィックス>
ログのアウトプット設定です。
Matchで合致したタグを持つログをCloudwatchへ出力しています。今回は、error-log-tagというタグを持つログを出力します。
動作確認
ログ出力画面
画面へ上のようにボタンを配置して、phpへログが出力される様にしました。
たくさんボタンがありますが、ログレベル検証用なので、とにかくボタンが押されるんだなと思ってもらえればいいです。
cloudwatch確認
cloudwatchを確認すると、<出力先のロググループ>
へ<ログストリームのプレフィックス><タグ名>
という形式でログストリームが作成され、ログが出ることが確認できます。
fluent-bit initイメージの注意点
今回使用したinitイメージですが、MULTILINE_PARSERのセクションがs3へ配置した設定ファイルからは使用できない不具合?があります。
詳細については、git issueに書かれています。
そのため、MULTILINE_PARSERを使いたい場合は、カスタムイメージを作成すれば、暫定的に対応できます。
まとめ
今回は、firelens検証環境の構築とfirelensでログを出力するまでを行いました。
ECSを立ち上げるまでのAWSリソースさえ揃えてしまえば、firelensの設定自体はとても簡単に行えました。
あとは、どの様なログを収集したいかの検討やfluentbit自体の設定の仕方の学習が残る形になると思います。
また、今回は、設定の容易さという管理面に焦点を当てましたが、
Container Dependency 機能でオーバーライドされない限り、FireLens コンテナが最初に起動し、最後に停止することを保証します。(より正確には、FireLens コンテナは awsfirelens ログドライバーを使用する全てのコンテナのよりも前に開始し、awsfirelens ログドライバーを使用する全てのコンテナのよりも後に停止します。)
と公式のドキュメントにあり、ログ損失的に優れているという結果もあリます。