Cloud Watch Logs × fluentd × Docker でログの一元管理

概要

AWS の Cloud Watch Logs を使って、EC2上に起動しているDockerコンテナのLogを確認する際、これまでLocalからSSH接続してviで確認していました。
このLog確認の手間を削減するため、DockerコンテナのLogを一元管理できる設定を試してみたので、備忘として投稿します。

実現したいこと

EC2上に起動しているDockerコンテナのLogをCloud Watch Logsに転送してAWS Consoleから各コンテナのLogを管理できるようにします。

技術調査

コンテナからLogをCloud Watch Logs に転送するため、Logging Collectorを使用することにしました。Logging Collectorの候補として次の2つを検討しました
・fluentd
・awslogs
設定の手軽さから awslogs の使用も魅力的だったのですが、awslogsはAmazon Linux向けに開発されたもののようです。
今回の検証は、ubuntuを使います。awslogsをubuntuで使用する場合にはpythonのプログラムを動かさないといけないとの記事を見つけたので断念しました。
今回の実装では fluentd を採用します。

実装概要

実現する内容としては、以下の画像のようなイメージです。
f:id:Junya_Start-upEngineer:20210228010840p:plain fluentdのコンテナを立て、Log収集対象のコンテナからfluentdのコンテナにログを転送します。
fluentdコンテナはLogを受信したらCloud Watch LogsにLogを転送します。

実装内容

github にfluentdコンテナのDockerファイルを作成しております。
github.com

同じ設定を試してみたい場合は、是非ご参考にしてみてください。
また、修正事項などりましたら、ご指摘いただけますと嬉しいです。

また、Log収集対象のコンテナはdocker-compose.ymlにloggingを追加する必要があります。
tag に設定している値でfuluentdは、どこのコンテナからログが送られてきたか判別します。

    logging:
      driver: "fluentd"
      options:
        fluentd-address: "localhost:24224"
        tag: "backend.log"