Fargate + Firelensでのログ出力について考える

Fargate + ECSで動かしているバッチが終了した時に、実行結果のサマリーを通知(SNSファンアウト)したいと思ったのですが、色々と方法がありそうなので、つらつらとメモ。

前提としては、こんな感じです。

  • バッチ本体はJavaで実装。ログはLogback + SLF4Jのテンプレ構成。
  • ログの出力量が多いので、CloudWatch LogsにはDEBUGレベルのログは流したくない。
  • AWSのインフラはCDKで構築。

タスク終了時のイベント通知を利用する

一番シンプルで王道な方法は、タスク停止時のイベントアラートを利用する方法。

dev.classmethod.jp

ただ、この方法だと、終了した時に、ジョブの実行結果の詳細を含めた通知ができないんですよね…(まぁそれは別途どこかに記録してそれを利用するべき、という説もありますが…)

アプリケーションのログを利用する

ということで、次の選択肢として、アプリケーションログを拾って通知する方法を考えます。

ログの取り扱いは、Firelensログドライバ(サイドカーコンテナ)を利用しています(これも定石どおりですね)
前述の通り、Javaで実装された場合なので、logback.xmlを修正し、Fargate上で実行されたアプリケーションのログは、標準出力に流れるようにしてあります。

その後の構成としては、 Firelens → Firehose → S3 といった流れで、S3にログが溜まります。
さて、この方法だと、ログを保存するには完全マネージドで申し分ないのですが、バッチの終了を検知して通知することができません。

そこで考えられるのは、以下の方法です。

  1. Firehoseのデータ変換用Lambdaを仕込み、その中で終了ログを拾って通知する。
  2. S3のイベント通知を元にLambdaを発火させ、その中で終了ログを拾って通知する。
  3. Firelens (Fluent Bit)の設定をカスタムし、終了ログはCloudWatch Logsへ、全てのログはFirehoseへ送る。

AとBは手間がかかるのでないな、と思ったのですが、Cをやる場合も、カスタム設定ファイルを使う場合は、AWS公式のイメージだとダメで、自前でFirelens用のイメージをビルドしてあげないとならないみたいで、思ったよりは手間がかかりそう…。
というのも、Fargate 起動タイプを使用するタスクの場合、サポートされる config-file-type の値は file のみだからです。

参考記事

docs.aws.amazon.com

qiita.com

qiita.com

sioncojp.hateblo.jp