単一のFargateから、FireLensを使ってCloudWatch Logs(以下CWL)、Kinesis Data Firehose(以下KFH)、Amazon Elasticsearch Service(以下AES)に三つ股ログ出力する方法について。
やりたいこと
- FargateタスクからFireLensを介して複数ターゲットにログをルーティングする。
アプリコンテナ(ログ設定をawsfirelensに指定)→FireLens
→CWL
→KFH
→AES
事前準備
まずはテスト用にFireLens行き設定を含むアプリコンテナと、FireLensコンテナを準備する。
FireLensはいわゆるサイドカー(同じタスク定義内での別のコンテナ)として用意する。
タスク定義にFireLens統合のセクションがあるので、こちらを参考に作成。今回は、以前作成したタスク定義(myFargateSvc)に新しいリビジョンを追加する形で行う。それにしても、ECSをマネジメントコンソールから操作しようとするとコマンドラインよりむしろ辛い気がするのは何故なのか。
どうやら、アプリコンテナ側に明示的にawsfirelensログドライバーを指定してあげないとだめらしい。やってよそれぐらい。
このあと、当該サービスでタスクのリビジョンを新たに作成したものに置き換えれば、下準備は完了。
Step by Step
アプリコンテナからFireLensに吐き出す準備ができたので、以下、三つ股ログ設定のStep by Step。
1. CWL
まずはCWLに吐き出すところから。
これだけだと、別にFireLensを介在させる必要はなくてawslogsドライバーで事足りるわけだが、何はともあれ、FireLens(fluentbit)がちゃんと動くことを確認しなくては始まらない。
一応整理しておくと、以下のようになる。
構成 | ログドライバー | 経路 |
---|---|---|
いつもの構成 | awslogs | アプリコンテナ→awslogs→CWL |
今回の構成 | awsfirelens | アプリコンテナ→awsfirelens→FireLensコンテナ(fluentbit)→awslogs→CWL |
と、ここまで書いたところで(エラーもあって)やや力尽きたので、続きは改めて。
同日 2:10am 追記:
FireLensコンテナ(log_router)は、デフォルトだとそれ自身のターゲットが指定されていないため、このままだとタスク更新時にエラーになることが判明。
タスクのリビジョン追加時に、log_routerコンテナの設定に移動してAuto Config CloudWatch Logs
にチェックを入れ(またはCWL設定を手入力し)、FireLensコンテナ自身のロググループを構成して初めて、正常にサービスが更新可能になる模様。やってよそれくらい。
また、アプリコンテナ側も、手なりでawsfirelens設定をするとName
というキーがバリューなしで設定されてしまい、CWLにログこそ吐き出されるようになるものの以下のような残念なメッセージでサービス起動が失敗する羽目になるので注意。
8/12追記:
少々わかりにくいところだが、FireLensコンテナに入れるawslogs
(CWL出力)設定は、あくまでFireLensコンテナ上のfluent-bitが自身のシステムログを吐き出すための設定で、本題であるアプリコンテナのログ出力先とは違う。それはアプリコンテナのawsfirelens
設定で書くわけだが、書いた結果が最終的にFireLensコンテナ上のfluent-bit.confに反映されてアプリコンテナのログルーティングに使われる、という関係性になる。
というわけで、アプリコンテナ側のログ設定にキー/バリューの形でCWL設定を入れていけば「アプリコンテナからFireLens経由でCWL」というここでの目的が達せられるのだが、詳細は次回。