FireLensコンテナのログをCloudWatch Logsへ保存したときのログストリームの名は。

これってもしかして...入れ替わったりしないです。タスク名毎にログストリームが作成されます。
2021.08.08

ECSのタスク(コンテナ)のログ出力先を変更できるFireLens機能があります。アプリケーションコンテナのログルーティングはFireLensで起動するFluent Bitか、Fluendの機能を利用して実現しています。FireLensコンテナ自身のログはFireLensのトラブルシュート、デバッグ用にFluent Bitか、Fluentdを経由せずにCloudWatch Logsへ直接保存できます。

スケールアウト・インしてタスク(コンテナ)が増減したとき、サイドカーとして起動しているFireLensのログはCloudWatch Logsへどのように保存されているのか気になったので検証しました。

まとめ

  • ECSのタスク毎にログストリームが作成され、FireLensコンテナ毎に分かれてログが保存される
  • スケールアウトして4個タスクが起動すればCloudWatch Logsの単一のロググループ内に4個のログストリームが新規追加される

検証環境

項目 バージョン
aws-for-fluent-bit 2.19.0
Fluent Bit 1.8.3
Fargate platform 1.4.0

以下のリンクの構成にECSサービスのAuto Scaling設定を追加した検証環境を構築しました。

FireLensのログとは

FireLensコンテナ自身のログです。FireLensコンテナの起動時のログや、Fluent Bitの設定ファイルにエラーがあり、FireLensコンテナ起動できなかったときのエラーメッセージを確認できたりします。

正常起動時

エラーの時

FireLensコンテナの設定

タスク定義でFireLensコンテナのログ設定はlogDriverawslogsに指定し、直接CloudWatch Logsへログを送信します。CloudWatch Lgosのロググループ名はawslogs-group/ecs/logs/sample-dev-firelens-logrouterと指定しました。

タスク定義抜粋

      "logConfiguration": {
        "logDriver": "awslogs",
        "secretOptions": [],
        "options": {
          "awslogs-group": "/ecs/logs/sample-dev-firelens-logrouter",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "firelens"
        }
      },

このタスク定義を持つFargateのクラスター、サービスと、CloudWatch Logsを確認していきます。

FireLensのログを確認する

CloudWatch Logsのロググループはタスク定義で指定した通りの名前で作成されています。

早速ですがアプリケーションコンテナに負荷をかけてスケールアウトさせました。タスクが増えていっています。タスク単位でFireLensも起動するため、現状ですと4個のFireLensコンテナがサイドカーとして起動することになります。

ロググループの中を確認します。謎の英数字の羅列の4個のログストリーム名が作成されています。

謎の英数字の羅列はタスク名でした。タスク名ごとにログストリームが作成されています。すなわちタスク単位で個別にFireLensコンテナのログを確認できます。左側がECSの画面、右側がCloudWatchの画面です。

ログストリーム1個を開き、FireLensのログを確認します。最新のログはスケールインしてコンテナが落ちる前までのログが保存されていました。。Fluent Bitの設定ファイルでGrace 30の設定により30秒待機してから停止していることが確認できます。

FireLensで起動するFluent Bitに以下の設定を追加しています。

extra.conf

[SERVICE]
    Flush 1
    Grace 30

[FILTER]
    Name grep
    Match webapp-firelens*
    Exclude log ^(?=.*ELB-HealthChecker\/2\.0).*$

[OUTPUT]
    Name   cloudwatch_logs
    Match webapp-firelens*
    region ap-northeast-1
    log_group_name /ecs/logs/sample-dev/application
    log_stream_name webapp
    auto_create_group true

スケールインしてタスク(FireLensコンテナ)が終了しても、CloudWatch Logへログを保存しているため後からでもログを確認できました。

おわりに

タスク定義でawslogsと、ロググループ名の指定しかしていません。よしなにログストリーム名には自動的にタスク名をつけて作成し、FireLensのコンテナ個別にログ分けて保存してくれていました。

CloudWatch Logsへログを送る(PutLogsEvents)の送信数のクォータはログストリーム単位です。単一のログストリームに大量にログ送信が発生すると制限に引っかかる可能性もあるため、個別のログストリームが作成される方が理にかなっているのかもしれません。